2012-01-19 5 views
1

У меня есть книга Excel с несколькими рабочими листами. На первом листе есть информация для входа пользователя, и есть кнопка для загрузки всех листов, соответствующих различным таблицам в AS400. Имена рабочих таблиц - это те же имена, что и имена таблиц AS400.Загрузить таблицы Excel в AS400

У меня этот код для кнопки загрузки, как показано ниже:

Код:

Dim objConn As New ADODB.Connection, objRs As New ADODB.Recordset 
Dim WS_Count As Integer 
Dim I As Integer 
Dim WS_Name As String 

objConn.ConnectionString = "DSN=MYAS400;DRIVER=Client Access ODBC Driver (32-bit); " & _ 
         "SYSTEM = <ip>; UID = <uname>;PWD = <pwd>" 
objConn.Open 
    WS_Count = ActiveWorkbook.Worksheets.Count 
For I = 2 To WS_Count 
     WS_Name = ActiveWorkbook.Worksheets(I).Name 
     objConn.Execute "DELETE FROM MYAS400LIB. " & WS_Name & "" 
     objConn.Execute "INSERT INTO MYAS400LIB. " & WS_Name & " SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=" & ThisWorkbook.FullName & ";HDR=YES;IMEX=1', 'SELECT * FROM [" & WS_Name & "$]')" 


Next I 
objConn.Close 
Set objConn = Nothing 
End Sub 

Как я могу вставить каждый рабочий лист (с заголовками столбцов) в AS400?

ответ

1

Не вдаваясь в детали фактического кодирования всего, проблема с вашим примером кода заключается в том, что вы не можете отправить SQL-код выбора в AS/400. AS/400 не может видеть вашу электронную таблицу и, следовательно, не может загрузить данные из нее в одном SQL. Вместо этого вы должны прочитать все строки своей таблицы и вставить эти записи по одному в свою таблицу AS/400. Параметрированный SQL предпочтительнее.

Это раздел кода, который должен идти:

objConn.Execute "INSERT INTO MYAS400LIB. " & WS_Name & " SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=" & ThisWorkbook.FullName & ";HDR=YES;IMEX=1', 'SELECT * FROM [" & WS_Name & "$]')" 

Он не будет работать. Замените его чтением петли через строки в книге. Вы можете использовать набор OLEDB Excel или читать таблицу за строкой. Внутри цикла для каждой строки таблицы чтения вам нужно будет написать инструкцию INSERT INTO, которая должна быть выполнена через ODBC в AS/400.

0

Я бы попытался использовать поставщик данных .NET из iSeries Access. Откройте набор записей. AddNew для каждой строки в вашем листе. Обновите набор записей. Закрыть.

Это должно вставить все записи с листа одним ударом, а не по одному за раз.

Смежные вопросы