2014-01-06 2 views
0

VB.NET 프로그램과 함께 사용하려면 Excel에서 일부 VBA 코드를 작성해야하며 이전에는 사용하지 않았으므로 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'를 읽으려면 첫 번째 행으로 이동합니다. Locals Window를 사용하여'Recordset'을 디버깅하여 사용중인 필드 이름이 맞는지 확인할 수 있습니까? –

+0

위와 같이 여러 행이 있다면'Recordset' 객체가 모두 정렬되어 있어야하며 동시에 두 행을 반복 할 수 있습니다 ('.MoveNext'). 행 단위로 곱셈을 수행하고 누적 합계를 유지할 수 있습니다 . 또는 데이터를 2 개의 배열로 읽고이를 반복합니다. –

답변

0

확인. 따라서 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 
0

레코드는 커서와 레코드에 대한 참조 같은 (속성을 반환하는 것입니다해야 커서의 위치에 따라 필드의 값).

CopyFromRecorset을 호출하면 커서가 끝까지 이동합니다 (EOF = True). 그런 다음 필드 ("수량")를 가져 오려고하면 레코드 세트의 활성 레코드가 없으므로 오류가 발생합니다.

올바른 유형의 레코드 세트를 가지고 있다면 먼저 rs.MoveFirst을 완료 할 수있었습니다. 그러면 수량은 첫 번째 레코드의 수량 필드와 같을 것입니다. 아마도 당신이 원하는 것이 아닙니다.

레코드 집합의 모든 필드의 합계를 얻을 수있는 한 줄짜리 라인이 없습니다 (필자가 아는 한). Graffl 쇼처럼 반복해야합니다.

더 나은 경로는 Excel을 사용하는 것입니다. 이미 데이터가 있으므로 원하는 부분합을 얻기 위해 수식을 삽입하십시오.

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

또는 그와 비슷한 것.

관련 문제