【发布时间】:2017-01-10 11:35:33
【问题描述】:
我有几个用于输入数据的 excel 文件。文件在功能上是相同的,我们每个服务中心都有一个。在表单中有一个按钮可以启动一个宏,该宏将数据转换为另一张表上的表格格式,然后上传到 Access db。
在我自己的电脑上一切正常。添加新行、更新现有行和删除现有角色。我使用了早期绑定,当我将文件移动到我们的网络驱动器时会导致问题。我设法将文件转换为后期绑定,但随后出现了其他问题。
大多数情况下,无法上传到 Access,尤其是当多个用户尝试同时做某事时。最常见的错误代码是我没有使用可更新查询或者此方法不支持向后滚动。很抱歉没有报告实际的错误代码,但我目前无法复制它们。
我的连接代码如下,它是来自不同示例的复制粘贴代码的混合。
打开连接和其他prestuff
Sub excel2access()
Const adUseClient = 3
Const adUseServer = 2
Const adLockOptimistic = 3
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Dim oConn As Object
Dim cmd As Object
Dim rs As Object
Dim r As Long
Dim criteria As String
Dim Rng As Range
Set oConn = CreateObject("ADODB.Connection")
Set cmd = CreateObject("ADODB.Command")
oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source= '" & Range("dbpath").Value & "\" & Range("dbfile").Value & "' ;"
Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockOptimistic
rs.Open "Select * from need_rows WHERE service_center = '" & Range("scenter_name").Value & "'", oConn
r = 2 ' the start row in the worksheet
Sheets("data").Select
以下位查看 Excel 工作表中的数据,并尝试从为该服务中心找到的记录集中找到匹配项。如果未找到匹配,则创建新记录,如果找到匹配,则更新旧记录。
Do While Len(Range("A" & r).Formula) > 0
With rs
criteria = Range("D" & r).Value
.Find "identifier='" & criteria & "'"
If (.EOF = True) Or (.BOF = True) Then
.AddNew ' create a new record
.Fields("service_center") = Range("scenter_name").Value
.Fields("product_id") = Range("A" & r).Value
.Fields("quantity") = Range("B" & r).Value
.Fields("use_date") = Range("C" & r).Value
.Fields("identifier") = Range("D" & r).Value
.Fields("file_type") = Range("file_type").Value
.Fields("use_type") = Range("E" & r).Value
.Fields("updated_at") = Now
.Update
Else
If .Fields("quantity") <> Range("B" & r).Value Then
.Fields("quantity") = Range("B" & r).Value
.Fields("updated_at") = Now
.Update ' stores the new record
End If
End If
.MoveFirst
End With
r = r + 1
Loop
rs.Close
Set rs = Nothing
Set oConn = Nothing
MsgBox "Confirmation message"
End Sub
编辑:基于 barrowc 的链接,我将光标类型更改为 adOpenStatic。我对几个尝试同时上传数据的用户进行了测试,一切正常。直到一位用户留在文件中并在那里编辑数据并尝试将数据上传到数据库并收到以下错误消息: https://dl.dropbox.com/u/3815482/vba_error.jpg
我又回到了我的起点。
此外,我也愿意就我的代码提供总体反馈。
我正在使用 Office 2010。
我做错了吗?感谢所有帮助。
【问题讨论】:
-
“如果 CursorLocation 属性设置为 adUseClient,则仅支持 adOpenStatic 设置” - 请参阅 msdn.microsoft.com/en-us/library/windows/desktop/…
-
这不是解决这个问题的方法,如果我没看错,所有用户都可以连接到访问文件的位置。您最好为他们开发一个前端访问应用程序,以安装哪些链接到主后端。 Access 可以创建比 Excel 更动态/更丰富的条目格式。
-
这些用于规划一年中每周的消耗品采购。我还没有找到一种方法可以在 Access 中以一种可以很好地直观了解总体情况的方式来执行此操作。
-
巴罗克,谢谢。似乎现在可以工作了。
-
添加了错误信息和更多解释。此外,删除了最后一段代码,因为这不是这里的主要问题。