Использование ADO VBA для вставки полей Excel в таблицу доступа

Я пытаюсь использовать ADO для доступа и чтения некоторых вещей из файла Excel. Я понимаю, как открыть его, выполнить SELECT * и поместить его в объект набора записей. Чего я не понимаю, так это того, что если я выбираю группу информации, как получить доступ к определенным полям в этом наборе записей.

Код:

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. Что мне нужно использовать, чтобы присвоить моим параметрам значения для каждой строки и поля из объекта набора записей?

Заранее благодарю за любую помощь!

Натан


person nathansizemore    schedule 11.07.2012    source источник
comment
Если pr_no является автоматическим номером, его не нужно включать. Почему вы либо не вставляете все данные сразу через запрос, либо просто связываете диапазон в виде таблицы в Access и выполняете достаточно обычные запросы Access?   -  person Fionnuala    schedule 11.07.2012
comment
pr_no не является автономером. Не могу вставить все данные сразу, потому что мне нужно назначить pr_no для каждой строки. Файл Excel отличается каждый раз, когда делается новая запись, поэтому мне нужно запускать его каждый раз, когда вводится новая запись.   -  person nathansizemore    schedule 12.07.2012


Ответы (1)


В вашей строке подключения вы сказали HDR=Yes, что означает, что первая строка вашего диапазона содержит имена ваших полей, поэтому очень грубо:

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.

person Fionnuala    schedule 11.07.2012
comment
Спасибо @Remou. Итак, вы говорите, что значение (p1) равно нулю после команды выполнения, приведенной выше? - person nathansizemore; 12.07.2012
comment
Может быть, а может и не быть, немного сложно распутать :) Я думал, что вы сбросили запрос, но, возможно, вы этого не сделали. - person Fionnuala; 12.07.2012