Доступ к VBA - импорт / экспорт Excel - запрос, отчет, таблица и формы

В этом руководстве будут рассмотрены способы импорта данных из Excel в таблицу Access и способы экспорта объектов Access (запросов, отчетов, таблиц или форм) в Excel.

Импортировать файл Excel в Access

Чтобы импортировать файл Excel в Access, используйте acImport вариант DoCmd.TransferSpreadsheet :

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, «Table1», «C: \ Temp \ Book1.xlsx», True

Или вы можете использовать DoCmd.TransferText чтобы импортировать файл CSV:

DoCmd.TransferText acLinkDelim,, «Таблица1», «C: \ Temp \ Book1.xlsx», True

Импортировать Excel в функцию доступа

Эту функцию можно использовать для импорта файла Excel или CSV в таблицу доступа:

Открытая функция ImportFile (имя файла как строка, HasFieldNames как логическое, TableName как строка) как логическое »Пример использования: call ImportFile (« Выбрать файл Excel »,« Файлы Excel »,« * .xlsx »,« C: \ », True , True, "ExcelImportTest", True, True, false, True) При ошибке Перейти к err_handler If (Right (Filename, 3) = "xls") или ((Right (Filename, 4) = "xlsx")) Then DoCmd. TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, TableName, Filename, blnHasFieldNames End If If (Right (Filename, 3) = "csv") Then DoCmd.TransferText acLinkDelim`` TableName, Filename, True End If Exit_Thing if: 'Очистить связанный в' Таблица Excel уже существует … и удалите ее, если это так. Если ObjectExists ("Table", TableName) = True Then DropTable (TableName) Установить colWorksheets = Nothing Функция выхода err_handler: If (Err.Number = 3086 или Err.Number = 3274 или Err. Number = 3073) And errCount <3 Then errCount = errCount + 1 ElseIf Err.Number = 3127 Then MsgBox "Поля на всех вкладках одинаковы. Убедитесь, что каждый лист имеет точные имена столбцов, если вы хотите импортировать несколько ", vbCritical," MultiSheets не идентичны "ImportFile = False GoTo Exit_Thing Else MsgBox Err.Number &" - ​​"& Err.Description ImportFile = False GoTo Exit_Thing Resume End If End Function

Вы можете вызвать функцию так:

Private Sub ImportFile_Example () Вызов VBA_Access_ImportExport.ImportFile ("C: \ Temp \ Book1.xlsx", True, "Imported_Table_1") End Sub

Доступ к экспорту VBA в новый файл Excel

Чтобы экспортировать объект Access в новый файл Excel, используйте DoCmd.OutputTo метод или DoCmd.TransferSpreadsheet метод:

Экспорт запроса в Excel

Эта строка кода VBA экспортирует запрос в Excel с помощью DoCmd.OutputTo:

DoCmd.OutputTo acOutputQuery, "Query1", acFormatXLSX, "c: \ temp \ ExportedQuery.xls"

Или вы можете использовать вместо этого метод DoCmd.TransferSpreadsheet:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, «Query1», «c: \ temp \ ExportedQuery.xls», True

Примечание: Этот код экспортирует в формат XLSX. Вместо этого вы можете обновить аргументы для экспорта в формат файла CSV или XLS (например, acFormatXLSX к acFormatXLS).

Экспорт отчета в Excel

Эта строка кода экспортирует отчет в Excel с помощью DoCmd.OutputTo:

DoCmd.OutputTo acOutputReport, «Report1», acFormatXLSX, «c: \ temp \ ExportedReport.xls»

Или вы можете использовать вместо этого метод DoCmd.TransferSpreadsheet:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, «Report1», «c: \ temp \ ExportedReport.xls», True

Экспорт таблицы в Excel

Эта строка кода экспортирует таблицу в Excel с помощью DoCmd.OutputTo:

DoCmd.OutputTo acOutputTable, «Table1», acFormatXLSX, «c: \ temp \ ExportedTable.xls»

Или вы можете использовать вместо этого метод DoCmd.TransferSpreadsheet:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, «Table1», «c: \ temp \ ExportedTable.xls», True

Экспорт формы в Excel

Эта строка кода экспортирует форму в Excel с помощью DoCmd.OutputTo:

DoCmd.OutputTo acOutputForm, «Form1», acFormatXLSX, «c: \ temp \ ExportedForm.xls»

Или вы можете использовать вместо этого метод DoCmd.TransferSpreadsheet:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, «Form1», «c: \ temp \ ExportedForm.xls», True

Экспорт в функции Excel

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

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

Экспорт в существующий файл Excel

Приведенные выше примеры кода отлично подходят для экспорта объектов Access в новый файл Excel. Однако их нельзя будет экспортировать в существующую книгу.

