在Excel 2010中。我试图在执行宏的同一工作簿上基于某些过滤器编写/更新一些单元格;为简单起见,我已将查询减少到您可以看到的内容。 此代码有效,但仅在工作簿关闭时(从另一个工作簿进行测试)。
Dim libro As Workbook
Set libro = ActiveWorkbook
esteLibro = libro.Name
Dim cnCaja As ADODB.Connection
Dim rsCaja As ADODB.Recordset
Set cnCaja = New ADODB.Connection
Set rsCaja = New ADODB.Recordset
cnCaja.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source='" & esteLibro & "';" & _
"Extended Properties='Excel 12.0;HDR=Yes;ReadOnly=False';"
Dim consCaja As String
consCaja = "Update [Base$A3:T100000] Set INVERSIONES = 1000 "
rsCaja.Open consCaja, cnCaja, adOpenStatic, adLockOptimistic
当从另一个工作簿执行时,列" INVERSIONES"将其空白单元格更改为10000;但是从同一个工作簿中我得到了错误:
' -2147217865(8004e37)' Microsoft Access数据库引擎无法 找到对象' [Base $ A3:T100000]'。确保对象存在并拼写它 名称和路径名称正确。如果''不是本地对象,请检查 您的网络连接或联系服务器管理员。
这是整个连接字符串:
Debug.Print cnCaja.ConnectionString
Provider = Microsoft.ACE.OLEDB.12.0; User ID = Admin;数据 Source = Danny_Diario.xlsm; Mode = Share Deny None; Jet OLEDB:系统 database ="&#34 ;; Jet OLEDB:Registry Path ="&#34 ;; Jet OLEDB:数据库 密码="&#34 ;; Jet OLEDB:引擎类型= 35; Jet OLEDB:数据库锁定 模式= 0; Jet OLEDB:全局部分批量操作= 2; Jet OLEDB:Global Bulk Transactions = 1; Jet OLEDB:新数据库密码="&#34 ;; Jet OLEDB:创建 系统数据库= False; Jet OLEDB:加密数据库= False;喷射 OLEDB:不要在Compact上复制Locale = False; Jet OLEDB:紧凑型无 Replica Repair = False; Jet OLEDB:SFP = False; Jet OLEDB:支持复合体 数据= FALSE; Jet OLEDB:绕过UserInfo验证= False;
并且,即使工作簿处于打开状态,对同一个表的查询也会起作用。
consCaja = "Select * from [Base$A3:T100000] Where Fecha = #" & fechaBase & "# and Empresa = ""Empresa"" and Banco = ""Banco"""
rsCaja.Open consCaja, cnCaja, adOpenForwardOnly, adLockReadOnly
Do While Not rsCaja.EOF
MsgBox (rsCaja("Empresa").Value & vbNewLine & rsCaja("Banco").Value & vbNewLine & rsCaja("INVERSIONES").Value)
rsCaja.MoveNext
Loop
最后,是否可以在工作簿打开的情况下使用ADODB更新Excel? 如果是的话,我做错了什么,或者如何解决这个问题?
答案 0 :(得分:0)
考虑对打开的工作簿的现有数据运行只读SELECT
。由于文件写入访问的各种原因,作为平面文件缓存内存应用程序的Excel可能没有像数据库这样的工具来打开应用程序并同步更新当前数据。
下面设置SELECT
查询,以便镜像当前结构,只需更改一次常量1000,并将其分配给当前列位置的 INVERSIONES 列别名。条件逻辑IIF
语句也可以轻松放在这里。或者,在新工作表中运行查询和转储结果。然后删除/存档当前工作表并保存工作簿。
Dim cnCaja As New ADODB.Connection
Dim rsCaja As New ADODB.Recordset
Dim consCaja As String
esteLibro = ActiveWorkbook.FullName
cnCaja.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source='" & esteLibro & "';" & _
"Extended Properties='Excel 12.0;HDR=Yes;';"
consCaja = "SELECT Col1, Col2, Col3, '1000' AS INVERSIONES, Col4, Col5, Col6" & _
" FROM [Base$A3:T100000]"
rsCaja.Open consCaja, cnCaja
Worksheets("Base").Range("A3").CopyFromRecordset rsCaja
rsCaja.Close: cnCaja.Close
Set rsCaja As Nothing: Set cnCaja As Nothing