VBA 将数据库值存储在变量中

我必须在 excel 中编写一些 VBA 代码才能与我的 VB.NET 程序一起使用,而且我正在努力学习 VBA 的基础知识,因为我以前没有使用过它。我找到了一些代码,可以让我从临时表中获取值并将它们直接放在 excel 电子表格的适当字段中。我正在填充采购订单文档,因此传递的信息是小计、增值税、运输、总计等。

这是我用来填充单个单元格的代码:

'get quantity
strQry = "SELECT quantity from [temp];"
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Open strQry
End With
'append data to document
Worksheets("PurchaseOrder").Range("D22").CopyFromRecordset rs

quantity = rs.Fields("quantity")    'setting the quatity in a variable

最后一行代码是我尝试将数量的值存储在一个变量中,我需要用它来计算小计,因为小计没有传递给 excel。填充单元格的代码工作正常,它只是将数据放入一个变量中以进行操作,我正在努力解决这个问题。直接从数据库中填充单元格可以正常工作,但最后一行出现错误。

在将数量存储在变量中之后,我还想将单位成本存储在变量中,在开始时使用等效子字符串删除 £ 符号,将其转换为小数,然后将单位成本乘以数量以获得小计。

我尝试使用以下代码:

'get price
strQry = "SELECT costPerUnit from [temp];"
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Open strQry
End With
'append data to document
Worksheets("PurchaseOrder").Range("N22").CopyFromRecordset rs

costPerUnit = Right(rs(0), Len(costPerUnit) - 1) 'setting the cost per unit in a variable
subtotal = costPerUnit * quantity
Worksheets("PurchaseOrder").Cells("Q47").Value = "£ " & subtotal

任何帮助表示赞赏。谢谢你。

stack overflow VBA storing database values in variables
原文答案

答案:

作者头像

行。因此,在填充 Recordset 之前,您已经完成了正确的操作,然后您必须看到 Recordset 更像是一张表,并且可以没有或有多行多列。首先,您必须检查查询是否返回任何结果或 Recordset 是否为空( rs.BOFrs.EOF 为真)。然后您将遍历行 ( rs.MoveNext )。要访问单个值,您可以给出列的索引或列名。

以下示例循环遍历行和列,但也在末尾再次提取列“数量”:

If (rs.EOF) And (rs.BOF) Then
    Exit Function
Else
    rs.MoveFirst
    Do Until rs.EOF
        For j = 1 To rs.Fields.Count
            valueOfColumnJ = rs.Fields(j - 1).Value
        Next j
        quantity = rs.Fields("quantity")
        rs.MoveNext
    Loop    
End If
作者头像

记录集有一个游标,对记录集的任何引用都将根据游标的位置返回属性(如字段的值)。

当您调用 CopyFromRecorset 时,您将光标移到了末尾 (EOF = True)。然后,当您尝试获取字段(“数量”)时,记录集没有活动记录,因此出现错误。

如果您有正确的记录集类型,您可以先完成 rs.MoveFirst 。那么数量将等于第一条记录中的数量字段。可能不是你想要的。

没有一个单行(据我所知)可以让您获得记录集中所有字段的总数。你必须像 Graffl 表演一样循环播放。

更好的方法是使用 Excel。您已经有数据,所以插入一个公式来获得您想要的小计。

Worksheets("PurchaseOrder").Cells("Q47").Formula = _
    "=SUMPRODUCT(P23:P46*Q23:A46)"

或类似的东西。