VBA для импорта электронной таблицы Excel в линию доступа за линией

StackOverflow https://stackoverflow.com/questions/5310582

Вопрос

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

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

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

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


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

  • Названия столбцов электронной таблицы и таблицы доступа идентичны.
  • Каждый тип данных - NVARCHAR (MAX) (или «MEMO», как вызывает доступ к доступу)
  • Таблица представляет собой связанную таблицу с SQL Server 2008
Это было полезно?

Решение

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

Затем пройдите через строки записей и создайте оператор SQL вставки, используя значения строки.

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 являются типами текстовых данных. Если они числовые, потеряйте одиночные цитаты.

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

Другие советы

ADO работает хорошо, если у вас есть четко определенная макет листа ваших данных (ответ Гансапа). Если вам нужен дополнительный элемент управления перед загрузкой объектов, вы можете зацепить книгу 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

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

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

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

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

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

Надеюсь, я помог. Удачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top