如何在VBA中对关闭工作簿记录集内的单元格求和并写入指定单元格
从关闭工作簿提取数据并求和的VBA解决方案
下面给你两种实现需求的方法,不用纠结DSUM,直接用SQL或者VBA累加就能搞定:
方法一:用SQL直接求和(推荐,效率更高)
既然已经用了ADODB连接,直接在SQL语句里计算总和,不用把12条数据都读出来,一步到位得到结果:
Option Explicit Sub DataIzZatvorenogFila() Dim con As ADODB.Connection Dim rst As ADODB.Recordset Set con = New ADODB.Connection Set rst = New ADODB.Recordset con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source= W:\Materijalno\MG i AMBALAŽNI PAPIR\2025\FLUTING\FLUTING.xlsm; " & _ "Extended Properties='Excel 12.0 Xml;HDR=NO';" con.Open ' 用SUM函数计算E29:E40的总和,HDR=NO时列名默认是F1 rst.Source = "SELECT SUM(F1) FROM [ZBIRNA$E29:E40]" rst.Open ' 把求和结果写入Sheet3的D2单元格 If Not rst.EOF Then Sheet3.Range("D2").Value = rst.Fields(0).Value rst.Close con.Close End Sub
说明:因为你设置了HDR=NO(无表头),OLEDB会把这个区域的第一列命名为F1,所以SQL里用SUM(F1)来计算该列的总和。
方法二:读取所有数据后再求和(适合不想改SQL的情况)
如果还是想先把12条数据读进来,再用VBA计算总和,也可以这么改:
Option Explicit Sub DataIzZatvorenogFila() Dim con As ADODB.Connection Dim rst As ADODB.Recordset Dim total As Double Set con = New ADODB.Connection Set rst = New ADODB.Recordset con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source= W:\Materijalno\MG i AMBALAŽNI PAPIR\2025\FLUTING\FLUTING.xlsm; " & _ "Extended Properties='Excel 12.0 Xml;HDR=NO';" con.Open rst.Source = "[ZBIRNA$E29:E40]" rst.Open ' 遍历记录集累加求和 total = 0 Do While Not rst.EOF total = total + Nz(rst.Fields(0).Value, 0) ' Nz处理空值,避免报错 rst.MoveNext Loop ' 把总和写入D2 Sheet3.Range("D2").Value = total rst.Close con.Close End Sub
说明:用Nz函数可以处理区域里的空单元格,防止空值导致求和出错。
内容的提问来源于stack exchange,提问作者Jelovac Maglaj
相关产品推荐
相关产品推荐

