Vba excel export to excel

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!

automacro

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

A tool purpose is to generate an input for another program or dashboard.

Input files are mostly requested as text .txt file or as excel .xlsx file.

Using a macro we can export sheets from excel.

Export one sheet as .xlsx file

This program uses a macro that will do the export of single spreadsheets from current workbook. Using the Application.SaveAs  the new workbook is saved as excel file.

Sub ExportSheet_SaveAsDialog()
    Dim wb As Workbook, InitialFileName As String, fileSaveName As String
    InitialFileName = ThisWorkbook.Path & " - Recon_Output_ " & Format(Date, "yyyymmdd")
    Sheets("Final List").Copy
    Set wb = ActiveWorkbook
    fileSaveName = Application.GetSaveAsFilename(InitialFileName:=InitFileName, _
    filefilter:="Excel files , *.xlsx")
    With wb
        If fileSaveName <> "False" Then
            .SaveAs fileSaveName
            .Close
        Else
            .Close False
            Exit Sub
        End If
    End With
End Sub

TIPS:

  1. For the VBA macro to export one SpreadSheet export as text .txt file check HERE.
  2. For the VBA macro to export multiple SpreadSheets export as excel .xlsx file check HERE.

Способы переноса данных в 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

  1. Создайте новую книгу в Excel.
  2. Добавьте следующие заголовки в ячейки a1: B1 из Лист1:
  3. A1: имя B1: LastName

  4. Форматирование ячейки B1 в соответствии с выравниванием по правому краю.
  5. Выберите a1: B1.
  6. В меню Вставка выберите пункт имена, а затем выберите команду определить. Введите имя MyTable и нажмите кнопку ОК.
  7. Сохраните новую книгу как C:Book1.xls и закройте Excel.

Чтобы добавить записи в 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

  1. В Excel 2007 создайте новую книгу.
  2. Добавьте следующие заголовки в ячейки a1: B1 из Лист1:
  3. A1: имя B1: LastName

  4. Форматирование ячейки B1 в соответствии с выравниванием по правому краю.
  5. Выберите a1: B1.
  6. На ленте щелкните вкладку формулы , а затем выберите команду задать имя. Введите имя MyTable и нажмите кнопку ОК.
  7. Сохраните новую книгу как C:Book1.xlsx, а затем закройте Excel.

Чтобы добавить записи в таблицу 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.

  • Remove From My Forums
  • Question

  • User-1971168174 posted

    Hi Support,

    I am showing data in GridView which shows data as per query entered by user in multiline textbox above.

    But now the requirement is when export button is clicked I need to export data as well as query in macro ,
    so that user can refresh data next time in the excel itself.

    Please help me with any  working sample.

    Thanks in Advance!

