2012-07-11 3 views
2

ADO를 사용하여 Excel 파일에서 액세스하고 일부 항목을 읽으려고합니다. 어떻게 그것을 열어 SELECT *하고 레코드 집합 개체에 넣어 이해합니다. 내가 이해하지 못하는 것은 내가 정보 그룹을 선택했다면, 그 레코드 셋의 특정 필드에 어떻게 접근 할 것인가이다.ADO VBA를 사용하여 Excel 필드를 액세스 테이블에 삽입

코드 : 우려의

Private Sub SaveReq_Click() 
' 
' Saves the current entry to the database 
' Into the TABLE 'pr_req_table' 
' 

' Open a connection to the database 
dim data_base as Database 
set data_base = OpenDatabase(CurrentProject.Path & "\test_database.accdb") 

Sub InsertRecord() 
Dim data_base As Database 
Set data_base = OpenDatabase(CurrentProject.Path & "\test_database.accdb") 

' Grab all information from form 
' Add information to pr_req_table 
Dim qd As QueryDef 
Set qd = data_base.CreateQueryDef("") 
qd.sql = "INSERT INTO pr_req_table(pr_no, pr_date, pr_owner, pr_link, pr_signed) " & _ 
    "values([p1],[p2],[p3],[p4],[p5])" 
qd.Parameters("p1").Value = pr_num.Value 
qd.Parameters("p2").Value = Format(pr_date.Value, "mm/dd/yyyy") 
qd.Parameters("p3").Value = List22.Value 
qd.Parameters("p4").Value = "Excel Copy #" & elec_copy.Value 
qd.Parameters("p5").Value = "Signed Copy #" & sign_copy.Value 
qd.Execute 


' The following section reads from the elec_copy field's hyperlink 
' It scans the Excel file for items it needs to include into the table 
' It enters those cells into the TABLE 'items_needed_table' 
' 
' Slects row by row, and if the item has been marked TRUE, inserts 
' That row into the TABLE 'items_needed_table' 


' Open a connection to Excel 
On Error Resume Next 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H0001 

Set objConnection = CreateObject("ADODB.Connection") 

objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=" & elec_copy.Value & ";" & _ 
    "Extended Properties=""Excel 8.0;HDR=Yes;"";" 

' Decalre a RecordSet Object 
Set objRecordSet = CreateObject("ADODB.Recordset") 

' Grab all Rows in the Plain_VDR Sheet where 'needed' column == TRUE 
objRecordset.Open "Select line_no, desc, weeks FROM [Plain_VDR$] Where needed = TRUE", _ 
    objConnection, adOpenStatic, adLockOptimistic, adCmdText 

' Declare a loop counter for row? 
Dim x as Integer 
x = 0 

' Write the information pulled, into the TABLE 'items_needed_table' in Access Database 
Do Until objRecordset.EOF 
     qd.sql = "INSERT INTO items_needed_table(pr_no, line_no, desc, weeks) " & _ 
     "Values([p1],[p2],[p3])" 
     ' p1 was declared earlier in code, same value as before 
     qd.Parameters("p2").Value = objRecorset.(ROW_X, "line_no") 
     qd.Parameters("p3").Value = objRecordset.(ROW_X, "desc") 
     qd.Parameters("p4").Value = objRecordset.(ROW_X, "weeks") 
     qd.Execute 
     x = x + 1 
Loop 

' Close Database connection 
data_base.Close 

End Sub 

내 주요 지점은 '까지 수행'루프 섹션입니다. 의심 스럽지만 'pr_no'는 Excel 파일에 정의되어 있지 않지만 Access 데이터베이스에 다시 정의되어 있으므로 전체 선택을 삽입 할 수 있으므로 Excel 파일의 각 행에 대해 해당 명령을 반복해야한다고 생각합니다. Recordset Object의 매개 변수에 행 및 필드 별 값을 지정하려면 무엇을 사용해야합니까?

미리 도움을 청하십시오!

나단

연결 문자열에서
+0

pr_no가 자동 번호이면 포함 할 필요가 없습니다. 왜 쿼리를 통해 한꺼번에 모든 데이터를 삽입하지 않거나 Access의 테이블로 범위를 연결하고 일반 Access 쿼리를 실행하는 것만 큼입니까? – Fionnuala

+0

pr_no가 자동 번호가 아닙니다. 각 줄에 pr_no를 지정해야하기 때문에 모든 데이터를 한 번에 삽입 할 수 없습니다. Excel 파일은 새 항목이 작성 될 때마다 달라 지므로 새 항목을 입력 할 때마다이를 실행해야합니다. – nathansizemore

답변

3

을, 당신은 말했다 HDR = 당신의 범위의 첫 번째 행이 매우 약, 당신의 필드의 이름이 포함되어 있으므로 즉, 예 :

Do Until objRecordset.EOF 
    qd.Sql = "INSERT INTO items_needed_table(pr_no, line_no, desc, weeks) " & _ 
    "Values([p1],[p2],[p3])" 
    ' p1 was declared earlier in code, same value as before 
    '**No it was not, the earlier stuff is mostly irrelevant 

    qd.Parameters("p2").Value = objRecorset.Fields("line_no") 
    qd.Parameters("p3").Value = objRecordset.Fields("desc") 
    qd.Parameters("p4").Value = objRecordset.Fields("weeks") 
    qd.Execute 
    ''You are moving through a recordset, not a worksheet 
    objRecordset.MoveNext 
Loop 

하는 경우 이 모든 것을 Excel에서 선택하면됩니다. pr_num을 변경하지 않기 때문에 하나의 쿼리로 삽입 할 수 있습니다.

+0

감사합니다. @Remou. 따라서 위의 실행 명령 이후에 ("p1")의 값이 null이라고 말하는 것입니까? – nathansizemore

+0

그럴 수도 있고 아닐 수도 있습니다. 답을 푸는 것이 조금 어렵습니다. 나는 당신이 쿼리를 재설정했다고 생각했지만 아마도 그렇게하지 않았을 것입니다. – Fionnuala

관련 문제