Чтобы экспортировать объекты Access в существующую книгу Excel, мы создали следующую функцию:

Общедоступная функция AppendToExcel (strObjectType как строка, strObjectName как строка, strSheetName как строка, strFileName как строка) Dim rst as DAO.Recordset Dim ApXL As Excel.Application Dim xlWBk As Excel.Workbook Dim xlWSh Asim Integer. As Long = -4161 Const xlCenter As Long = -4108 Const xlBottom As Long = -4107 Const xlContinuous As Long = 1 Выберите регистр strObjectType Case "Таблица", "Запрос" Установить rst = CurrentDb.OpenRecordset (strObjectName, dbOpenDynaset, dbOpenDynaset, dbOpenDynaset, dbeeSee "Form" Set rst = Forms (strObjectName) .RecordsetClone Case "Report" Set rst = CurrentDb.OpenRecordset (Reports (strObjectName) .RecordSource, dbOpenDynaset, dbSeeChanges) End Select If rst.RecordCount = 0 Then No records to be exported = 0 Then No records to be exported . ", vbInformation, GetDBTitle Остальное при ошибке Возобновить Далее Установить ApXL = GetObject (," Excel.Application ") Если Err.Number 0 Затем Установить ApXL = CreateObject (" Excel.Application ") Конец, если Err.Clear ApXL.Visible = False Установите xlWBk = ApXL.Workbooks.Open (strFil eName) Задайте xlWSh = xlWBk.Sheets.Add xlWSh.Name = Left (strSheetName, 31) xlWSh.Range ("A1"). Выберите "Выполнить до тех пор, пока intCount = rst.fields.Count ApXL.ActiveCell = rst.fields (intCount)". Назовите ApXL.ActiveCell.Offset (0, 1) .Select intCount = intCount + 1 Loop rst.MoveFirst xlWSh.Range ("A2"). CopyFromRecordset rst With ApXL .Range ("A1"). Select .Range (.Selection, .Selection.End (xlToRight)). Выберите .Selection.Interior.Pattern = xlSolid .Selection.Interior.PatternColorIndex = xlAutomatic .Selection.Interior.TintAndShade = -0.25 .Selection.Interior.PatternTintAndShade = 0. xlNone .Selection.AutoFilter .Cells.EntireColumn.AutoFit .Cells.EntireRow.AutoFit .Range ("B2"). Выберите .ActiveWindow.FreezePanes = True .ActiveSheet.Cells.Select .ActiveSheet.Cells.WrapText.Cells. .EntireColumn.AutoFit xlWSh.Range ("A1"). Выберите .Visible = True End With 'xlWB.Close True' Set xlWB = Nothing 'ApXL.Quit' Set ApXL = Nothing End If End Function

Вы можете использовать эту функцию так:

Private Sub AppendToExcel_Example () Вызов VBA_Access_ImportExport.ExportToExcel («Таблица», «Таблица1», «VBASheet», «C: \ Temp \ Test.xlsx») End Sub

Обратите внимание, что вас просят определить:

  • Что выводить? Таблица, отчет, запрос или форма
  • Имя объекта
  • Имя выходного листа
  • Путь и имя выходного файла.

Экспорт SQL-запроса в Excel

Вместо этого вы можете экспортировать SQL-запрос в Excel, используя аналогичную функцию:

Открытая функция AppendToExcelSQLStatemet (strsql As String, strSheetName As String, strFileName As String) Dim strQueryName As String Dim ApXL As Excel.Application Dim xlWBk As Excel.Workbook Dim xlWSh As Excel.Worksheet Dim intCount10 As Integer Const x xlBottom As Long = -4107 Const xlVAlignCenter = -4108 Const xlContinuous As Long = 1 Dim qdf As DAO.QueryDef Dim rst As DAO.Recordset strQueryName = "tmpQueryToExportToExcel" IfldueryName.StrleteQeueryDueryName, strleteQext Конец Если Установить qdf = CurrentDb.CreateQueryDef (strQueryName, strsql) Установить rst = CurrentDb.OpenRecordset (strQueryName, dbOpenDynaset) Если rst.RecordCount = 0 Тогда MsgBox «Нет записей для экспорта. ApXL = GetObject (, "Excel.Application") Если Err.Number 0, тогда установите ApXL = CreateObject ("Excel.Application") End If Err.Clear ApXL.Visible = False Set xlWBk = ApXL.Workbooks.Open (strFileName) Set xlWSh = xlWBk.Sheet s.Add xlWSh.Name = Left (strSheetName, 31) xlWSh.Range ("A1"). Выберите "Do until intCount = rst.fields.Count ApXL.ActiveCell = rst.fields (intCount) .Name ApXL.ActiveCell.Offset ( 0, 1) .Select intCount = intCount + 1 Loop rst.MoveFirst xlWSh.Range ("A2"). CopyFromRecordset rst With ApXL .Range ("A1"). Select .Range (.Selection, .Selection.End (xlToRight) ) .Select .Selection.Interior.Pattern = xlSolid .Selection.Interior.PatternColorIndex = xlAutomatic .Selection.Interior.TintAndShade = -0.25 .Selection.Interior.PatternTintAndShade = 0 .Selection.Borders.LineStyle. … ("A1"). Выберите .Visible = True End With 'xlWB.Close True' Set xlWB = Nothing 'ApXL.Quit' Set ApXL = Nothing End If End Function

Вызывается так:

Private Sub AppendToExcelSQLStatemet_Example () Вызов VBA_Access_ImportExport.ExportToExcel («SELECT * FROM Table1», «VBASheet», «C: \ Temp \ Test.xlsx») End Sub

Где вас просят ввести:

  • SQL-запрос
  • Имя выходного листа
  • Путь и имя выходного файла.

Функция экспорта в новый файл Excel

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

Открытая функция ExportToExcel (strObjectType как строка, strObjectName как строка, необязательный strSheetName как строка, необязательный strFileName как строка) Dim rst as DAO.Recordset Dim ApXL As Object Dim xlWBk As Object Dim xlWSh As Object Dim intCount As Integer Const xlWSh As Object Dim intCount As Integer Const xlWSh As Object Dim intCount As Integer Const 4161 Const xlCenter As Long = -4108 Const xlBottom As Long = -4107 Const xlContinuous As Long = 1 При ошибке GoTo ExportToExcel_Err DoCmd.Hourglass True Select Case strObjectType Case "Table", "Query" Set rst = CurrentDb.OpenrRecordSet (strObjectType) , dbSeeChanges) Case "Form" Set rst = Forms (strObjectName) .RecordsetClone Case "Report" Set rst = CurrentDb.OpenRecordset (Reports (strObjectName) .RecordSource, dbOpenDynaset, dbSeeChanges) End Select If rst.Rec записи для экспорта. ", vbInformation, GetDBTitle DoCmd.Hourglass False Else При ошибке Возобновить Далее Установить ApXL = GetObject (," Excel.Application ") Если Err.Number 0 Затем Установить ApXL = CreateObject (" Excel.Application ") Конец Если Err. Очистить при ошибке Перейти к ExportToExcel_Err Установить xlWBk = ApXL.Workbooks.Add ApXL.Visible = False Установить xlWSh = xlWBk.Worksheets ("Sheet1") Если Len (strSheetName)> 0 Тогда xlWSh.Name = Left (31) Если xlWSh.Name = Left (31) If xlWSh EndheetName .Range ("A1"). Выберите "Сделать до" intCount = rst.fields.Count ApXL.ActiveCell = rst.fields (intCount) .Name ApXL.ActiveCell.Offset (0, 1). Выберите intCount = intCount + 1 Loop rst. MoveFirst xlWSh.Range ("A2"). CopyFromRecordset rst With ApXL .Range ("A1"). Select .Range (.Selection, .Selection.End (xlToRight)). Select .Selection.Interior.Pattern = xlSolid .Selection. Interior.PatternColorIndex = xlAutomatic .Selection.Interior.TintAndShade = -0.25 .Selection.Interior.PatternTintAndShade = 0 .Selection.Borders.LineStyle = xlNone .Selection.AutoFilter .Cells.EnutoColumn.AutoFilter .Cells.EnutoColumn.AutoFilter. B2 "). Выберите .ActiveWindow.FreezePanes = True .ActiveSheet.Cells.Select .ActiveSheet.Cells.WrapText = False .ActiveSheet.Cells.EntireColumn.AutoFit xlWSh.Range (" A1 "). Выберите .Visible = True End Wi th retry: If FileExists (strFileName) Then Kill strFileName End If If if strFileName "" Then xlWBk.SaveAs strFileName, FileFormat: = 56 End If rst.Close Set rst = Nothing DoCmd.Hourglass False End If ExportToExcel_Exit_Exit: DoC ExportToExcel_Err: DoCmd.SetWarnings True MsgBox Err.Description, vbExclamation, Err.Number DoCmd.Hourglass False Resume ExportToExcel_Exit End Function

Функцию можно вызвать так:

Private Sub ExportToExcel_Example () Вызов VBA_Access_ImportExport.ExportToExcel ("Table", "Table1", "VBASheet") End Sub
wave wave wave wave wave