2014-01-06 100 views
0

我必須在excel中編寫一些VBA代碼,以便與我的VB.NET程序一起使用,並且我正在苦於VBA的基礎知識,因爲我之前沒有使用它。我發現了一些代碼,它允許我從臨時表中獲取值,並將它們直接放在Excel電子表格的相應字段中。我填充採購訂單文檔,所以傳遞的信息在事情像小計,增值稅,運費,總等VBA在變量中存儲數據庫值

這是我用來填充一個單細胞的代碼:

'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

這是因爲'Quantity'字段包含> 1值,並且您將它存儲在非數組變量中。嘗試將其存儲在數組或字典對象中。 –

+0

'.MoveFirst'是否工作到第一行以讀取'quantity'。你可以使用本地窗口調試'Recordset'以確保你使用的字段名稱是正確的嗎? –

+0

如果上面提出了多行,那麼您需要同時使用兩個Recordset對象,並且可以同時循環它們('.MoveNext'),逐行進行乘法運算並保持運行總數。或者將數據讀入2個數組並循環。 –

回答

0

好的。因此,在填充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 
0

記錄集有一個光標,並記錄任何參考是要返回性能(如基於光標位置的字段的值)。

當您調用CopyFromRecorset時,您將光標移動到了末尾(EOF = True)。然後,當您嘗試獲取字段(「數量」)時,記錄集沒有活動記錄,因此出現錯誤。

如果您有正確類型的記錄集,則可以先完成rs.MoveFirst。然後數量將等於第一條記錄的數量字段。可能不是你想要的。

沒有一行代碼(據我所知),這將使您獲得記錄集中所有字段的總數。你必須循環播放Graffl節目。

什麼可能是更好的方法是使用Excel。您已經擁有數據,因此請插入公式以獲取所需的小計。

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

或類似的東西。