2014-01-08 147 views
0

我试图读取工作表中两个不同选项卡的内容,并通过使用ADODB和查询技术VBA进行比较。VBA ADODB更新记录集

下面你可以找到我的代码:

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的选择,但我再次被得到同样的错误记录的方式。

任何人都可以帮忙吗?

回答

0

的问题是与

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 <> '';") 
+0

谢谢您的回应。替换ADODB VBA中的功能无法识别。所以替换没有完成。 – user3122285

+0

我是否需要对此进行任何其他更改才能正常工作?我想要的最终结果是替换记录集中trxntypes字符串中的所有额外空格。 – user3122285

+0

再次审查您的问题后,我想知道是否最好不使用ADODB打开工作表,但在任何情况下,我认为替代应该工作,而不是替换,因为它是优秀的 – serakfalcon