Answers

  • User-1330468790 posted

    Hi Manish,

    In short,  EPPlus supports Creating, Reading and Writing VBA. Execution/Interpretation of VBA code is not supported.

    Then, the only thing you need to make sure is that the user should have VBE installed with Excel.

    The solution for you to export the data to excel with Macro is that you use EPPlus to construct a sheet and VBA project in the excel work book.

    After that, users will load the excel file to their computers and enable the macro for the excel.

    Tips: 

    1. file extension should be .xlsm and content type should be «application/vnd.ms-excel.sheet.macroEnabled.12» (see
      this link
    2. The VBA project must be created in the workbook using codes : excel.Workbook.CreateVBAProject();
    3. You could access the VBA code using «excel.Workbook.VbaProject.Modules[«module_name»].Code» or directly using «excel.Workbook.CodeModule.Code«

    More details, you could refer to below codes:

    ASPX Page:

    <form id="form1" runat="server">
            <div>
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
                    <Columns>
                        <asp:BoundField DataField="Id" HeaderText="ID" />
                        <asp:BoundField DataField="Name" HeaderText="Name" />
                    </Columns>
                </asp:GridView>
            </div>
            <asp:Button ID="BtnExport" runat="server" Text="Export To Excel" OnClick="BtnExport_Click" />
        </form>

    Code behind:

    // Simulation of the data
            private static DataTable _gridviewDT;
            public static DataTable GridviewDT
            {
                get
                {
                    if (_gridviewDT is null)
                    {
                        _gridviewDT = new DataTable();
    
                        _gridviewDT.Columns.Add("Id", typeof(int));
                        _gridviewDT.Columns.Add("Name", typeof(string));
    
                        _gridviewDT.Rows.Add(1, "name1");
                        _gridviewDT.Rows.Add(2, "name2");
                        _gridviewDT.Rows.Add(3, "name3");
                        _gridviewDT.Rows.Add(4, "name4");
                        _gridviewDT.Rows.Add(5, "name5");
    
                    }
    
                    return _gridviewDT;
                }
                set
                {
                    _gridviewDT = value;
                }
            }
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    BindGridView();
                }
            }
    
            protected void BindGridView()
            {
                GridView1.DataSource = GridviewDT;
                GridView1.DataBind();
            }
    
            protected void BtnExport_Click(object sender, EventArgs e)
            {
    // Add values and you could also add styles within some extra codes ExcelPackage excel = new ExcelPackage(); var workSheet = excel.Workbook.Worksheets.Add("Data"); var totalCols = GridView1.Rows[0].Cells.Count; var totalRows = GridView1.Rows.Count; var headerRow = GridView1.HeaderRow; for (var i = 1; i <= totalCols; i++) { workSheet.Cells[1, i].Value = headerRow.Cells[i - 1].Text; } for (var j = 1; j <= totalRows; j++) { for (var i = 1; i <= totalCols; i++) { var DataRow = GridviewDT.Rows[j - 1]; workSheet.Cells[j + 1, i].Value = DataRow[i - 1].ToString(); } } // Add macro excel.Workbook.CreateVBAProject(); StringBuilder vbaCode = new StringBuilder(); vbaCode.AppendLine("Private Sub Workbook_Open()"); vbaCode.AppendLine(" MsgBox "Hello""); vbaCode.AppendLine("End Sub"); //If you want to add code to some specific module, uncomment the below line //excel.Workbook.VbaProject.Modules["Data"].Code = "VBA Codes" excel.Workbook.CodeModule.Code = vbaCode.ToString(); using (var memoryStream = new MemoryStream()) { Response.ContentType = "application/vnd.ms-excel.sheet.macroEnabled.12"; Response.AddHeader("content-disposition", "attachment; filename=DataWithMacro.xlsm"); excel.SaveAs(memoryStream); memoryStream.WriteTo(Response.OutputStream); Response.Flush(); Response.End(); } }

    Result:

    page:

    Excel:

    Hope helps.

    Best regards,

    Sean

    • Marked as answer by

      Thursday, October 7, 2021 12:00 AM

  • Automation, VBA Automation

VBA Code to Export Access data to Excel

Table of Contents

Export Access data to Excel using VBA (with Images & Code)

What is it?

This VBA code helps you to export data in Access Table to Excel in one click.

Why is it?

You can upload or export Access data to Excel without even opening the Excel Workbook.

How to Export Access data to Excel

Step 1: Open the Access DB and got to VBA code builder (Alt + F11) and Open a New Module.

Export Access Data To ExcelPin

Step 2: Copy and Paste the below code in it.

				
					Sub exportToXl()

On Error GoTo ErrorHandler

Dim dbTable As String

Dim xlWorksheetPath As String

xlWorksheetPath = "C:" ‘Mention the xlWorkbook path

xlWorksheetPath = xlWorksheetPath & "xlWorkbookName.xlsx"  ‘Replace the ‘xlWorkbookName.xlsx’ with your workbook name

dbTable = "tblMaster" ‘Replace ‘tblMaster’ with the table in the Access DB from which you want to export the data

DoCmd.TransferSpreadsheet transfertype:=acExport, spreadsheettype:=acSpreadsheetTypeExcel12, tablename:=dbTable, FileName:=xlWorksheetPath, hasfieldnames:=True

ErrorHandlerExit:

Exit Sub

ErrorHandler:

MsgBox "Error No: " & Err.Number & ";Description: " & Err.Description

Resume ErrorHandlerExit

End Sub
				
			

Step 3: Click the Run button or F5 or the Command button to which you have associated this code!

In case you are assigning the code to a Command button make sure the code is within the Private/Public Sub_Event(); Something like the below

Private Sub exportToXl_Click()

Export Access Data To Excel

Access DB records have been successfully uploaded to Excel, Open your Excel workbook and check the data.

Note: Make sure ‘Microsoft ActiveX Data Objects Library’ is enabled from the Tools – References (use latest version [6.1 as of this post]).

Export Access Data To Excel_AdodbPin

I’m sure you work on lots of Excel data, MS Access and VBA, so I Strongly Recommend you to Join the below Ultimate Excel VBA Userform with Access Database! Its a worth Investment in Yourself! DO IT NOW!

Build Your Own Real World Program, Learn Real Excel VBA(Macros), Exceed The Limits of Excel with Complete Project

Anson Antony

Anson Antony

Anson is a contributing author and founder at ASKEYGEEK.com. Learning anything new has always been his passion, ASKEYGEEK.com is an outcome of his passion for technology and business. He has got a decade of versatile experience in Business Process Outsourcing, Finance & Accounting, Information Technology, Operational Excellence & Business Intelligence. During the tenure, he had worked for organizations like Genpact, Hewlett Packard, M*Modal and Capgemini in various roles and responsibilities. Outside business and technology, he is a movie buff who spends hours together watching and learning Cinema and a Film Maker too!

3 Responses

  1. Thank you for the vba code. But it worked for once. I’m getting the following error “Error no. 3027. Cannot update. Database or object is read only

  2. I want to append to the spreadsheet monthly. Data has to go into specific format. I thought there is command that has row/column arguments. Once used a workspace to loop through records stepping the cell address. was I dreaming? Thanks

Leave a Reply

Like this post? Please share to your friends:
  • Vba excel exit from sub
  • Vba excel exit all subs
  • Vba excel evaluate пример
  • Vba excel error codes
  • Vba excel error code