我必须在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
感谢任何帮助。三江源。
答案 0 :(得分:0)
确定。因此,在填充Recordset之前,您已经完成了正确的操作,然后您必须看到Recordset更像是一个表,并且可以没有多行或多行。
首先,您必须检查查询是否返回任何结果,或者Recordset是否为空(rs.BOF
和rs.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
答案 1 :(得分:0)
记录集有一个游标,对记录集的任何引用都将根据游标的位置返回属性(如字段的值)。
当您调用CopyFromRecorset时,您将光标移动到末尾(EOF = True)。然后,当您尝试获取字段("数量")时,没有记录集的活动记录,因此您收到错误。
如果您拥有正确类型的记录集,则可以先完成rs.MoveFirst
。那么数量将等于第一个记录中的数量字段。可能不是你想要的。
没有一个单行(据我所知)可以获得记录集中所有字段的总和。你必须像Graffl节目一样循环。
使用Excel可能是更好的途径。您已经拥有了数据,因此插入公式以获得所需的小计。
Worksheets("PurchaseOrder").Cells("Q47").Formula = _
"=SUMPRODUCT(P23:P46*Q23:A46)"
或类似的东西。