使用ADODB更新Excel并打开工作簿

时间:2017-01-11 19:49:48

标签: excel vba excel-vba adodb

在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? 如果是的话,我做错了什么,或者如何解决这个问题?

1 个答案:

答案 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