Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel工作表更新Access 2007数据库中的记录时出现问题_Excel_Ms Access 2007_Excel 2007_Vba - Fatal编程技术网

从Excel工作表更新Access 2007数据库中的记录时出现问题

从Excel工作表更新Access 2007数据库中的记录时出现问题,excel,ms-access-2007,excel-2007,vba,Excel,Ms Access 2007,Excel 2007,Vba,我的excel工作簿中有一个宏,用于更新access数据库中与电子表格相关的特定记录 如果access数据库关闭,所有这些都可以正常工作。如果数据库处于打开状态且用户正在编辑excel电子表格相关的特定记录,则会出现问题` 我收到以下错误消息: Error Number 2147467259: The database has been paced in a state by user 'ADMIN' on 'LAPTOP' that prevents it from being opened

我的excel工作簿中有一个宏,用于更新access数据库中与电子表格相关的特定记录

如果access数据库关闭,所有这些都可以正常工作。如果数据库处于打开状态且用户正在编辑excel电子表格相关的特定记录,则会出现问题` 我收到以下错误消息:

Error Number 2147467259: 
The database has been paced in a state by user 'ADMIN' on
'LAPTOP' that prevents it from being opened or locked.
我已将数据库窗体的记录锁设置为“无记录锁”,但这没有帮助

非常感谢您的任何建议或帮助

干杯 诺埃尔


在宏观方面;您是否尝试以只读方式打开连接?即使您的Access用户没有锁定记录,但他在记录上有一个“读取锁”,从而防止excel进行独占锁定。我认为,如果两个用户都只尝试只读访问,您应该可以;但是,如果其中一个正在执行读/写操作,那么它将失败

在访问表单上,您还应具有:

Me.allowaditions=真

Me.allowDeleteions=False


Me.AllowEdits=False

问题可能不在代码中。错误:

数据库已按状态调整了速度


指示数据库已以独占模式打开。您应该检查如何打开数据库。

您似乎没有将数据库分为前端和后端。如果你这样做,问题就会消失。Ctrl+S不是用来保存记录的,即Shift+Enter,它是用来保存数据库对象的,因此它似乎有将数据库置于设计或开发状态的效果

@RichO为回复欢呼。我希望两者都能读/写。Access这样做没有问题。只有当电子表格试图写入打开的记录时,问题才会出现。你是说不可能同时实现Access和Excel对同一记录的写入?我明白了。。。这是个好问题;我的直觉告诉我,你不能这样做,因为你依赖于两个独立的数据库引擎(内部访问引擎和ADO驱动程序)在记录锁定级别上进行协作。您是否考虑过改用access中的ole自动化?至少这会让所有的东西都在同一个数据库引擎下运行。。。并不是说你想听这个,但这听起来像是一个数据库后端的工作,比如sql server。最后一个想法。。。除了将rst设置为nothing之外,您还尝试过将ActiveConnection设置为nothing吗?@RichO啊,对了,这听起来可能比我想象的要困难得多。我不太明白你的评论。我在从Access编写Excel时使用此选项。我遇到的问题是从Excel到Access的通信(如果我理解错误,请道歉)。至于ActiveConnection,我相信“Set conn=Nothing”会将其设置为Nothing。呃,如果您使用的是ADO接口,那么您仍然使用Jet/ACE与数据存储进行交互。这只是一个不同的界面,但Jet/ACE引擎正在完成所有工作。它碰巧有两个实例(一个在Access中,一个在Excel中),但这只是一个多用户场景,因此没有问题。也就是说,使用ADO与此无关。我不太确定这是否是问题所在。我没有以独占模式打开数据库。当数据库打开时,您可以通过Excel文件对其进行写入。尝试使用数据库表单和excel电子表格写入同一记录时会出现问题。尝试此操作之前是否保存了所有代码和查询?这是使用ADO处理未保存的结构数据(表单、查询、代码等)时生成的标准错误。@Remou是的,我已保存所有表单代码等。。。我认为当用户在表单上输入数据并保存记录(比如使用“ctrl+S”)并保持记录打开时,就会出现问题。如果用户避免这样做,则似乎没有问题。Ctrl-S不会保存记录——它会保存表单,而这正是@Remou建议的问题。唯一的例外是,如果您使用自定义操作覆盖了Ctrl-S的默认定义。@David Yep这似乎就是问题所在。拆分数据库解决了问题我还没有拆分数据库,只是这样做了,问题就解决了。不错Remou@glinch只是好奇,为什么这不再是你接受的答案?你可能会注意到大卫在我的回答几个小时后发布了帖子。很抱歉,我犯了一个错误,这仍然是我接受的答案。
Public Sub updateAccessRecord()
On Error GoTo ProcError
Dim subFuncName As String
subFuncName = "updateAccessRecord"

Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rst As ADODB.Recordset

Dim dbName As String
Dim dbPath As String
Dim strCon As String
Dim recID As Long
Dim fieldVal As Double
Dim strSQL As String

fieldVal = Worksheets("House Claim").Cells(593, 10).Value
dbName = "claim-db.mdb"
dbPath = ThisWorkbook.Path & "\..\..\..\..\"
dbPath = dbPath & "\" & dbName

strSQL = "UPDATE tblInsClaimDet SET propSet=" & fieldVal & " WHERE ID=" & recID & ""

   Set conn = New ADODB.Connection
   With conn
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
       "Data Source=" & dbPath
       .Open
   End With
   Set cmd = New ADODB.Command
   With cmd
      .ActiveConnection = conn
      .CommandText = strSQL
   End With
   Set rst = cmd.Execute
   Set rst = Nothing
   conn.Close
   Set conn = Nothing

ExitProc:

   Exit Sub

ProcError:

   MsgBox "Error " & Err.Number & ": " & Err.Description, _
         vbCritical, "Error in procedure in " & subFuncName
   Resume ExitProc
End Sub