VBA для импорта таблицы Excel в Access построчно - PullRequest
3 голосов
/ 15 марта 2011

Я отлаживаю некоторый код и мне нужно выяснить, где
DoCmd.TransferSpreadsheet acImport, , ".....
не удается, поэтому я решил импортировать его «вручную» построчно, чтобы увидеть, где он падает.

Полагаю, что-то вроде того, что я ищу:

mySpreadSheet = ConnectTo(Spreadsheet.xlsx)
while(!mySpreadSheet.EOF)
   get(mySpreadSheet.nextLine)
   SQL("UPDATE MyTable with mySpreadSheet.nextLine")

Я пробовал поискать в Google, но безрезультатно. Любая помощь очень ценится!


Дополнительная информация:

  • Имена столбцов электронной таблицы и таблицы доступа идентичны.
  • Каждый тип данных - nvarchar (MAX) (или «Памятка», как называет его Access)
  • Таблица является связанной таблицей с SQL Server 2008

Ответы [ 5 ]

10 голосов
/ 15 марта 2011

ADO работает хорошо, если у вас есть четко определенный макет листа ваших данных (ответ HansUp). Если вам требуется дополнительный контроль перед загрузкой объектов, вы можете подключиться к книге Excel и затем извлечь любые данные, которые вам нравятся. Это действительно зависит от уровня контроля, который вам нужен.

Public Sub LoadExcelToAccess(xlPath As String)
'uses late binding to open excel workbook and open it line by line

'make reference to Microsoft Excel xx.x Object Model to use native functions, requires early binding however

    Dim xlApp As Object 'Excel.Application
    Dim xlWrk As Object 'Excel.Workbook
    Dim xlSheet As Object 'Excel.Worksheet
    Dim i As Long
    Dim sql As String

    Set xlApp = VBA.CreateObject("Excel.Application")

    'toggle visibility for debugging
    xlApp.Visible = False

    Set xlWrk = xlApp.Workbooks.Open(xlPath)
    Set xlSheet = xlWrk.Sheets("Sheet1") 'modify to your perticular sheet

    'depends on what your trying to do with the sheet
    For i = 1 To 10

        'quick and dirty:  best to load items into custom class collection, then do processing there
        sql = "Insert Into [Temp] (Col1) VALUES (" & xlSheet.Cells(i, 1).Value & ")"
        DoCmd.RunSQL sql
    Next i

    'make sure to dispose of objects
    xlWrk.Close
    xlApp.Quit

    Set xlSheet = Nothing
    Set xlWrk = Nothing
    Set xlApp = Nothing
End Sub
5 голосов
/ 15 марта 2011

Вы можете создать соединение ADO с электронной таблицей (см. Строки подключения для Excel 2007 ), а затем открыть набор записей ADO с этим соединением (см. StackOverflow: набор записей ADODB в VBA говорит, что поле Excel пусто, когда это не например).

Затем перемещайтесь по строкам набора записей и создайте инструкцию SQL INSERT, используя значения строки.

strInsert = "INSERT INTO MyTable (first_field, second_field) VALUES ('" & -
    rs2.Field(0).Value & "', '" & rs2.Field(1).Value & "');"
Debug.Print strInsert
CurrentDb.Execute strInsert, dbFailonerror

Этот фрагмент кода предполагает, что first_field и second_field являются текстовыми типами данных. Если они числовые, теряйте одинарные кавычки.

Я думаю, это примерно так, как вы просили. Однако, прежде чем прибегать к коду, я бы проверил, правильно ли импортирует электронную таблицу в новую собственную таблицу Access. (Также проверьте, совместимы ли типы данных и ограничения для этой новой таблицы с данными из связанной таблицы SQL Server.) Если это работает, возможно, попробуйте импортировать электронную таблицу непосредственно в SQL Server из Management Studio, или какой-либо подходящий инструмент.

0 голосов
/ 16 марта 2011

Вы также можете попробовать скопировать данные Excel в буфер обмена и вставить их в таблицу доступа.Все, что не удалось, будет записано Access в таблицу «Вставить ошибки».

0 голосов
/ 15 марта 2011

В целях устранения неполадок попробуйте установить связь с электронной таблицей и посмотреть, с какими проблемами вы столкнулись, включая неправильное отображение данных при просмотре в виде таблицы.

0 голосов
/ 15 марта 2011

Два дополнительных параметра:

  1. Свяжите электронную таблицу в Access как таблицу.В Access 2007 перейдите на панель «внешние данные» и выберите «Импортировать электронную таблицу Excel».Вы должны импортировать в существующую таблицу данных, новую таблицу данных или просто ссылку на файл Excel.Затем вы будете работать с этой новой таблицей «Excel», как с таблицей Access (в последнем случае рассматривались проблемы с производительностью).

  2. Попробуйте исправить проблему Docmd.TransferSpreadsheet.Я использую этот метод в течение нескольких лет, и он отлично работает, несмотря на то, что в некоторых случаях он должен быть немного хитрым (я верю, что это ваш случай).Пожалуйста, это стоит, если вы дадите больше информации о вашей проблеме с этим методом, включая вашу версию Access и Excel.

Я надеюсь, что помог.Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...