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

ecbunoof  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(174)

我必须在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

任何帮助我都感激不尽。谢谢。

r7s23pms

r7s23pms1#

好的,所以直到填充了记录集的,你已经做的很正确了,然后你必须看到记录集更像一个表,可以没有或者有多行多列。首先你必须检查查询是否返回了任何结果或者记录集是否是空的(rs.BOFrs.EOF为true)。然后,您将遍历行(rs.MoveNext)。要访问单个值,您可以给予列的索引或列名。
下面的示例循环遍历行和列,但也会在末尾再次提取列“quantity”:

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
k4ymrczo

k4ymrczo2#

记录集有一个游标,对记录集的任何引用都将根据游标的位置返回属性(如字段的值)。
当你调用CopyFromRecordset时,你把光标移到末尾(EOF = True),然后当你试图获取Fields(“quantity”)时,记录集没有活动的记录,所以你得到了一个错误。
如果你有正确类型的记录集,你可以先输入rs.MoveFirst,然后quantity就等于第一条记录的quantity字段,这可能不是你想要的。
没有一行程序(据我所知)可以让你得到记录集中所有字段的总和,你必须像Graffl显示的那样循环。
更好的方法可能是使用Excel。Excel中已经有数据,因此插入公式以获得所需的分类汇总。

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

或者类似的东西。

ruoxqz4g

ruoxqz4g3#

可以将记录集保存到数组
如下所示

Sub Check_gg_date_time_Unique(i As Integer)
        Dim filmSet As New ADODB.Recordset
        Dim dbConn As New ADODB.Connection
        Dim filmName As String, lastrow As Integer
        Dim Varray As Variant
        dbConn.ConnectionString = "Provider=MSDASQL.1;Data Source=Excel_to_MySQL_Maintenance"
        dbConn.Open
    
        Set filmSet = dbConn.Execute("select count(wono) from  maintennce_db.work_order where post_gg_date_time = '2022-08-30 14:21:37'")
        Varray = filmSet.GetRows(1)
        If Varray(0, 0) = 0 Then
        'Do whatever you want
        End If

End Sub

相关问题