This tutorial will cover the ways to import data from Excel into an Access Table and ways to export Access objects (Queries, Reports, Tables, or Forms) to Excel.
Import Excel File Into Access
To import an Excel file to Access, use the acImport option of DoCmd.TransferSpreadsheet :
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Table1", "C:TempBook1.xlsx", True
Or you can use DoCmd.TransferText to import a CSV file:
DoCmd.TransferText acLinkDelim, , "Table1", "C:TempBook1.xlsx", True
Import Excel to Access Function
This function can be used to import an Excel file or CSV file into an Access Table:
Public Function ImportFile(Filename As String, HasFieldNames As Boolean, TableName As String) As Boolean
' Example usage: call ImportFile ("Select an Excel File", "Excel Files", "*.xlsx", "C:" , True,True, "ExcelImportTest", True, True,false,True)
On Error GoTo err_handler
If (Right(Filename, 3) = "xls") Or ((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:
'Clean up
'Check if our linked in Excel table already exists... and delete it if so
If ObjectExists("Table", TableName) = True Then DropTable (TableName)
Set colWorksheets = Nothing
Exit Function
err_handler:
If (Err.Number = 3086 Or Err.Number = 3274 Or Err.Number = 3073) And errCount < 3 Then
errCount = errCount + 1
ElseIf Err.Number = 3127 Then
MsgBox "The fields in all the tabs are the same. Please make sure that each sheet has the exact column names if you wish to import mulitple", vbCritical, "MultiSheets not identical"
ImportFile = False
GoTo Exit_Thing
Else
MsgBox Err.Number & " - " & Err.Description
ImportFile = False
GoTo Exit_Thing
Resume
End If
End Function
You can call the function like this:
Private Sub ImportFile_Example()
Call VBA_Access_ImportExport.ImportFile("C:TempBook1.xlsx", True, "Imported_Table_1")
End Sub
Access VBA Export to New Excel File
To export an Access object to a new Excel file, use the DoCmd.OutputTo method or the DoCmd.TransferSpreadsheet method:
Export Query to Excel
This line of VBA code will export a Query to Excel using DoCmd.OutputTo:
DoCmd.OutputTo acOutputQuery, "Query1", acFormatXLSX, "c:tempExportedQuery.xls"
Or you can use the DoCmd.TransferSpreadsheet method instead:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "Query1", "c:tempExportedQuery.xls", True
Note: This code exports to XLSX format. Instead you can update the arguments to export to a CSV or XLS file format instead (ex. acFormatXLSX to acFormatXLS).
Export Report to Excel
This line of code will export a Report to Excel using DoCmd.OutputTo:
DoCmd.OutputTo acOutputReport, "Report1", acFormatXLSX, "c:tempExportedReport.xls"
Or you can use the DoCmd.TransferSpreadsheet method instead:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "Report1", "c:tempExportedReport.xls", True
Export Table to Excel
This line of code will export a Table to Excel using DoCmd.OutputTo:
DoCmd.OutputTo acOutputTable, "Table1", acFormatXLSX, "c:tempExportedTable.xls"
Or you can use the DoCmd.TransferSpreadsheet method instead:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "Table1", "c:tempExportedTable.xls", True
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Export Form to Excel
This line of code will export a Form to Excel using DoCmd.OutputTo:
DoCmd.OutputTo acOutputForm, "Form1", acFormatXLSX, "c:tempExportedForm.xls"
Or you can use the DoCmd.TransferSpreadsheet method instead:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "Form1", "c:tempExportedForm.xls", True
Export to Excel Functions
These one line commands work great to export to a new Excel file. However, they will not be able to export into an existing workbook. In the section below we introduce functions that allow you to append your export to an existing Excel file.
Below that, we’ve included some additional functions to export to new Excel files, including error handling and more.
Export to Existing Excel File
The above code examples work great to export Access objects to a new Excel file. However, they will not be able to export into an existing workbook.
To export Access objects to an existing Excel workbook we’ve created the following function:
Public Function AppendToExcel(strObjectType As String, strObjectName As String, strSheetName As String, strFileName As String)
Dim rst As DAO.Recordset
Dim ApXL As Excel.Application
Dim xlWBk As Excel.Workbook
Dim xlWSh As Excel.Worksheet
Dim intCount As Integer
Const xlToRight As Long = -4161
Const xlCenter As Long = -4108
Const xlBottom As Long = -4107
Const xlContinuous As Long = 1
Select Case strObjectType
Case "Table", "Query"
Set rst = CurrentDb.OpenRecordset(strObjectName, dbOpenDynaset, dbSeeChanges)
Case "Form"
Set rst = Forms(strObjectName).RecordsetClone
Case "Report"
Set rst = CurrentDb.OpenRecordset(Reports(strObjectName).RecordSource, dbOpenDynaset, dbSeeChanges)
End Select
If rst.RecordCount = 0 Then
MsgBox "No records to be exported.", vbInformation, GetDBTitle
Else
On Error Resume Next
Set ApXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Set ApXL = CreateObject("Excel.Application")
End If
Err.Clear
ApXL.Visible = False
Set xlWBk = ApXL.Workbooks.Open(strFileName)
Set xlWSh = xlWBk.Sheets.Add
xlWSh.Name = Left(strSheetName, 31)
xlWSh.Range("A1").Select
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 = xlNone
.Selection.AutoFilter
.Cells.EntireColumn.AutoFit
.Cells.EntireRow.AutoFit
.Range("B2").Select
.ActiveWindow.FreezePanes = True
.ActiveSheet.Cells.Select
.ActiveSheet.Cells.WrapText = False
.ActiveSheet.Cells.EntireColumn.AutoFit
xlWSh.Range("A1").Select
.Visible = True
End With
'xlWB.Close True
'Set xlWB = Nothing
'ApXL.Quit
'Set ApXL = Nothing
End If
End Function
You can use the function like this:
Private Sub AppendToExcel_Example()
Call VBA_Access_ImportExport.ExportToExcel("Table", "Table1", "VBASheet", "C:TempTest.xlsx")
End Sub
Notice you are asked to define:
- What to Output? Table, Report, Query, or Form
- Object Name
- Output Sheet Name
- Output File Path and Name.
VBA Programming | Code Generator does work for you!
Export SQL Query to Excel
Instead you can export an SQL query to Excel using a similar function:
Public Function 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 intCount As Integer
Const xlCenter As Long = -4108
Const xlBottom As Long = -4107
Const xlVAlignCenter = -4108
Const xlContinuous As Long = 1
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
strQueryName = "tmpQueryToExportToExcel"
If ObjectExists("Query", strQueryName) Then
CurrentDb.QueryDefs.Delete strQueryName
End If
Set qdf = CurrentDb.CreateQueryDef(strQueryName, strsql)
Set rst = CurrentDb.OpenRecordset(strQueryName, dbOpenDynaset)
If rst.RecordCount = 0 Then
MsgBox "No records to be exported.", vbInformation, GetDBTitle
Else
On Error Resume Next
Set ApXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Set ApXL = CreateObject("Excel.Application")
End If
Err.Clear
ApXL.Visible = False
Set xlWBk = ApXL.Workbooks.Open(strFileName)
Set xlWSh = xlWBk.Sheets.Add
xlWSh.Name = Left(strSheetName, 31)
xlWSh.Range("A1").Select
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 = xlNone
.Selection.AutoFilter
.Cells.EntireColumn.AutoFit
.Cells.EntireRow.AutoFit
.Range("B2").Select
.ActiveWindow.FreezePanes = True
.ActiveSheet.Cells.Select
.ActiveSheet.Cells.WrapText = False
.ActiveSheet.Cells.EntireColumn.AutoFit
xlWSh.Range("A1").Select
.Visible = True
End With
'xlWB.Close True
'Set xlWB = Nothing
'ApXL.Quit
'Set ApXL = Nothing
End If
End Function
Called like this:
Private Sub AppendToExcelSQLStatemet_Example()
Call VBA_Access_ImportExport.ExportToExcel("SELECT * FROM Table1", "VBASheet", "C:TempTest.xlsx")
End Sub
Where you are asked to input:
- SQL Query
- Output Sheet Name
- Output File Path and Name.
Function to Export to New Excel File
These functions allow you to export Access objects to a new Excel workbook. You might find them more useful than the simple single lines at the top of the document.
Public Function ExportToExcel(strObjectType As String, strObjectName As String, Optional strSheetName As String, Optional strFileName As String)
Dim rst As DAO.Recordset
Dim ApXL As Object
Dim xlWBk As Object
Dim xlWSh As Object
Dim intCount As Integer
Const xlToRight As Long = -4161
Const xlCenter As Long = -4108
Const xlBottom As Long = -4107
Const xlContinuous As Long = 1
On Error GoTo ExportToExcel_Err
DoCmd.Hourglass True
Select Case strObjectType
Case "Table", "Query"
Set rst = CurrentDb.OpenRecordset(strObjectName, dbOpenDynaset, dbSeeChanges)
Case "Form"
Set rst = Forms(strObjectName).RecordsetClone
Case "Report"
Set rst = CurrentDb.OpenRecordset(Reports(strObjectName).RecordSource, dbOpenDynaset, dbSeeChanges)
End Select
If rst.RecordCount = 0 Then
MsgBox "No records to be exported.", vbInformation, GetDBTitle
DoCmd.Hourglass False
Else
On Error Resume Next
Set ApXL = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Set ApXL = CreateObject("Excel.Application")
End If
Err.Clear
On Error GoTo ExportToExcel_Err
Set xlWBk = ApXL.Workbooks.Add
ApXL.Visible = False
Set xlWSh = xlWBk.Worksheets("Sheet1")
If Len(strSheetName) > 0 Then
xlWSh.Name = Left(strSheetName, 31)
End If
xlWSh.Range("A1").Select
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 = xlNone
.Selection.AutoFilter
.Cells.EntireColumn.AutoFit
.Cells.EntireRow.AutoFit
.Range("B2").Select
.ActiveWindow.FreezePanes = True
.ActiveSheet.Cells.Select
.ActiveSheet.Cells.WrapText = False
.ActiveSheet.Cells.EntireColumn.AutoFit
xlWSh.Range("A1").Select
.Visible = True
End With
retry:
If FileExists(strFileName) Then
Kill strFileName
End If
If strFileName <> "" Then
xlWBk.SaveAs strFileName, FileFormat:=56
End If
rst.Close
Set rst = Nothing
DoCmd.Hourglass False
End If
ExportToExcel_Exit:
DoCmd.Hourglass False
Exit Function
ExportToExcel_Err:
DoCmd.SetWarnings True
MsgBox Err.Description, vbExclamation, Err.Number
DoCmd.Hourglass False
Resume ExportToExcel_Exit
End Function
The function can be called like this:
Private Sub ExportToExcel_Example()
Call VBA_Access_ImportExport.ExportToExcel("Table", "Table1", "VBASheet")
End Sub
Импорт, экспорт и удаление модуля в редакторе VBA. Программный экспорт-импорт модуля из одной рабочей книги Excel в другую с помощью кода VBA Excel.
1. Откройте рабочую книгу Excel, в которую планируете импортировать модуль. Для импорта модуля в Личную книгу макросов, откройте любую книгу.
2. Откройте редактор VBA сочетанием клавиш Alt+F11 (в этом сочетании используется левая клавиша Alt). Обратите внимание на наличие в окне редактора VBA окна проводника «Project-VBAProject», обычно, расположенного слева. При отсутствии, отобразите его через главное меню, выбрав «View» — «Project Explorer».
3. В окне проводника «Project-VBAProject» найдите строку «VBAProject (ИмяКниги)», где «ИмяКниги» — это имя книги, в которую вы собираетесь импортировать модуль. Если вы желаете импортировать модуль в Личную книгу макросов, строка называется «VBAProject (PERSONAL.XLSB)». Если у вас нет Личной книги макросов — создайте ее.
4. У выбранной строки раскройте все крестики слева.
5. Откройте контекстное меню, кликнув правой кнопкой мыши на строке «ЭтаКнига», и выберите в нем пункт «Import File…».
6. В открывшемся окне выбора файла найдите импортируемый модуль с расширением .bas и дважды кликните по нему, или кликните один раз и нажмите кнопку «Открыть». Модуль импортирован и отобразился в проводнике под именем «Module» с очередным номером, независимо от имени импортируемого файла.
7. Если вы импортировали модуль в Книгу Excel 2007-2016 с расширением .xlsx, ее необходимо будет пересохранить как «Книга Excel с поддержкой макросов (.xlsm)», иначе импортированный модуль не сохранится.
Инструкцию с картинками вы можете посмотреть здесь в параграфе «Пользовательская функция «СуммаПрописью».
Экспорт модуля в редакторе VBA
1. Откройте рабочую книгу Excel, из которой вы планируете экспортировать модуль. Для экспорта модуля из Личной книги макросов, откройте любую книгу.
2. Откройте редактор VBA сочетанием клавиш Alt+F11 и в окне проводника «Project-VBAProject» найдите экспортируемый модуль.
3. Откройте контекстное меню, кликнув правой кнопкой мыши на экспортируемом модуле, и выберите в нем пункт «Export File…».
4. В открывшемся окне выберите папку, куда следует сохранить экспортируемый модуль, если необходимо, измените название сохраняемого файла, и нажмите кнопку «Сохранить». Модуль экспортирован и отобразился в выбранном каталоге с указанным именем и расширением .bas.
Удаление модуля в редакторе VBA
1. В окне проводника «Project-VBAProject» найдите удаляемый модуль.
2. Откройте контекстное меню, кликнув правой кнопкой мыши на удаляемом модуле, и выберите в нем пункт «Remove Module…» с номером удаляемого модуля.
3. VBA Excel предложит экспортировать модуль перед удалением, нажмите «Да», если хотите сохранить модуль, или «Нет», чтобы удалить без сохранения.
Как удалить стандартный модуль с помощью кода VBA Excel, смотрите в последнем параграфе статьи Программное создание модуля.
Программный экспорт-импорт модуля
Пример программного экспорта стандартного модуля "Module1"
из книги "Книга2.xlsm"
и импорта его в книгу "Книга3.xlsm"
с помощью кода VBA Excel:
Sub ExportImportModule() Workbooks(«Книга2.xlsm»).VBProject.VBComponents(«Module1»).Export «C:ТестоваяModule1.bas» Workbooks(«Книга3.xlsm»).VBProject.VBComponents.Import «C:ТестоваяModule1.bas» End Sub |
Если в книге "Книга3.xlsm"
уже присутствует модуль с именем "Module1"
, то импортированному модулю будет присвоен другой номер.
Программное удаление модуля
Код VBA Excel для программного удаления стандартного модуля с именем "Module24"
:
Sub RemoveModule() With ThisWorkbook.VBProject .VBComponents.Remove .VBComponents(«Module24») End With End Sub |
Замените имя "Module24"
на имя своего модуля, который вы хотите безвозвратно удалить.
Способы переноса данных в Excel из Visual Basic
- 12.10.2019
- Применяется к:
Excel 2010, Office Excel 2007, Office Excel 2003
Описание
В этой статье рассказывается о многочисленных способах переноса данных в Microsoft Excel из приложения Microsoft Visual Basic. В этой статье также представлены преимущества и недостатки каждого метода, чтобы вы могли выбрать решение, которое лучше всего подходит для вас.
Дополнительные сведения
Наиболее распространенный подход, используемый для передачи данных в книгу Excel, — Автоматизация. Автоматизация предоставляет максимальную гибкость для указания расположения данных в книге, а также возможность форматирования книги и создания различных параметров во время выполнения. С помощью автоматизации вы можете использовать несколько подходов для переноса данных:
- Перенос ячейки данных по ячейке
- Передача данных в массиве в диапазон ячеек
- Передача данных из набора записей ADO в диапазон ячеек с помощью метода Копифромрекордсет
- Создание QueryTable на листе Excel, который содержит результат запроса в источнике данных ODBC или OLEDB
- Перенесите данные в буфер обмена, а затем вставьте содержимое буфера обмена в лист Excel.
Кроме того, существуют методы, которые можно использовать для передачи данных в Excel, которые не требуют автоматизации. Если вы используете приложение на стороне сервера, это может быть хорошим подходом для массового обработки данных от клиентов. Для переноса данных без автоматизации можно использовать следующие методы:
- Перенос данных в текстовый файл с разделителями — табуляцией или запятыми, который Excel может выполнить в дальнейшем, разбить на ячейки листа
- Передача данных на лист с помощью ADO
- Передача данных в Excel с помощью динамического обмена данными (DDE)
В следующих разделах приводятся более подробные сведения о каждом из этих решений.
Note (Примечание ) При использовании Microsoft Office Excel 2007 вы можете использовать новый формат файла книги Excel 2007 (XLSX) при сохранении книг. Для этого откройте следующую строку кода в следующих примерах кода:
VB
oBook.SaveAs «C:Book1.xls»
Замените этот код следующей строкой кода:
VB
oBook.SaveAs «C:Book1.xlsx»
Кроме того, база данных «Борей» по умолчанию не включена в Office 2007. Тем не менее, вы можете скачать базу данных Northwind из Microsoft Office Online.
Использование автоматизации для передачи ячейки данных по ячейкам
С помощью автоматизации можно переносить данные на лист по одной ячейке за раз:
VB
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
‘Start a new workbook in Excel
Set oExcel = CreateObject(«Excel.Application»)
Set oBook = oExcel.Workbooks.Add
‘Add data to cells of the first worksheet in the new workbook
Set oSheet = oBook.Worksheets(1)
oSheet.Range(«A1»).Value = «Last Name»
oSheet.Range(«B1»).Value = «First Name»
oSheet.Range(«A1:B1»).Font.Bold = True
oSheet.Range(«A2»).Value = «Doe»
oSheet.Range(«B2»).Value = «John»
‘Save the Workbook and Quit Excel
oBook.SaveAs «C:Book1.xls»
oExcel.Quit
Передача данных по ячейкам может быть приемлемым способом, если объем данных мал. У вас есть гибкие возможности для размещения данных в любом месте книги и для условного форматирования ячеек во время выполнения. Однако этот подход не рекомендуется, если для передачи в книгу Excel требуется большой объем данных. Каждый объект диапазона, полученный во время выполнения, вызывает запрос интерфейса таким образом, что передача данных таким способом может замедлиться. Кроме того, Microsoft Windows 95 и Windows 98 имеют ограничение на 64 КБ для запросов интерфейса. Если вы достигли предельного значения 64 КБ на запросах интерфейса, сервер автоматизации (Excel) может перестать отвечать на запросы или могут возникать ошибки, указывающие на нехватку памяти.
Как раз, передача данных по ячейке допускается только для небольших объемов данных. Если вам нужно перенести большие наборы данных в Excel, следует рассмотреть одно из решений, представленных ниже.
Дополнительные примеры кода для автоматизации Excel приведены в статье Автоматизация Microsoft Excel в Visual Basic.
Использование автоматизации для переноса массива данных в диапазон листа
Массив данных можно переносить в диапазон нескольких ячеек одновременно:
VB
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
‘Start a new workbook in Excel
Set oExcel = CreateObject(«Excel.Application»)
Set oBook = oExcel.Workbooks.Add
‘Create an array with 3 columns and 100 rows
Dim DataArray(1 To 100, 1 To 3) As Variant
Dim r As Integer
For r = 1 To 100
DataArray(r, 1) = «ORD» & Format(r, «0000»)
DataArray(r, 2) = Rnd() * 1000
DataArray(r, 3) = DataArray(r, 2) * 0.7
Next
‘Add headers to the worksheet on row 1
Set oSheet = oBook.Worksheets(1)
oSheet.Range(«A1:C1»).Value = Array(«Order ID», «Amount», «Tax»)
‘Transfer the array to the worksheet starting at cell A2
oSheet.Range(«A2»).Resize(100, 3).Value = DataArray
‘Save the Workbook and Quit Excel
oBook.SaveAs «C:Book1.xls»
oExcel.Quit
Если вы переносите данные с помощью массива, а не ячейки по ячейке, вы можете реализовать огромную производительность с большим количеством данных. Рассмотрим эту строку из приведенного выше кода, который передает данные в 300 ячеек листа:
VB
oSheet.Range(«A2»).Resize(100, 3).Value = DataArray
Эта строка представляет два запроса интерфейса (один для объекта Range, возвращаемого методом Range, а другой для объекта Range, возвращаемого методом resize). С другой стороны, при передаче ячейки данных по ячейке потребуются запросы 300 интерфейсов к объектам Range. Если это возможно, вы можете воспользоваться преимуществами для массового переноса данных и уменьшения количества запросов к интерфейсу.
Использование автоматизации для переноса набора записей ADO в диапазон листа
В Excel 2000 появился метод Копифромрекордсет, позволяющий перенести набор записей ADO (или DAO) в диапазон на листе. В приведенном ниже коде показано, как можно автоматизировать Excel 2000, Excel 2002 или Office Excel 2003 и перенести содержимое таблицы Orders в образце базы данных Northwind с помощью метода Копифромрекордсет.
VB
‘Create a Recordset from all the records in the Orders table
Dim sNWind As String
Dim conn As New ADODB.Connection
Dim rs As ADODB.Recordset
sNWind = _
«C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb» conn.Open «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & _ sNWind & «;»
conn.CursorLocation = adUseClient
Set rs = conn.Execute(«Orders», , adCmdTable)
‘Create a new workbook in Excel
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject(«Excel.Application»)
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets(1)
‘Transfer the data to Excel
oSheet.Range(«A1»).CopyFromRecordset rs
‘Save the Workbook and Quit Excel
oBook.SaveAs «C:Book1.xls»
oExcel.Quit
‘Close the connection
rs.Close
conn.Close
Note (Примечание ) Если вы используете версию Office 2007 для базы данных Northwind, необходимо заменить следующую строку кода в примере кода:
VB
conn.Open «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & _ sNWind & «;»
Замените эту строку кода следующей строкой кода:
VB
conn.Open «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=» & _ sNWind & «;»
Excel 97 также предоставляет метод Копифромрекордсет, но его можно использовать только с набором записей DAO. Копифромрекордсет с Excel 97 не поддерживает ADO.
Для получения дополнительных сведений об использовании ADO и методе Копифромрекордсет обратитесь к следующей статье базы знаний Майкрософт:
246335 как перенести данные из набора записей ADO в Excel с помощью автоматизации
Использование автоматизации для создания QueryTable на листе
Объект QueryTable представляет таблицу, созданную на основе данных, возвращенных из внешнего источника данных. При автоматизации Microsoft Excel можно создать QueryTable, просто предоставив строку подключения к OLEDB или источнику данных ODBC, а также строку SQL. Excel предполагает ответственность за создание набора записей и вставку его на лист в указанном расположении. Использование QueryTables предоставляет ряд преимуществ по сравнению с методом Копифромрекордсет:
- Excel обрабатывает создание набора записей и его расположение на листе.
- Запрос можно сохранить вместе с QueryTable, чтобы его можно было обновить позже, чтобы получить обновленный набор записей.
- Когда на лист добавляется новый QueryTable, вы можете указать, что данные, уже существующие в ячейках листа, будут смещены в соответствии с новыми данными (Дополнительные сведения см. в свойстве Рефрешстиле).
В приведенном ниже коде показано, как можно автоматизировать Excel 2000, Excel 2002 или Office Excel 2003, чтобы создать новый QueryTable на листе Excel с помощью данных из учебной базы данных Northwind:
VB
‘Create a new workbook in Excel
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject(«Excel.Application»)
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets(1)
‘Create the QueryTable
Dim sNWind As String
sNWind = _
«C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb»
Dim oQryTable As Object
Set oQryTable = oSheet.QueryTables.Add( _
«OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & _
sNWind & «;», oSheet.Range(«A1»), «Select * from Orders») oQryTable.RefreshStyle = xlInsertEntireRows
oQryTable.Refresh False
‘Save the Workbook and Quit Excel
oBook.SaveAs «C:Book1.xls»
oExcel.Quit
Использование буфера обмена
Буфер обмена Windows также можно использовать в качестве механизма передачи данных на лист. Чтобы вставить данные в несколько ячеек листа, можно скопировать строку, в которой столбцы разделяются символами табуляции, а строки — символами возврата каретки. В приведенном ниже коде показано, как Visual Basic может использовать объект Clipboard для передачи данных в Excel:
VB
‘Copy a string to the clipboard
Dim sData As String
sData = «FirstName» & vbTab & «LastName» & vbTab & «Birthdate» & vbCr _ & «Bill» & vbTab & «Brown» & vbTab & «2/5/85» & vbCr _
& «Joe» & vbTab & «Thomas» & vbTab & «1/1/91»
Clipboard.Clear
Clipboard.SetText sData
‘Create a new workbook in Excel
Dim oExcel As Object
Dim oBook As Object
Set oExcel = CreateObject(«Excel.Application»)
Set oBook = oExcel.Workbooks.Add
‘Paste the data
oBook.Worksheets(1).Range(«A1»).Select
oBook.Worksheets(1).Paste
‘Save the Workbook and Quit Excel
oBook.SaveAs «C:Book1.xls»
oExcel.Quit
Создание текстового файла с разделителями, который Excel может проанализировать по строкам и столбцам
Excel может открывать файлы с разделителями табуляцией и запятыми и правильно анализировать данные в ячейки. Вы можете использовать эту функцию, если вы хотите перенести большой объем данных на лист, используя практически любую автоматизацию. Это может быть хорошим подходом к приложению «клиент-сервер», так как текстовый файл может быть создан на стороне сервера. Затем можно открыть текстовый файл на клиенте, используя автоматизацию там, где это необходимо.
В приведенном ниже коде показано, как создать текстовый файл с разделителями запятыми из набора записей ADO.
VB
‘Create a Recordset from all the records in the Orders table
Dim sNWind As String
Dim conn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim sData As String
sNWind = _
«C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb» conn.Open «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & _ sNWind & «;»
conn.CursorLocation = adUseClient
Set rs = conn.Execute(«Orders», , adCmdTable)
‘Save the recordset as a tab-delimited file
sData = rs.GetString(adClipString, , vbTab, vbCr, vbNullString)
Open «C:Test.txt» For Output As #1
Print #1, sData
Close #1
‘Close the connection
rs.Close
conn.Close
‘Open the new text file in Excel
Shell «C:Program FilesMicrosoft OfficeOfficeExcel.exe » & _ Chr(34) & «C:Test.txt» & Chr(34), vbMaximizedFocus
Примечание Если вы используете версию Office 2007 для базы данных Northwind, необходимо заменить следующую строку кода в примере кода:
VB
conn.Open «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & _
sNWind & «;»
Замените эту строку кода следующей строкой кода:
VB
conn.Open «Provider=Microsoft.ACE.OLEDB.12.0;Data Source=» & _
sNWind & «;»
Если текстовый файл имеет расширение. Расширение CSV, Excel открывает файл без отображения мастера импорта текста и автоматически предполагает, что файл разделяются запятыми. Аналогично, если файл имеет расширение. TXT, Excel автоматически проанализирует файл с помощью разделителей табуляции.
В предыдущем примере кода Excel был запущен с помощью оператора Shell, а имя файла использовалось в качестве аргумента командной строки. В предыдущем примере Автоматизация не использовалась. Тем не менее, если это необходимо, вы можете использовать минимум автоматизации, чтобы открыть текстовый файл и сохранить его в формате книги Excel:
VB
‘Create a new instance of Excel
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject(«Excel.Application»)
‘Open the text file
Set oBook = oExcel.Workbooks.Open(«C:Test.txt»)
‘Save as Excel workbook and Quit Excel
oBook.SaveAs «C:Book1.xls», xlWorkbookNormal
oExcel.Quit
Передача данных на лист с помощью ADO
С помощью поставщика OLE DB для Microsoft Jet можно добавлять записи в таблицу в существующей книге Excel. «Таблица» в Excel — это просто диапазон с определенным именем. Первая строка диапазона должна содержать заголовки (или имена полей), а все последующие строки содержат записи. В следующей процедуре показано, как создать книгу с пустой таблицей с именем MyTable.
Excel 97, Excel 2000 и Excel 2003
- Создайте новую книгу в Excel.
- Добавьте следующие заголовки в ячейки a1: B1 из Лист1:
- Форматирование ячейки B1 в соответствии с выравниванием по правому краю.
- Выберите a1: B1.
- В меню Вставка выберите пункт имена, а затем выберите команду определить. Введите имя MyTable и нажмите кнопку ОК.
- Сохраните новую книгу как C:Book1.xls и закройте Excel.
A1: имя B1: LastName
Чтобы добавить записи в MyTable с помощью ADO, можно использовать код, аналогичный приведенному ниже:
VB
‘Create a new connection object for Book1.xls
Dim conn As New ADODB.Connection
conn.Open «Provider=Microsoft.Jet.OLEDB.4.0;» & _
«Data Source=C:Book1.xls;Extended Properties=Excel 8.0;»
conn.Execute «Insert into MyTable (FirstName, LastName)» & _
» values (‘Bill’, ‘Brown’)»
conn.Execute «Insert into MyTable (FirstName, LastName)» & _
» values (‘Joe’, ‘Thomas’)»
conn.Close
Excel 2007
- В Excel 2007 создайте новую книгу.
- Добавьте следующие заголовки в ячейки a1: B1 из Лист1:
- Форматирование ячейки B1 в соответствии с выравниванием по правому краю.
- Выберите a1: B1.
- На ленте щелкните вкладку формулы , а затем выберите команду задать имя. Введите имя MyTable и нажмите кнопку ОК.
- Сохраните новую книгу как C:Book1.xlsx, а затем закройте Excel.
A1: имя B1: LastName
Чтобы добавить записи в таблицу MyTable с помощью ADO, используйте код, похожий на следующий пример кода.
VB
‘Create a new connection object for Book1.xls
Dim conn As New ADODB.Connection
conn.Open «Provider=Microsoft.ACE.OLEDB.12.0;» & _
«Data Source=C:Book1.xlsx;Extended Properties=Excel 12.0;»
conn.Execute «Insert into MyTable (FirstName, LastName)» & _
» values (‘Scott’, ‘Brown’)»
conn.Execute «Insert into MyTable (FirstName, LastName)» & _
» values (‘Jane’, ‘Dow’)»
conn.Close
При добавлении записей в таблицу таким образом форматирование в книге сохраняется. В предыдущем примере новые поля, добавленные в столбец B, отформатированы с использованием выравнивания по правому краю. Каждая запись, добавляемая в строку, помещается в формат из строки над ней.
Обратите внимание, что при добавлении записи к ячейке или ячейкам на листе он перезаписывает все данные, ранее находящиеся в этих ячейках; другими словами, при добавлении новых записей строки в рабочем листе не перемещаются. Это следует учитывать при проектировании макета данных на листах.
Примечание
Метод обновления данных на листе Excel с помощью ADO или с помощью DAO не работает в Visual Basic для среды приложений в Access после установки пакета обновления 2 (SP2) для Office 2003 или после установки обновления для Access 2002, включенного в микропрограммы Статья базы знаний Майкрософт 904018. Этот метод хорошо работает в Visual Basic для приложений в среде приложений из других приложений Office, таких как Word, Excel и Outlook.
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт: 904953 невозможно изменить, добавить или удалить данные в таблицах, связанных с книгой Excel в Office Access 2003 или в Access 2002
Дополнительную информацию об использовании ADO для доступа к книге Excel можно узнать, как запрашивать и обновлять данные Excel с помощью ADO из ASP.
Использование DDE для передачи данных в Excel
DDE является альтернативой автоматизации для связи с Excel и передачи данных; Однако с появлением автоматизации и COM-интерфейс DDE больше не является предпочтительным методом связи с другими приложениями и его следует использовать только в том случае, если вы не можете использовать другие решения.
Для передачи данных в Excel с помощью DDE можно использовать метод Линкпоке для обмена данными с определенным диапазоном ячеек или с помощью метода Линкексекуте для отправки команд, которые будут выполняться приложением Excel.
В приведенном ниже примере кода показано, как установить сеанс DDE с Excel, чтобы можно было выполнять ввод данных в ячейки листа и выполнять команды. С помощью этого примера можно успешно установить сеанс DDE в Линктопик Excel | Мибук. xls книга с именем Мибук. xls должна быть уже открыта в запущенном экземпляре Excel.
Примечание
При использовании Excel 2007 можно сохранить книги, используя новый формат файла XLSX. Убедитесь, что вы обновляете имя файла в приведенном ниже примере кода.
Note (Примечание ) В этом примере Текст1 представляет элемент управления «текстовое поле» в форме Visual Basic:
VB
‘Initiate a DDE communication with Excel
Text1.LinkMode = 0
Text1.LinkTopic = «Excel|MyBook.xls»
Text1.LinkItem = «R1C1:R2C3»
Text1.LinkMode = 1
‘Poke the text in Text1 to the R1C1:R2C3 in MyBook.xls
Text1.Text = «one» & vbTab & «two» & vbTab & «three» & vbCr & _
«four» & vbTab & «five» & vbTab & «six»
Text1.LinkPoke
‘Execute commands to select cell A1 (same as R1C1) and change the font format
Text1.LinkExecute «[SELECT(«»R1C1″»)]»
Text1.LinkExecute «[FONT.PROPERTIES(«»Times New Roman»»,»»Bold»»,10)]»
‘Terminate the DDE communication
Text1.LinkMode = 0
При использовании Линкпоке с Excel необходимо указать диапазон в нотации Row-Column (R1C1) для Линкитем. При Покинг данных к нескольким ячейкам можно использовать строку, в которой столбцы разделяются символами табуляции, а строки — символами возврата каретки.
При использовании Линкексекуте для выполнения команды в Excel необходимо дать команду в виде синтаксиса в формате макросов Excel (XLM). Документация по XLM не входит в состав Excel версий 97 и более поздних версий. DDE не является рекомендуемым решением для связи с Excel. Автоматизация обеспечивает максимальную гибкость и предоставляет вам дополнительный доступ к новым функциям, которые предлагает Excel.
I prepared a VBA Project in Microsoft Excel that has many userforms and macros. I want to export all of the files, but it appears you can only do this one by one, which would take me a very long time.
Is there any way to export the whole project? Thanks!
asked Jul 10, 2015 at 18:32
4
Here is some VBA code that I use to export VBA code:
'Requires Microsoft Visual Basic for Applications Extensibility
Private Function exportvba(Path As String)
Dim objVbComp As VBComponent
Dim strPath As String
Dim varItem As Variant
Dim fso As New FileSystemObject
Dim filename As String
filename = fso.GetFileName(Path)
On Error Resume Next
MkDir ("C:CreatedirectoryforVBACode" & filename & "")
On Error GoTo 0
'Change the path to suit the users needs
strPath = "C:GivedirectorytosaveCodein" & filename & ""
For Each varItem In ActiveWorkbook.VBProject.VBComponents
Set objVbComp = varItem
Select Case objVbComp.Type
Case vbext_ct_StdModule
objVbComp.Export strPath & "" & objVbComp.name & ".bas"
Case vbext_ct_Document, vbext_ct_ClassModule
' ThisDocument and class modules
objVbComp.Export strPath & "" & objVbComp.name & ".cls"
Case vbext_ct_MSForm
objVbComp.Export strPath & "" & objVbComp.name & ".frm"
Case Else
objVbComp.Export strPath & "" & objVbComp.name
End Select
Next varItem
End Function
The Path variable being passed in is the path to the file you want to export code from. If you have more than one file, just use this function in a loop.
answered Jul 13, 2015 at 20:52
ConstuntineConstuntine
4982 silver badges16 bronze badges
Всем привет, сегодня мы поговорим о том, как можно выгрузить данные из Access в такие приложения как Word и Excel. Но не о стандартном способе, который есть в Access (связь с Office), а о способе, который позволяет выгружать данные в заданный шаблон как в Word, так и в Excel.
Другими словами, это нужно тогда, когда создать отчет в Access по шаблону, который уже существует, например, в Word, невозможно или слишком трудоемко. Как Вы знаете, отчет в Access может выводиться просто коряво или, самый распространенный вариант, это когда много текста, который в отчете Access не так хорошо форматируется как в Word, а данных не так много, но отчет необходимо автоматизировать, например это какие-то договора, заявления и так далее.
Использование слияния из самого Word-а не очень удобно, поэтому сегодня я расскажу, как можно заполнять такие шаблоны напрямую из Access, путем нажатия на одну кнопку.
Кроме выгрузки в шаблон Word, иногда возникает и необходимость выгрузки в шаблон Excel, и этот способ мы тоже сегодня рассмотрим.
Содержание
- Экспорт данных из Access в шаблон Word
- Код VBA для выгрузки данных в шаблон Word
- Экспорт данных из Access в шаблон Excel
- Код VBA для выгрузки данных в шаблон Excel
Вся разработка делится на две части, это:
- Настройка шаблона Word;
- Настройка выгрузки данных в шаблон.
Суть настройки шаблона заключается в том, чтобы проставить необходимые поля в тех местах шаблона, где нужно выводить те или иные данные. Это делается с помощью полей формы.
Примечание! Я использую Microsoft Word 2003.
Открываем шаблон Word, для начала добавим необходимую панель инструментов, для этого нажимаем «Вид -> Панель инструментов» и ставим галочку «Формы». Теперь у Вас отобразилась панель инструментом «Формы». Все, что осталось сделать — это вставить в местах, в которых необходимо выводить данные, элементы «Текстовое поле», которые доступны на только что добавленной панели инструментов.
После добавления поля, у Вас появится серая область, которая свидетельствует о том, что поле добавлено. Теперь необходимо задать имя этого поля, для того чтобы потом из access вставлять в него значения (стандартное названия не очень удобное). Для этого щелкните правой кнопкой мыши по полю и нажмите «Свойства». В поле закладка напишите желаемое имя этого поля, я в примере назвал его MyTestPole.
Создайте столько полей, сколько Вам нужно.
На этом настройка шаблона закончена, рекомендую сделать этот шаблон только для чтения, а то пользователь возьмет, сформирует документ и сохранит его, и шаблон тем самым потеряется, а если сделать его только для чтения, то у него такой возможности не будет, только сохранять через «Сохранить как».
Переходим к более интересной задачи, это к реализации самой выгрузки из Access в этот шаблон на VBA.
Примечание! Я использую Access в связке с MS SQL 2008, поэтому и данные буду брать от туда.
Код VBA для выгрузки данных в шаблон Word
Допустим, у Вас есть форма, сделайте на ней кнопку (я назвал ее testbutton) и в событие нажатие кнопки вставьте следующий код VBA:
Private Sub testbutton_Click() 'Объявляем переменные Dim FileDialog As FileDialog Dim rsd As ADODB.Recordset Dim strSQL As String Dim WordApOb As Object Dim WordOb As Object Dim path As String Set rsd = New ADODB.Recordset 'запрос к базе данных для получения необходимых данных strSQL = "select * from dbo.table where KOD = " & Me.kod & "" rsd.open strSQL, CurrentProject.Connection 'Выбираем шаблон Set FileDialog = Application.FileDialog(msoFileDialogOpen) 'убираем множественный выбор, он нам не нужен FileDialog.AllowMultiSelect = False 'очистим и установим фильтры FileDialog.Filters.Clear FileDialog.Filters.add "Word", "*.doc" 'установим фильтр по умолчанию FileDialog.FilterIndex = 1 'проверяем, что сделал user, если выбрал шаблон, то начинаем работу If FileDialog.Show = False Then 'Если нет, то выходим Set dlgFile = Nothing Exit Sub End If 'получаем путь к файлу path = Trim(FileDialog.SelectedItems(1)) 'Очистим переменную Set FileDialog = Nothing If path <> "" Then 'Будем отслеживать ошибки On Error GoTo Err_testbutton_Click 'Создаем объект Word Set WordOb = CreateObject("Word.document") 'Задаем нашему документу значение из шаблона Set WordOb = GetObject(path) 'Задаем значение объекту word.Application Set WordApOb = WordOb.Parent 'делаем приложение word видимым WordApOb.Visible = True 'ищем наше поле в шаблоне WordOb.Bookmarks("mytestpole").Select 'задаем ему новое значение из нашего Recordset WordApOb.Selection.TypeText Text:=Nz(rsd.Fields("field").Value, " ") 'и так далее по всем полям 'в конце перейдем на начало нашего документа WordApOb.Selection.Goto wdGoToFirst 'и активируем его WordApOb.Activate 'Очистим переменные Set WordOb = Nothing Set WordApOb = Nothing Exit_testbutton_Click: Exit Sub Err_testbutton_Click: MsgBox Err.Description 'в случае ошибки будем делать следующие 'закроем word без сохранения WordOb.Close (wddonotsavechanges) WordApOb.Quit 'и также очистим переменные Set WordOb = Nothing Set WordApOb = Nothing Resume Exit_testbutton_Click End If End Sub
Код прокомментирован, поэтому сложностей возникнуть не должно. Здесь весь смысл сводится к созданию объекта word.document и word.application. А после мы уже работаем с нашими объектами, т.е. заполняем их.
Экспорт данных из Access в шаблон Excel
В шаблоне Excel уже не нужно создавать поля как в Word, так как здесь мы уже будем ориентироваться по адресам ячеек.
Существует несколько способов, как заполнять Excel шаблон, я опишу два, первый — это тогда, когда Вам просто необходимо проставить несколько полей, т.е. в источнике данных будет всего одна строка с несколькими столбцами. Второй — это когда строк будет уже несколько, причем Вы не знаете, сколько именно (в зависимости от каких то условий). В шаблоне по умолчанию отведено для этого все пару строк, поэтому мы будем нужные нам строки добавлять, для того чтобы наши данные не накладывалась на строки ниже (допустим там примечание, подпись руководителя и т.д.). И совет, я здесь, для примера, использую всего один источник данных, а Вы, если Вам необходимо заполнить шапку, примечание и некое количество строк (т.е. область данных), можете использовать несколько источников (Recordset).
Код VBA для выгрузки данных в шаблон Excel
Сначала добавьте кнопку на форму (я ее назвал testexcel) и вставьте следующий код в событие «Нажатие кнопки».
Private Sub testexcel_Click() 'Объявляем переменные Dim XL As Object Dim XLT As Object Dim newrow As Object Dim rsd As ADODB.Recordset Dim strSQL As String Set rsd = New ADODB.Recordset 'Запрос к базе данных strSQL = "select * from dbo.table where kod = " & Me.kod & "" rsd.open strSQL, CurrentProject.Connection 'Создаем необходимые объекты Set XL = CreateObject("Excel.Application") 'для примера показываю, как можно сразу загружать шаблон без выбора Set XLT = XL.Workbooks.open("C:testfile.xls") '1 способ - если в источнике данных всего одна строка With XLT.Worksheets("Лист1") .[a1] = rsd.Fields("field1") .[b1] = rsd.Fields("field2") .[c1] = rsd.Fields("field3") .[d1] = rsd.Fields("field4") End With '2 способ - если строк в источнике несколько 'причем мы учтем то, что у нас есть шапка и примечание в Excel 'и мы не знаем, сколько строк у нас вставится 'и поэтому строки будем добавлять в случае необходимости 'зададим, с какой строки будем начинать вставлять данные Rowss = 10 'для нумерации numrow = 1 'запускаем цикл, он будет работать до тех пор, пока не закончатся строки в нашем источнике While Not (rsd.EOF) 'смотрим, если строк больше чем мы задали в шаблоне If Rowss >= 12 Then 'то добавляем строку XLT.Worksheets("Лист1").Rows(Rowss).Insert 'Запомним нашу строку Set newrow = XLT.Worksheets("Лист1").Rows(Rowss) 'и вставим туда копию предыдущей строки 'для того если вдруг у вас там есть объединенные ячейки или какие-то нужные данные 'так как новая строка создастся без всяких объединений и значений XLT.Worksheets("Лист1").Rows(Rowss - 1).Copy newrow 'это просто для примера как можно очистить некий диапазон внутри документа 'XLT.Worksheets("Лист1").Range("A10:F10").ClearContents 'динамически формируем адрес нужной ячейки cell = "a" & Rowss 'и задаем ей значение XLT.Worksheets("Лист1").Range(cell) = numrow cell = "b" & Rowss XLT.Worksheets("Лист1").Range(cell) = rsd.Fields("field5").Value 'переходим на следующую строку Rowss = Rowss + 1 'переходим на следующую строку в источнике данных rsd.MoveNext Else 'а это выполняется до тех пор, пока не закончатся заданные строки в шаблоне 'т.е. если строк в источнике всего 1, то в код, который выше мы даже не попадем cell = "a" & Rowss XLT.Worksheets("Лист1").Range(cell) = numrow cell = "b" & Rowss XLT.Worksheets("Лист1").Range(cell) = rsd.Fields("field5").Value Rowss = Rowss + 1 rsd.MoveNext End If 'для нумерации numrow = numrow + 1 'конец цикла Wend 'это просто пример как можно удалить строку целиком 'XLT.Worksheets("Лист1").Rows(20).Delete 'делаем Excel видимым XL.Visible = True 'Очищаем переменные Set XL = Nothing Set XLT = Nothing Set newrow = Nothing End Sub
Здесь я также все подробно прокомментировал, но если есть вопросы, то задавайте их в комментариях к данной статье.
Для сведения, я здесь при создании объекта и Word.Application и Excel.Application использовал позднее связывание, для того чтобы не добавлять необходимые библиотеки и обеспечить совместимость.
Надеюсь, мои примеры Вам помогут!