2016-06-10 5 views
1

VBA를 처음 사용하여 Microsoft의 ACE OLEDB 공급자를 통해 Excel 스프레드 시트에 Outlook 매크로를 작성하려고합니다. 다음 test.xlsx으로ADODB 레코드 세트 항목을 컬렉션에 추가

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H1 

Sub Test() 
    Dim conn As New ADODB.Connection 
    Dim results As New ADODB.Recordset 
    Dim values As Object 
    Set values = CreateObject("System.Collections.ArrayList") 

    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\Users\me\test.xlsx;" & _ 
    "Extended Properties=""Excel 12.0; HDR=YES;""" 

    results.Open "SELECT * FROM [Sheet1$]", _ 
    conn, adOpenStatic, adLockOptimistic, adCmdText 
    Do Until results.EOF 
    values.Add results.Fields.Item("num") 
    Debug.Print Join(values.toArray, ", ") 
    results.MoveNext 
    Loop 
End Sub 

: 나는 다음의 라인을 따라, 쿼리 후 ResultSet 통해 반복하고 Collection에 결과를 저장하고있어

Test Excel data

우리는 얻을 :

1 
2, 2 
3, 3, 3 
4, 4, 4, 4 
5, 5, 5, 5, 5 

이것은 results.Fields.Item("column_name")와 일치하는 것으로 보입니다. 각 MoveNext에 덮어 쓰여진 참조 및 values에 저장된 참조입니다.

VBA의 참조/값 매커니즘에 익숙하지 않은 경우 올바른 경로에서 추측 할 수 있습니까? 대신 값을 저장할 수있는 방법이 있습니까?

답변

0

이 코드가 컴파일됩니까?

.NET이 아닌 한 ADODB.Resultset을 들어 보지 못했습니다. ??? 이 개체를 찾기 위해 어떤 라이브러리를 참조해야합니까?

레코드 집합을 참조하려고합니까? 당신은 Dim result As New ADODB.ResultSet 을 사용하고

그런

result.Open "SELECT * FROM [Sheet1$]"

하지만 루프를 사용하는 복수 '결과'

+0

IIRC 나는'참조하고있어 Microsoft ActiveX 데이터 개체를 추가하다 [6.1]' 다시 : [이 Office Space] (https://technet.microsoft.com/en-us/library/ee692882.aspx). 이 예제는 실제 코드에 100 % 충실한 것은 아니지만이 문제가 해당 양식을 인식 할만큼 충분히 일반적 이었으면합니다. '결과'slipup을 지적 해 주셔서 감사합니다! – concat

+0

코드를 복사 한 다음 사용하기 위해 편집해야한다고 생각합니다. 이 기사에는 ResultSet이 없습니다. 레코드 세트라고도합니다. 나중에 참조 할 시점에서 우리는 직접 테스트하지 않은 코드의 문제를 해결하기 위해 여기에 있지 않습니다. 일단 디버깅 결합 문을 루프 외부에 두는 것이 더 좋을 수도 있지만, 지금은 큰 추측 일뿐입니다. – dbmitch

+0

충분히 공정하게, 나는 처음에는 급하게 요청했습니다. 내 작업 기계에서, 이제는 업데이트 된 예제로 동작을 재현 할 수있었습니다. – concat

0

나는이 오래된 스레드 알지만, 그것은에 최고 결과입니다 Google, 그래서 대답은 아마 순서입니다.

results.Fields.Item ("column_name") 또는 results! column_name을 사용하여 레코드 세트의 컬렉션에 항목을 추가하면 참조로 추가되므로 콜렉션이 값을 조회 할 때 동일한 결과를 얻습니다 반복하여 (또한, 레코드 집합을 닫으면 각 인덱스에서 EOF 오류가 발생합니다).

대신에, 당신이해야 할 것은 ("COLUMN_NAME"). 값을 필드 값

MyCollection_.Add results.Fields에게