Аннотация: Чтобы использовать VBA, необходимо иметь представление об объектной модели приложения. Модель объектов показывает структуру объектов офисного приложения и их взаимосвязи.
14.1. Модель объектов
Чтобы использовать VBA, необходимо иметь представление об объектной модели приложения. Модель объектов показывает структуру объектов офисного приложения и их взаимосвязи. Каждое приложение предоставляет множество взаимосвязанных объектов. Объектами являются сами приложения Application (центральный или корневой объект) и их компоненты (встроенные объекты).
Примеры объектов
MS Excel – рабочий лист Worksheet, рабочая книга Workbook, диаграмма Chart
MS Access – форма Form, отчет Report
MS Word – документ Document, абзац текста Paragraph
MS Power Point – презентация Presentation, слайд Slide
Каждый элемент меню, каждая командная кнопка, любой элемент офисного документа являются объектами MS Office, которыми можно управлять программно.
Подробно структура объектов, синтаксис свойств и методов, перечень событий рассматриваются в справочнике по VBA (Help) соответствующего приложения. Справка по Visual Basic на рис.14.1 отражает структуру справочника VBA для MS Word. Нажатие на Microsoft Word Object Model развернет структуру объектов MS Word. В MS Excel это строка Microsoft Excel Object Model, а в MS PowerPoint строка имеет название Microsoft PowerPoint Object Model.
Рис.
14.1.
Структура справочника VBA MS Word
На рис.14.2 представлены два фрагмента модели объектов MS Excel: фрагмент объекта Application и фрагмент объекта Range; видна иерархическая структура объекта Range, который подчинен объекту Application.
Рис.
14.2.
Модель объектов MS Excel
Модель объектов отражает иерархические связи между объектами. На нулевом уровне иерархии расположен центральный объект, представляющий само приложение, которому подчинены другие объекты, составляющие первый уровень иерархии. Каждому из объектов первого и последующих уровней могут быть подчинены объекты следующего уровня и т. д. Например, в объекте Document содержатся объекты Paragraph. Доступ к объектам любого уровня возможен, если выполняется приложение, т. е. объект Application существует.
Модель объектов содержит простые объекты и коллекции объектов. Коллекция объектов (Collection) – это объект специального типа, существующий для управления объектами группы. Например, Workbooks является коллекцией всех открытых рабочих книг – объектов Workbook, а Worksheets – коллекцией рабочих листов некоторой рабочей книги – объектов Worksheet. Количество элементов коллекции заранее не фиксируется. Новый элемент может быть добавлен в произвольное место коллекции.
Операторы языка могут обращаться как к отдельному элементу коллекции (к объекту Workbook или к объекту Worksheet), так и ко всем объектам коллекции одновременно (к объекту Workbooks или к объекту Worksheets). Коллекция объектов и объекты этой коллекции обладают различными свойствами и методами.
Коллекция объектов, объединяя группу подобных объектов, является упорядоченной совокупностью объектов. Для доступа к конкретному объекту в коллекции можно использовать его имя или порядковый номер в коллекции: например, Workbooks(1) указывает на первую рабочую книгу, а Worksheets(«Sheet2») указывает на лист с именем Sheet2. Элементы коллекции перенумеровываются при удалении или добавлении элементов в коллекцию.
Совокупность объектов приложения определяет содержимое и функциональные возможности приложения, а конкретные объекты, их свойства и методы – позволяют получить доступ к содержимому и функциональным возможностям объекта. В общем случае свойства описывают сам объект или его содержимое, а методы позволяют управлять функциональными возможностями объекта.
14.2. Просмотр объектов, их свойств и методов (Object Browser)
Средство Object Browser предоставляет возможность просмотра и поиска объектов, их свойств и методов. Это средство доступно только в редакторе VB. Object Browser вызывается нажатием на пиктограмму или одноименной командой из меню View. Можно нажать клавишу F2.
Окно Object Browser
Окно Object Browser (рис.14.3) отображает классы, свойства, методы, события и константы объектных библиотек и процедур проекта. Средство Object Browser не дает представления об иерархии объектов.
Окно Object Browser состоит из нескольких раскрывающихся списков и панелей (окон), каждая из которых отображает часть результата поиска. Линии разбивки, разделяющие панели этого окна, позволяют изменять их размеры.
Верхний левый список на рис.14.3 называется Projects/Libraries и содержит перечень моделей объектов и библиотек, доступных для активного проекта (рис.14.4). При выборе значения All Libraries отображаются объекты всех доступных библиотек и проектов. Объект Office этого списка содержит объекты, общие для офисных приложений.
После выбора модели объектов в окне классов появляется перечень классов. Список всегда начинается с класса globals, компоненты которого доступны во всех модулях проекта.
После выделения класса компоненты этого класса отображаются в окне справа (рис.14.3). Компоненты класса обычно упорядочены по алфавиту. Порядок сортировки изменяется командой Group Members (Компоненты группы) контекстного меню. Каждому типу компонента соответствует свой значок (см. таблицу 14.1). Подробно см. Help, статья «Icons Used in the Object Browser and Code Windows». Если для класса или для компонента класса существует программный код, соответствующая строка выделяется жирным шрифтом.
Рис.
14.3.
Окно Object Browser
Рис.
14.4.
Перечень доступных библиотек
В окне описания (нижняя панель на рис.14.3) высвечиваются краткие сведения по выделенному компоненту. Панель описания компонента показывает синтаксис выбранного объекта. Кроме формального описания, здесь обычно содержатся гиперссылки, нажатие на которые высвечивает соответствующую статью из Help’а.
В окне классов на рис.14.3 отражена модель объектов MS Excel, выделен объект Sheets,в окне компонентов перечислены свойства, методы и события коллекции Sheets и показаны сведения о методе Add этой коллекции.
Панель инструментов Object Browser
На панели инструментов расположены кнопки, облегчающие поиск объектов приложения (см. рис.14.3).
Go Back позволяет перейти к объекту, ранее выбранному в списке компонентов класса.
Go Forward повторяет выбор объектов в списке компонентов класса, если осуществлялся возврат к ранее выбранному объекту.
Copy to Clipboard копирует текст из окна описания после выделения нужного фрагмента, например, имени процедуры со списком формальных параметров. Если фрагмент не выделен, то копируется только название компонента. Допускается перетаскивание мышью текста из окна описания в окно модуля. Можно использовать команду Copy из контекстного меню окна описания.
View Definition помещает курсор в окно описания выделенного класса или компонента.
Search выполняет поиск библиотек, название компонентов которых соответствует образцу текста в поисковой строке Search Text. В этой строке можно вводить или выбирать искомый текст. Запоминаются значения четырех последних поисковых строк. В строке поиска допускается использование стандартных подстановочных символов. Команда Find Whole Word Only («Только слово целиком») контекстного меню пиктограммы поиска задает поиск целых слов. Если поиск произведен успешно, то сведения о найденных компонентах размещаются на панели результатов поиска – панели Search Results. Эта панель отображает найденные библиотеки в алфавитном порядке. На рис.14.3 показан результат поиска метода Add.
Hide/Show Search Results сворачивает или раскрывает окно результата поиска соответственно.
Help переключает в справочник по VBA на статью о компоненте, высвеченном в окне описания.
Выход из Object Browser
Переход к редактируемой процедуре осуществляется простым щелчком мыши, если текст процедуры виден на экране. В противном случае можно закрыть окно Object Browser нажатием на кнопку закрытия окна. При этом содержание справки сохраняется до следующего вызова Object Browser.
Можно в списке проектов/библиотек выбрать название нужного проекта, и тогда в окне классов появятся компоненты проекта (рис.14.5). Двойной щелчок на имени процедуры или названии модуля (процедурного листа) переводит в редактор VB.
Рис.
14.5.
Перечень процедур проекта
In my (out of print) book,Dashboard Reporting With Excel, I recommended that you “steal” ideas for Excel reports from business magazines. I recently had another opportunity to follow my own advice.
A recent issue of Business Week carried an ad for Fidelity Investments. The ad largely consisted of a table showing their investor’s returns. The table consisted of a blue square with overlapping semi-transparent bright green bars.
This figure shows my version of the Fidelity display. Instead of using Fidelity’s colors and data, I used brown and green colors, and I used data about the revenues of three web search companies. The data was provided by Hoovers.com.
This tutorial explains how to create this figure in Excel. Even if you don’t need a figure like this, just creating it will teach you about useful but little-used areas of Excel: the Camera object, grouped worksheets, and transparent AutoShapes.
Setting Up the Data in Excel
Start by creating a rough version of the simple table shown below.
Enter the three-word title shown in cell C2. To center it in the four columns as shown, select the range C2:F2 and chose Format, Cells. In the Format Cells dialog, specify Center Across Selection for the horizontal text alignment.
In cell B10, enter “Total” followed by three spaces. Then click on the Align Right button on your toolbar to position the label as shown.
Enter the data in every other row, as shown. To expand the row heights, first select the entire rows 2 through 10. To do so, click and drag your mouse pointer from the row header for row 2 through the row header for row 10. Then, when you hover over the border between any two of the selected rows, your mouse pointer will change shape. When it does, you can click and drag to make the rows taller.
After they are about tall enough, select rows 5 and 7 to make them shorter. To do so, select row 5; hold down your Control key; then select row 7. Now, when you click and drag the height of one of the rows, the other row adjusts to the same height.
Select all of the data and vertically align the text to the center of their rows. To do so, choose Format, Cells. In the Alignment tab, in the Vertical list, choose Center.
Indent the three company names slightly. To do so, select the range B4:B8. Choose Format, Cells. In the Alignment tab, in its Horizontal list box, choose Left (Indent). And then specify an Indent of 1.
Adjust the column widths about as shown. You’ll have the chance to adjust them again later.
Don’t worry about the precise row heights or column widths at this point. You’ll be able to adjust them later.
To assign a number format for the data, select the area with the numbers. Then choose Format, Cells. In the Number tab, choose Custom. Then select the “#,##0” format near the top of the Type list.
Set Up the Second Worksheet
You will create this display using two worksheets that have identical row heights and column widths. You will see why this is important in a few minutes.
To set up the second worksheet, you copy the first one. The easiest way to do that is to hold down your Ctrl key then click and drag the tab at the bottom of your worksheet to the right. When you do so, Excel adds a small image of a document with a plus sign to your mouse pointer. Once you see that plus sign you can release your mouse button to copy the worksheet.
Alternatively, to copy the worksheet, you can right-click on the tab, choose Move or Copy, and then complete the instructions in the Move or Copy dialog.
Name the left sheet Report and the right sheet Data. To do so, double-click the text in a tab to select it. You now can enter the label.
In the Report sheet, select all data and delete it using your Delete key.
You now have two worksheets with identical formats in your workbook. The Report sheet will contain the formatting and drawing objects, but no data. The Data sheet will contain data, but only minimal formatting.
Finally, for future convenience, assign the range name Data to your data range of data in the Data sheet. To do so, choose Insert, Name, Define. In the Define Name dialog, enter the name Data and a Refers-To reference of:
=Data!$B$2:$G$10
Set Up the Excel Drawing Objects
Before you can set up drawing objects, you need to make sure that your Drawing toolbar is displayed. Choose Tools, Customize. In the Toolbars tab, make sure that Drawing is checked. Then choose OK.
First set up the brown rectangle object. To do so, click AutoShapes in the Drawing toolbar; in the Basic Shapes menu item, choose the Rounded Rectangle object. When you do so, Excel turns your mouse pointer to a cross bar. Click and drag in the general area of the rectangle shown here.
To position the rectangle, hold down your Alt key then click and drag the rectangle. As you do so, notice that the object jumps from cell to cell. This makes it easy for you to position the top-left corner of the rectangle in cell C2.
After the top-left corner is in cell C2, position the bottom-right corner in cell F11. To do so, select the rectangle; hold down your Alt key, click on the selector circle near the bottom right corner of the object; then click and drag the bottom-right corner into into the bottom-right corner of cell F11.
Similarly, create a second Rounded Rectangle object and position it within the range B4:G4.
Copy the rectangle and paste it three times. Position two of the copies in B6 and B8 as shown. Position the last copy in cell B10. Then click on the last object’s center selection handle at its left side and drag the handle to the right. As you do so, you reduce the object’s width. Position the left side about as shown in the figure.
Format the Rounded Rectangles
Let’s assign a standard Excel color to the first object.
To do so, select the object, right-click it, and choose Format AutoShape. In the Colors and Lines tab, in the Fill dropdown list, choose the Brown color, which is the darkest orange color. In the Line dropdown list, choose No Line.
You can format the other objects in one step. To do so, you first select them. The Select Objects tool makes this easy to do. To launch the tool, click on the arrow shown here, which is on your Drawing toolbar. When you do so, your mouse pointer takes the shape of the arrow shown.
Now you can click a cell in your spreadsheet and drag the selection grid to surround the four rectangles that you need to format. When you release your pointer, Excel selects all objects that are entirely within the selection grid.
To dismiss the Select Objects tool, press the Esc key.
With the other four selected (the ones that are dark green), begin as you did before. Right-click any of the selected objects, choose Format AutoShape. In the Colors and Lines tab, in the Fill dropdown list, choose the Dark Green color. In the Line dropdown list, choose No Line. Also, however, slide the Transparency slider to 50%. Then choose OK.
You have one more adjustment to make.
The rounded corners of your brown rectangle probably will be much larger than the ones shown above. To make the rounded corners smaller, click on the object. When you do so, you’ll see a yellow handle in the top-left corner of the object. Drag the yellow handle up and to the left to make the corners smaller. (You could drag the handle down and to the right to make the rounded corners larger.)
Your five objects now should look somewhat like they do in this figure, but your colors will be different.
Add Excel’s Camera Object
Excel’s Camera object returns a picture of the range that it references. It works great for this application.
(Warning: Do not use the Camera object to display charts. A bug in Excel could resize your charts if you point a Camera object at them.)
You can use Camera objects without using the Camera icon. But if you intend to use the Camera tool a lot (which I do), you can set up its icon on one of your Excel toolbars. To do so, choose Tools, Customize. In the Commands tab, select Tools in the Categories list. In the Commands list, scroll about 60% of the way down the list, where you’ll see the Camera icon:
Click and drag this icon to any convenient toolbar in Excel.
To set up the Camera tool for this report, first create a Camera object on your Report sheet. To do so, temporarily enter any character in cell A1.
To create the object with the Camera tool, first select cell A1. Click on the Camera icon, then click on any nearby cell. When you do so, Excel drops a live picture of cell A1 wherever you clicked.
To create the object without using the Camera tool, copy cell A1 and then select a nearby cell. Hold down your Shift key and then choose Edit, Paste Picture Link. When you do so, Excel copies the Camera tool object to the active cell.
Select the Camera object if necessary. Notice the formula =$A$1 in the formula bar. To get the Camera object to display the data in the Data sheet, this formula needs to reference the range that contains those numbers, which is named Data.
To modify the formula, select it in your formula bar and enter:
=Data
When you press Enter, the camera object should display a picture of your data from your Data sheet.
Now you can erase the character you entered in cell A1 of the Report sheet.
Format Excel’s Camera Object
Initially, the next step might look like you’ve made a mistake. You need to move the Camera object into position on top of your colored rectangles. To do so, first select the Camera object. Hold down your Alt key. Then click and drag the object so that its top-left corner is positioned in the top-left corner of cell B2.
If you used the Camera tool to create your Camera object, the object will obscure your colored rectangles, and it will have a border line. To remove those settings, right-click the object and choose Format Picture. In the Colors and Lines tab, set the fill color to No Fill and the line color to No Line.
Format Your Data
Because the rounded rectangles have a dark color, the black font doesn’t show up very well against them. You therefore need to change the font color to white.
To do so, first select the data range. To do so quickly press the F5 function key to launch the Go To dialog, type Data in the Reference box, then press Enter.
With the Data range selected, assign a white font using the Font Color icon on your Excel toolbar.
Now, when you activate the Report sheet, you should see your report’s white fonts displayed on top of your colored rectangles.
Adjust the Figure
It’s likely that the rows and columns in your figure need to be adjusted. Here’s a trick that allows you to do it easily:
Select your Report sheet; hold down the Shift key then click on the Data tab. When you do so, both sheets will be selected. Also, in the title bar, Excel displays “[Group]”. Now, any adjustment you make to the Report sheet also will be made to the Data sheet.
That is, when you click and drag to adjust the rows and columns in your report, you also adjust the rows and columns in the Data sheet. Normally this wouldn’t be important. But because we’re using the Camera object, we need to keep the positioning of the two sheets exactly in sync, and this trick will do it for us.
If you need to select one of the rectangles for any reason, you might run into two problems.
First, notice that Excel won’t let you select one of the rectangles when both sheets are selected. Therefore, if your Report sheet is active, select the Data sheet (or some other sheet in your workbook) to ungroup your worksheets. Then select the Report sheet again. Now you can activate the objects on your Report sheet.
Second, because the Camera object covers your colored rectangles, you probably will have a difficult time selecting them with your mouse pointer. To do so easily, you can use the Select Objects tool. As described above, use it to encircle only the objects that you want to select.
One final adjustment that you might want to make is to apply different colors to the figure. To illustrate, here’s the same figure in blue and gray. Whatever colors you choose, keep in mind that you can adjust their intensity by adjusting the degree of transparency for any of the five colored objects.
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
Термин Объекты Excel (понимаемый в широком смысле, как объектная модель Excel) включает в себя элементы, из которых состоит любая рабочая книга Excel. Это, например, рабочие листы (Worksheets), строки (Rows), столбцы (Columns), диапазоны ячеек (Ranges) и сама рабочая книга Excel (Workbook) в том числе. Каждый объект Excel имеет набор свойств, которые являются его неотъемлемой частью.
Например, объект Worksheet (рабочий лист) имеет свойства Name (имя), Protection (защита), Visible (видимость), Scroll Area (область прокрутки) и так далее. Таким образом, если в процессе выполнения макроса требуется скрыть рабочий лист, то достаточно изменить свойство Visible этого листа.
В Excel VBA существует особый тип объектов – коллекция. Как можно догадаться из названия, коллекция ссылается на группу (или коллекцию) объектов Excel. Например, коллекция Rows – это объект, содержащий все строки рабочего листа.
Доступ ко всем основным объектам Excel может быть осуществлён (прямо или косвенно) через объект Workbooks, который является коллекцией всех открытых в данный момент рабочих книг. Каждая рабочая книга содержит объект Sheets – коллекция, которая включает в себя все рабочие листы и листы с диаграммами рабочей книги. Каждый объект Worksheet состоит из коллекции Rows – в неё входят все строки рабочего листа, и коллекции Columns – все столбцы рабочего листа, и так далее.
В следующей таблице перечислены некоторые наиболее часто используемые объекты Excel. Полный перечень объектов Excel VBA можно найти на сайте Microsoft Office Developer (на английском).
Объект | Описание |
---|---|
Application | Приложение Excel. |
Workbooks | Коллекция всех открытых в данный момент рабочих книг в текущем приложении Excel. Доступ к какой-то конкретной рабочей книге может быть осуществлён через объект Workbooks при помощи числового индекса рабочей книги или её имени, например, Workbooks(1) или Workbooks(«Книга1»). |
Workbook | Объект Workbook – это рабочая книга. Доступ к ней может быть выполнен через коллекцию Workbooks при помощи числового индекса или имени рабочей книги (см. выше). Для доступа к активной в данный момент рабочей книге можно использовать ActiveWorkbook.
Из объекта Workbook можно получить доступ к объекту Sheets, который является коллекцией всех листов рабочей книги (рабочие листы и диаграммы), а также к объекту Worksheets, который представляет из себя коллекцию всех рабочих листов книги Excel. |
Sheets | Объект Sheets– это коллекция всех листов рабочей книги. Это могут быть как рабочие листы, так и диаграммы на отдельном листе. Доступ к отдельному листу из коллекции Sheets можно получить при помощи числового индекса листа или его имени, например, Sheets(1) или Sheets(«Лист1»). |
Worksheets | Объект Worksheets – это коллекция всех рабочих листов в рабочей книге (то есть, все листы, кроме диаграмм на отдельном листе). Доступ к отдельному рабочему листу из коллекции Worksheets можно получить при помощи числового индекса рабочего листа или его имени, например, Worksheets(1) или Worksheets(«Лист1»). |
Worksheet | Объект Worksheet – это отдельный рабочий лист книги Excel. Доступ к нему можно получить при помощи числового индекса рабочего листа или его имени (см. выше).
Кроме этого Вы можете использовать ActiveSheet для доступа к активному в данный момент рабочему листу. Из объекта Worksheet можно получить доступ к объектам Rows и Columns, которые являются коллекцией объектов Range, ссылающихся на строки и столбцы рабочего листа. А также можно получить доступ к отдельной ячейке или к любому диапазону смежных ячеек на рабочем листе. |
Rows | Объект Rows – это коллекция всех строк рабочего листа. Объект Range, состоящий из отдельной строки рабочего листа, может быть доступен по номеру этой строки, например, Rows(1). |
Columns | Объект Columns – это коллекция всех столбцов рабочего листа. Объект Range, состоящий из отдельного столбца рабочего листа, может быть доступен по номеру этого столбца, например, Columns(1). |
Range | Объект Range – это любое количество смежных ячеек на рабочем листе. Это может быть одна ячейка или все ячейки листа.
Доступ к диапазону, состоящему из единственной ячейки, может быть осуществлён через объект Worksheet при помощи свойства Cells, например, Worksheet.Cells(1,1). По-другому ссылку на диапазон можно записать, указав адреса начальной и конечной ячеек. Их можно записать через двоеточие или через запятую. Например, Worksheet.Range(«A1:B10») или Worksheet.Range(«A1», «B10») или Worksheet.Range(Cells(1,1), Cells(10,2)). Обратите внимание, если в адресе Range вторая ячейка не указана (например, Worksheet.Range(«A1») или Worksheet.Range(Cells(1,1)), то будет выбран диапазон, состоящий из единственной ячейки. |
Приведённая выше таблица показывает, как выполняется доступ к объектам Excel через родительские объекты. Например, ссылку на диапазон ячеек можно записать вот так:
Workbooks("Книга1").Worksheets("Лист1").Range("A1:B10")
Содержание
- Присваивание объекта переменной
- Активный объект
- Смена активного объекта
- Свойства объектов
- Методы объектов
- Рассмотрим несколько примеров
- Пример 1
- Пример 2
- Пример 3
Присваивание объекта переменной
В Excel VBA объект может быть присвоен переменной при помощи ключевого слова Set:
Dim DataWb As Workbook Set DataWb = Workbooks("Книга1.xlsx")
Активный объект
В любой момент времени в Excel есть активный объект Workbook – это рабочая книга, открытая в этот момент. Точно так же существует активный объект Worksheet, активный объект Range и так далее.
Сослаться на активный объект Workbook или Sheet в коде VBA можно как на ActiveWorkbook или ActiveSheet, а на активный объект Range – как на Selection.
Если в коде VBA записана ссылка на рабочий лист, без указания к какой именно рабочей книге он относится, то Excel по умолчанию обращается к активной рабочей книге. Точно так же, если сослаться на диапазон, не указывая определённую рабочую книгу или лист, то Excel по умолчанию обратится к активному рабочему листу в активной рабочей книге.
Таким образом, чтобы сослаться на диапазон A1:B10 на активном рабочем листе активной книги, можно записать просто:
Смена активного объекта
Если в процессе выполнения программы требуется сделать активной другую рабочую книгу, другой рабочий лист, диапазон и так далее, то для этого нужно использовать методы Activate или Select вот таким образом:
Sub ActivateAndSelect() Workbooks("Книга2").Activate Worksheets("Лист2").Select Worksheets("Лист2").Range("A1:B10").Select Worksheets("Лист2").Range("A5").Activate End Sub
Методы объектов, в том числе использованные только что методы Activate или Select, далее будут рассмотрены более подробно.
Свойства объектов
Каждый объект VBA имеет заданные для него свойства. Например, объект Workbook имеет свойства Name (имя), RevisionNumber (количество сохранений), Sheets (листы) и множество других. Чтобы получить доступ к свойствам объекта, нужно записать имя объекта, затем точку и далее имя свойства. Например, имя активной рабочей книги может быть доступно вот так: ActiveWorkbook.Name. Таким образом, чтобы присвоить переменной wbName имя активной рабочей книги, можно использовать вот такой код:
Dim wbName As String wbName = ActiveWorkbook.Name
Ранее мы показали, как объект Workbook может быть использован для доступа к объекту Worksheet при помощи такой команды:
Workbooks("Книга1").Worksheets("Лист1")
Это возможно потому, что коллекция Worksheets является свойством объекта Workbook.
Некоторые свойства объекта доступны только для чтения, то есть их значения пользователь изменять не может. В то же время существуют свойства, которым можно присваивать различные значения. Например, чтобы изменить название активного листа на «Мой рабочий лист«, достаточно присвоить это имя свойству Name активного листа, вот так:
ActiveSheet.Name = "Мой рабочий лист"
Методы объектов
Объекты VBA имеют методы для выполнения определённых действий. Методы объекта – это процедуры, привязанные к объектам определённого типа. Например, объект Workbook имеет методы Activate, Close, Save и ещё множество других.
Для того, чтобы вызвать метод объекта, нужно записать имя объекта, точку и имя метода. Например, чтобы сохранить активную рабочую книгу, можно использовать вот такую строку кода:
Как и другие процедуры, методы могут иметь аргументы, которые передаются методу при его вызове. Например, метод Close объекта Workbook имеет три необязательных аргумента, которые определяют, должна ли быть сохранена рабочая книга перед закрытием и тому подобное.
Чтобы передать методу аргументы, необходимо записать после вызова метода значения этих аргументов через запятую. Например, если нужно сохранить активную рабочую книгу как файл .csv с именем «Книга2», то нужно вызвать метод SaveAs объекта Workbook и передать аргументу Filename значение Книга2, а аргументу FileFormat – значение xlCSV:
ActiveWorkbook.SaveAs "Книга2", xlCSV
Чтобы сделать код более читаемым, при вызове метода можно использовать именованные аргументы. В этом случае сначала записывают имя аргумента, затем оператор присваивания «:=» и после него указывают значение. Таким образом, приведённый выше пример вызова метода SaveAs объекта Workbook можно записать по-другому:
ActiveWorkbook.SaveAs Filename:="Книга2", [FileFormat]:=xlCSV
В окне Object Browser редактора Visual Basic показан список всех доступных объектов, их свойств и методов. Чтобы открыть этот список, запустите редактор Visual Basic и нажмите F2.
Рассмотрим несколько примеров
Пример 1
Этот отрывок кода VBA может служить иллюстрацией использования цикла For Each. В данном случае мы обратимся к нему, чтобы продемонстрировать ссылки на объект Worksheets (который по умолчанию берётся из активной рабочей книги) и ссылки на каждый объект Worksheet отдельно. Обратите внимание, что для вывода на экран имени каждого рабочего листа использовано свойство Name объекта Worksheet.
'Пролистываем поочерёдно все рабочие листы активной рабочей книги 'и выводим окно сообщения с именем каждого рабочего листа Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден рабочий лист: " & wSheet.Name Next wSheet
Пример 2
В этом примере кода VBA показано, как можно получать доступ к рабочим листам и диапазонам ячеек из других рабочих книг. Кроме этого, Вы убедитесь, что если не указана ссылка на какой-то определённый объект, то по умолчанию используются активные объекты Excel. Данный пример демонстрирует использование ключевого слова Set для присваивания объекта переменной.
В коде, приведённом ниже, для объекта Range вызывается метод PasteSpecial. Этот метод передаёт аргументу Paste значение xlPasteValues.
'Копируем диапазон ячеек из листа "Лист1" другой рабочей книги (с именем Data.xlsx) 'и вставляем только значения на лист "Результаты" текущей рабочей книги (с именем CurrWb.xlsm) Dim dataWb As Workbook Set dataWb = Workbooks.Open("C:Data") 'Обратите внимание, что DataWb – это активная рабочая книга. 'Следовательно, следующее действие выполняется с объектом Sheets в DataWb. Sheets("Лист1").Range("A1:B10").Copy 'Вставляем значения, скопированные из диапазона ячеек, на рабочий лист "Результаты" 'текущей рабочей книги. Обратите внимание, что рабочая книга CurrWb.xlsm не является 'активной, поэтому должна быть указана в ссылке. Workbooks("CurrWb").Sheets("Результаты").Range("A1").PasteSpecial Paste:=xlPasteValues
Пример 3
Следующий отрывок кода VBA показывает пример объекта (коллекции) Columns и демонстрирует, как доступ к нему осуществляется из объекта Worksheet. Кроме этого, Вы увидите, что, ссылаясь на ячейку или диапазон ячеек на активном рабочем листе, можно не указывать этот лист в ссылке. Вновь встречаем ключевое слово Set, при помощи которого объект Range присваивается переменной Col.
Данный код VBA показывает также пример доступа к свойству Value объекта Range и изменение его значения.
'С помощью цикла просматриваем значения в столбце A на листе "Лист2", 'выполняем с каждым из них арифметические операции и записываем результат 'в столбец A активного рабочего листа (Лист1) Dim i As Integer Dim Col As Range Dim dVal As Double 'Присваиваем переменной Col столбец A рабочего листа "Лист2" Set Col = Sheets("Лист2").Columns("A") i = 1 'Просматриваем последовательно все ячейки столбца Col до тех пор 'пока не встретится пустая ячейка Do Until IsEmpty(Col.Cells(i)) 'Выполняем арифметические операции со значением текущей ячейки dVal = Col.Cells(i).Value * 3 - 1 'Следующая команда записывает результат в столбец A 'активного листа. Нет необходимости указывать в ссылке имя листа, 'так как это активный лист рабочей книги. Cells(i, 1).Value = dVal i = i + 1 Loop
Оцените качество статьи. Нам важно ваше мнение:
1239 / 1049 / 293 Регистрация: 07.03.2012 Сообщений: 3,245 |
|
1 |
|
16.04.2012, 16:50. Показов 5109. Ответов 8
В reportViewer’e есть кнопка по нажатии которой можно экспортировать в Excel, а как мне повесить на свою кнопку код, по нажатии которой будет происходить экспорт в Excel из reportViewer’a?
0 |
dimasamchenko 336 / 269 / 21 Регистрация: 30.03.2009 Сообщений: 500 |
||||
17.04.2012, 10:48 |
2 |
|||
Монфрид, Вот таким образом
весь выше указаный код поместите в обработчик кнопки или в отдельную функцию вызываемую из обработчика кнопки
2 |
Монфрид 1239 / 1049 / 293 Регистрация: 07.03.2012 Сообщений: 3,245 |
||||
17.04.2012, 18:29 [ТС] |
3 |
|||
если что, то я решил вот так:
2 |
Sanek911 6 / 6 / 1 Регистрация: 04.12.2009 Сообщений: 42 |
||||
26.09.2013, 10:49 |
4 |
|||
если что, то я решил вот так:
Монфрид, можешь кусок кода побольше выложить, ато не особо понимаю куда эту строку притулить
1 |
1239 / 1049 / 293 Регистрация: 07.03.2012 Сообщений: 3,245 |
|
26.09.2013, 11:24 [ТС] |
5 |
Sanek911, тут уж полней куска кода нет. Куда хочешь (на кнопку например) туда и вешай этот код. Главное чтобы репортвьювер был на форме
0 |
Sanek911 6 / 6 / 1 Регистрация: 04.12.2009 Сообщений: 42 |
||||
26.09.2013, 11:32 |
6 |
|||
Операция является недопустимой из-за текущего состояния объекта. вот такая ошибка у меня ReportViewer есть на форме
0 |
1239 / 1049 / 293 Регистрация: 07.03.2012 Сообщений: 3,245 |
|
26.09.2013, 11:51 [ТС] |
7 |
так, ну вы в конструктор напихали всё что можно.
0 |
6 / 6 / 1 Регистрация: 04.12.2009 Сообщений: 42 |
|
26.09.2013, 12:17 |
8 |
Я не знаю как вы сделали, но используя ваш вариант я подразумевал, что форма содержащая ReportViewer не будет отображаться.
0 |
3 / 3 / 6 Регистрация: 31.05.2014 Сообщений: 177 |
|
01.08.2016, 18:00 |
9 |
dimasamchenko, подскажите пожалуйста, мне нужно авто генерация отчета в excel и отправкой его на почту, но отчет написанный в report builder, Вы можете что то посоветовать? Может написать небольшое приложение на c# используя вашу часть кода и переписать отчет в reportviewer ? Но смогу ли я потом поставить эту программу на планировщик?
0 |