【问题标题】:VBA ADODB update recordsetVBA ADODB 更新记录集
【发布时间】:2014-01-26 17:19:28
【问题描述】:

我正在尝试读取工作表中两个不同选项卡的内容,并使用 ADODB 和查询技术 VBA 进行比较。

您可以在下面找到我的代码:

stCon = "Provider=Microsoft.Jet.OLEDB.4.0;" _
 & "Data Source=" & wbBook.FullName & ";" _
 & "Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;Readonly = False"";"
' MsgBox (stCon)
'here is SQL code to gather data including our calculation from two tables within the workbook
'stSQL = "SELECT [Recon_Daily_Xml_report$].RECTYPEGLEDGER, [GL_Activity_totals$].TRXNTYPE, ([Recon_Daily_Xml_report$].Amount_Abs - [GL_Activity_totals$].BILLINGAMT) as Amount_Diff ,"
'stSQL = stSQL & " ([Recon_Daily_Xml_report$].NUMOFENTRIES - [GL_Activity_totals$].NUMOFTRXNS) as Count_Diff "
'stSQL = stSQL & " FROM [Recon_Daily_Xml_report$], [GL_Activity_totals$]"
'stSQL = stSQL & " WHERE Lower([Recon_Daily_Xml_report$].RECTYPEGLEDGER) = Lower([GL_Activity_totals$].TRXNTYPE)"
'stSQL = stSQL & " ORDER BY [Recon_Daily_Xml_report$].RECTYPEGLEDGER ASC"

stSQL = "SELECT LCASE([GL_Activity_totals$].TRXNTYPE),Sum(ABS([GL_Activity_totals$].BILLINGAMT)),Sum([GL_Activity_totals$].NUMOFTRXNS) "
stSQL = stSQL & " FROM [GL_Activity_totals$] "
stSQL = stSQL & " Group By [GL_Activity_totals$].TRXNTYPE "
stSQL = stSQL & " ORDER BY [GL_Activity_totals$].TRXNTYPE ASC"


'MsgBox (stSQL)
Set cnt = New ADODB.Connection
Set rst = New ADODB.Recordset

cnt.Open stCon
'rst.Open stSQL, cnt, 1, 3
rst.Open stSQL, cnt, adOpenStatic, adLockOptimistic
'rst.Open strSQL, cnt, adOpenStatic, adLockOptimistic
With rst


    Do While Not .EOF
    If rst.Fields.Item(0).Value <> "" Then
       strString = Replace(rst.Fields.Item(0).Value, "  ", " ")

        rst.Update
        rst.Fields.Item(0) = strString

    End If
    .MoveNext
    Loop

End With

这个特定的代码给了我一个错误,提示我在读取它时无法更新我想要更新的记录集中的字段。我目前得到的错误是:

Run-time error '-2147217911 Cannot update. Database or object is read-only.

尝试使用 1,3 选项更改我打开记录集的方式,但我再次遇到相同的错误。

有人可以帮忙吗?

【问题讨论】:

    标签: excel vba recordset


    【解决方案1】:

    问题在于

    LCASE([GL_Activity_totals$].TRXNTYPE)
    

    并使用 GROUP BY。 在这种情况下,rst.Fields.Item(0) 是一个表达式,而不是一个表值。您无法更新表达式。此外,由于您使用的是 GROUP BY,因此记录集不会链接到任何特定记录以进行编辑。您可以完全在 SQL 中完成相同的任务

    cnt.Execute("UPDATE [GL_Activity_totals$] " & _
    " SET [GL_Activity_totals$].TRXNTYPE = Substitute([GL_Activity_totals$].TRXNTYPE,'  ', ' ') " & _
    " WHERE NOT [GL_Activity_totals$].TRXNTYPE IS NULL " & _
    " AND [GL_Activity_totals$].TRXNTYPE <> '';")
    

    【讨论】:

    • 感谢您的回复。无法识别 ADODB VBA 更新中的替换功能。所以替换没有完成。
    • 我是否需要进行任何其他更改才能使其正常工作?我想要的最终结果是替换记录集中的 trxntypes 字符串中的所有额外空格。
    • 再次查看您的问题后,我想知道在不使用 ADODB 的情况下打开工作表是否会更好,但无论如何我认为 Substitute 应该工作而不是 Replace,因为它是 excel
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2017-09-21
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多