Создание таблицы с помощью кода VBA Excel. Создание умной и обычной пользовательской таблицы. Указание стиля умной таблицы, добавление строки итогов. Примеры.
Создание и удаление умной таблицы
Создание умной таблицы
Создается умная таблица Excel с помощью следующего кода:
ActiveSheet.ListObjects.Add(xlSrcRange, Range(«$A$1:$L$15»), , xlNo).Name _ = «МояТаблица1» |
В данном примере:
ActiveSheet — лист, на котором создается таблица, может быть любой лист рабочей книги Excel.
Range(«$A$1:$L$15») — диапазон, который преобразуется в таблицу. Можно использовать и такую форму: Range(Cells(1, 1), Cells(15, 12)), где индексы строк и столбцов можно заменить переменными.
xlNo — указывает, что первая строка выбранного диапазона не содержит заголовки столбцов (граф) будущей таблицы, и их необходимо добавить. В этом случае будет добавлена дополнительная строка с наименованиями столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д., которые в дальнейшем можно переименовать (количество строк в таблице, включая строку заголовков, получится на одну больше, чем в указанном диапазоне). Если в диапазоне уже содержатся заголовки столбцов будущей таблицы, то следует указать вместо xlNo значение xlYes. В этом случае первая строка указанного диапазона будет преобразована в строку заголовков, а если она будет не заполнена, то добавятся названия столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д. (количество строк в таблице, включая строку заголовков, будет то же, что и в указанном диапазоне).
МояТаблица1 — имя, присваиваемое создаваемой таблице. Имя должно быть без пробелов: при указании в коде VBA названия таблицы с пробелами, во время его выполнения Excel заменит пробелы знаками подчеркивания (по крайней мере, так происходит в Excel 2016).
Таблица будет создана со стилем по умолчанию (TableStyleMedium2 в Excel 2016).
Стиль умной таблицы
Присвоение стиля таблице (изменение стиля) осуществляется с помощью свойства TableStyle объекта ListObjects:
ActiveSheet.ListObjects(«МояТаблица1»).TableStyle = «TableStyleMedium15» |
Свойство TableStyle может принимать следующие значения:
- TableStyleLight (светлый) с индексом от 1 до 21 (в Excel 2016);
- TableStyleMedium (средний) с индексом от 1 до 28 (в Excel 2016);
- TableStyleDark (темный) с индексом от 1 до 11 (в Excel 2016).
Например, TableStyleLight5, TableStyleMedium24, TableStyleDark8.
Чтобы отменить стиль таблицы в коде VBA, необходимо свойству TableStyle присвоить пустую строку:
ActiveSheet.ListObjects(«МояТаблица1»).TableStyle = «» |
Этому коду соответствует выбор в разделе «Конструктор» на ленте инструментов Excel самого первого значка стилей в разделе «Светлый».
Добавление строки итогов
Строка итогов умной таблицы добавляется следующим образом:
ActiveSheet.ListObjects(«МояТаблица1»).ShowTotals = True |
Удаляется строка итогов умной таблицы так:
ActiveSheet.ListObjects(«МояТаблица1»).ShowTotals = False |
Удаление умной таблицы
Удалить умную таблицу очень просто:
ActiveSheet.ListObjects(«МояТаблица1»).Delete |
Создание пользовательской таблицы
Мне не приходилось на практике с помощью VBA Excel создавать умные таблицы, в отличие от пользовательских таблиц, которые использовались для улучшения восприятия различных отчетов или сгенерированных документов.
Для создания такой таблицы необходимо:
- определить диапазон, если он заранее не известен (иногда для этого может понадобиться определить номер последней заполненной строки);
- добавить границы ячеек;
- отформатировать строку заголовков;
- добавить строку итогов, если она необходима.
Подробнее о создании пользовательской таблицы в Примере 2.
Примеры создания таблиц
Задание для примеров
Набор данных для примеров создания таблиц
Допустим, на лист Excel переданы данные для заполнения табличной части товарного чека со следующими условиями:
- в табличной части 5 граф: № п/п, Наименование, Количество, Цена и Сумма;
- сколько наименований добавил пользователь неизвестно.
Нам необходимо:
- определить количество строк;
- добавить строку заголовков;
- отобразить сетку (границы ячеек);
- добавить строку итогов.
Таблицу будем оформлять двумя способами: путем создания умной и пользовательской таблиц.
Пример 1 — умная таблица
Упаковываем набор данных из задания в умную таблицу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub test1() ‘Объявляем переменную для присвоения ей количества строк Dim a As Long ‘Определяем количество строк a = Cells(1, 1).CurrentRegion.Rows.Count ‘Создаем умную таблицу с добавлением строки заголовков ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1),Cells(a, 5)), , xlNo).Name _ = «ТоварныйЧек1» ‘Изменяем названия граф Cells(1, 1) = «№ п/п» Cells(1, 2) = «Наименование» Cells(1, 3) = «Количество» Cells(1, 4) = «Цена» Cells(1, 5) = «Сумма» ‘Добавляем строку итогов ActiveSheet.ListObjects(«ТоварныйЧек1»).ShowTotals = True ‘Стиль оставляем по умолчанию End Sub |
Результат выполнения кода Примера 1 получится такой:
Умная таблица из заданного набора данных
Пример 2 — «обычная» таблица
Упаковываем набор данных из задания в пользовательскую таблицу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub test2() ‘Объявляем переменную для присвоения ей количества строк Dim a As Long ‘Определяем количество строк a = Cells(1, 1).CurrentRegion.Rows.Count ‘Добавляем строку заголовков Cells(1, 1).EntireRow.Insert ‘Указываем названия граф Cells(1, 1) = «№ п/п» Cells(1, 2) = «Наименование» Cells(1, 3) = «Количество» Cells(1, 4) = «Цена» Cells(1, 5) = «Сумма» ‘Добавляем сетку Range(Cells(1, 1), Cells(a + 1, 5)).Borders.LineStyle = True ‘Добавляем строку итогов Cells(a + 2, 4) = «Итого:» With Cells(a + 2, 5) .FormulaR1C1 = «=SUM(R[-« & a & «]C:R[-1]C)» .Borders.LineStyle = True .Font.Bold = True End With ‘Выделяем заголовки жирным шрифтом и ‘применяем автоподстройку ширины столбцов With Range(Cells(1, 1), Cells(1, 5)) .Font.Bold = True .EntireColumn.AutoFit End With End Sub |
Результат выполнения кода Примера 2 получится такой:
Пользовательская таблица из заданного набора данных
Если решите поэкспериментировать с моим кодом, добавьте любые данные в пять колонок на активном листе Excel, количество строк может быть любым, в пятой графе должны быть числа.
О работе с умной таблицей (обращение к ячейкам, строкам и столбцам; добавление и удаление строк и столбцов) рассказано в статье VBA Excel. Работа с умной таблицей
Tables are one of the most powerful features of Excel. Controlling them using VBA provides a way to automate that power, which generates a double benefit 🙂
Excel likes to store data within tables. The basic structural rules, such as (a) headings must be unique (b) only one header row allowed, make tables compatible with more complex tools. For example, Power Query, Power Pivot, and SharePoint lists all use tables as either a source or an output. Therefore, it is clearly Microsoft’s intention that we use tables.
However, the biggest benefit to the everyday Excel user is much simpler; if we add new data to the bottom of a table, any formulas referencing the table will automatically expand to include the new data.
Whether you love tables as much as I do or not, this post will help you automate them with VBA.
Tables, as we know them today, first appeared in Excel 2007. This was a replacement for the Lists functionality found in Excel 2003. From a VBA perspective, the document object model (DOM) did not change with the upgraded functionality. So, while we use the term ‘tables’ in Excel, they are still referred to as ListObjects within VBA.
Download the example file
I recommend you download the example file for this post. Then you’ll be able to work along with examples and see the solution in action, plus the file will be useful for future reference.
Download the file: 0009 VBA tables and ListObjects.zip
Structure of a table
Before we get deep into any VBA code, it’s useful to understand how tables are structured.
Range & Data Body Range
The range is the whole area of the table.
The data body range only includes the rows of data, it excludes the header and totals.
Header and total rows
The header row range is the top row of the table containing the column headers.
The totals row range, if displayed, includes calculations at the bottom of the table.
List columns and list rows
The individual columns are known as list columns.
Each row is known as a list row.
The VBA code in this post details how to manage all these table objects.
Referencing the parts of a table
While you may be tempted to skip this section, I recommend you read it in full and work through the examples. Understanding Excel’s document object model is the key to reading and writing VBA code. Master this, and your ability to write your own VBA code will be much higher.
Many of the examples in this first section use the select method, this is to illustrate how to reference parts of the table. In reality, you would rarely use the select method.
Select the entire table
The following macro will select the whole table, including the totals and header rows.
Sub SelectTable() ActiveSheet.ListObjects("myTable").Range.Select End Sub
Select the data within a table
The DataBodyRange excludes the header and totals sections of the table.
Sub SelectTableData() ActiveSheet.ListObjects("myTable").DataBodyRange.Select End Sub
Get a value from an individual cell within a table
The following macro retrieves the table value from row 2, column 4, and displays it in a message box.
Sub GetValueFromTable() MsgBox ActiveSheet.ListObjects("myTable").DataBodyRange(2, 4).value End Sub
Select an entire column
The macro below shows how to select a column by its position, or by its name.
Sub SelectAnEntireColumn() 'Select column based on position ActiveSheet.ListObjects("myTable").ListColumns(2).Range.Select 'Select column based on name ActiveSheet.ListObjects("myTable").ListColumns("Category").Range.Select End Sub
Select a column (data only)
This is similar to the macro above, but it uses the DataBodyRange to only select the data; it excludes the headers and totals.
Sub SelectColumnData() 'Select column data based on position ActiveSheet.ListObjects("myTable").ListColumns(4).DataBodyRange.Select 'Select column data based on name ActiveSheet.ListObjects("myTable").ListColumns("Category").DataBodyRange.Select End Sub
Select a specific column header
This macro shows how to select the column header cell of the 5th column.
Sub SelectCellInHeader() ActiveSheet.ListObjects("myTable").HeaderRowRange(5).Select End Sub
Select a specific column within the totals section
This example demonstrates how to select the cell in the totals row of the 3rd column.
Sub SelectCellInTotal() ActiveSheet.ListObjects("myTable").TotalsRowRange(3).Select End Sub
Select an entire row of data
The macro below selects the 3rd row of data from the table.
NOTE – The header row is not included as a ListRow. Therefore, ListRows(3) is the 3rd row within the DataBodyRange, and not the 3rd row from the top of the table.
Sub SelectRowOfData() ActiveSheet.ListObjects("myTable").ListRows(3).Range.Select End Sub
Select the header row
The following macro selects the header section of the table.
Sub SelectHeaderSection() ActiveSheet.ListObjects("myTable").HeaderRowRange.Select End Sub
Select the totals row
To select the totals row of the table, use the following code.
Sub SelectTotalsSection() ActiveSheet.ListObjects("myTable").TotalsRowRange.Select End Sub
OK, now we know how to reference the parts of a table, it’s time to get into some more interesting examples.
Creating and converting tables
This section of macros focuses on creating and resizing tables.
Convert selection to a table
The macro below creates a table based on the currently selected region and names it as myTable. The range is referenced as Selection.CurrentRegion, but this can be substituted for any range object.
If you’re working along with the example file, this macro will trigger an error, as a table called myTable already exists in the workbook. A new table will still be created with a default name, but the VBA code will error at the renaming step.
Sub ConvertRangeToTable() tableName As String Dim tableRange As Range Set tableName = "myTable" Set tableRange = Selection.CurrentRegion ActiveSheet.ListObjects.Add(SourceType:=xlSrcRange, _ Source:=tableRange, _ xlListObjectHasHeaders:=xlYes _ ).Name = tableName End Sub
Convert a table back to a range
This macro will convert a table back to a standard range.
Sub ConvertTableToRange() ActiveSheet.ListObjects("myTable").Unlist End Sub
NOTE – Unfortunately, when converting a table to a standard range, the table formatting is not removed. Therefore, the cells may still look like a table, even when they are not – that’s frustrating!!!
Resize the range of the table
To following macro resizes a table to cell A1 – J100.
Sub ResizeTableRange() ActiveSheet.ListObjects("myTable").Resize Range("$A$1:$J$100") End Sub
Table styles
There are many table formatting options, the most common of which are shown below.
Change the table style
Change the style of a table to an existing pre-defined style.
Sub ChangeTableStyle() ActiveSheet.ListObjects("myTable").TableStyle = "TableStyleLight15" End Sub
To apply different table styles, the easiest method is to use the macro recorder. The recorded VBA code will include the name of any styles you select.
Get the table style name
Use the following macro to get the name of the style already applied to a table.
Sub GetTableStyleName() MsgBox ActiveSheet.ListObjects("myTable").TableStyle End Sub
Apply a style to the first or last column
The first and last columns of a table can be formatted differently using the following macros.
Sub ColumnStyles() 'Apply special style to first column ActiveSheet.ListObjects("myTable").ShowTableStyleFirstColumn = True 'Apply special style to last column ActiveSheet.ListObjects("myTable").ShowTableStyleLastColumn = True End Sub
Adding or removing stripes
By default, tables have banded rows, but there are other options for this, such as removing row banding or adding column banding.
Sub ChangeStripes() 'Apply column stripes ActiveSheet.ListObjects("myTable").ShowTableStyleColumnStripes = True 'Remove row stripes ActiveSheet.ListObjects("myTable").ShowTableStyleRowStripes = False End Sub
Set the default table style
The following macro sets the default table style.
Sub SetDefaultTableStyle() 'Set default table style ActiveWorkbook.DefaultTableStyle = "TableStyleMedium2" End Sub
Looping through tables
The macros in this section loop through all the tables on the worksheet or workbook.
Loop through all tables on a worksheet
If we want to run a macro on every table of a worksheet, we must loop through the ListObjects collection.
Sub LoopThroughAllTablesWorksheet() 'Create variables to hold the worksheet and the table Dim ws As Worksheet Dim tbl As ListObject Set ws = ActiveSheet 'Loop through each table in worksheet For Each tbl In ws.ListObjects 'Do something to the Table.... Next tbl End Sub
In the code above, we have set the table to a variable, so we must refer to the table in the right way. In the section labeled ‘Do something to the table…, insert the action to be undertaken on each table, using tbl to reference the table.
For example, the following will change the table style of every table.
tbl.TableStyle = "TableStyleLight15"
Loop through all tables in a workbook
Rather than looping through a single worksheet, as shown above, the macro below loops through every table on every worksheet.
Sub LoopThroughAllTablesWorkbook() 'Create variables to hold the worksheet and the table Dim ws As Worksheet Dim tbl As ListObject 'Loop through each worksheet For Each ws In ActiveWorkbook.Worksheets 'Loop through each table in worksheet For Each tbl In ws.ListObjects 'Do something to the Table.... Next tbl Next ws End Sub
As noted in the section above, we must refer to the table using its variable. For example, the following will display the totals row for every table.
tbl.ShowTotals = True
Adding & removing rows and columns
The following macros add and remove rows, headers, and totals from a table.
Add columns into a table
The following macro adds a column to a table.
Sub AddColumnToTable() 'Add column at the end ActiveSheet.ListObjects("myTable").ListColumns.Add 'Add column at position 2 ActiveSheet.ListObjects("myTable").ListColumns.Add Position:=2 End Sub
Add rows to the bottom of a table
The next macro will add a row to the bottom of a table
Sub AddRowsToTable() 'Add row at bottom ActiveSheet.ListObjects("myTable").ListRows.Add 'Add row at the first row ActiveSheet.ListObjects("myTable").ListRows.Add Position:=1 End Sub
Delete columns from a table
To delete a column, it is necessary to use either the column index number or the column header.
Sub DeleteColumnsFromTable() 'Delete column 2 ActiveSheet.ListObjects("myTable").ListColumns(2).Delete 'Delete a column by name ActiveSheet.ListObjects("myTable").ListColumns("Feb").Delete End Sub
Delete rows from a table
In the table structure, rows do not have names, and therefore can only be deleted by referring to the row number.
Sub DeleteRowsFromTable() 'Delete row 2 ActiveSheet.ListObjects("myTable").ListRows(2).Delete 'Delete multiple rows ActiveSheet.ListObjects("myTable").Range.Rows("4:6").Delete End Sub
Add total row to a table
The total row at the bottom of a table can be used for calculations.
Sub AddTotalRowToTable() 'Display total row with value in last column ActiveSheet.ListObjects("myTable").ShowTotals = True 'Change the total for the "Total Column" to an average ActiveSheet.ListObjects("myTable").ListColumns("TotalColumn").TotalsCalculation = _ xlTotalsCalculationAverage 'Totals can be added by position, rather than name ActiveSheet.ListObjects("myTable").ListColumns(2).TotalsCalculation = _ xlTotalsCalculationAverage End Sub
Types of totals calculation
xlTotalsCalculationNone xlTotalsCalculationAverage xlTotalsCalculationCount xlTotalsCalculationCountNums xlTotalsCalculationMax xlTotalsCalculationMin xlTotalsCalculationSum xlTotalsCalculationStdDev xlTotalsCalculationVar
Table header visability
Table headers can be turned on or off. The following will hide the headers.
Sub ChangeTableHeader() ActiveSheet.ListObjects("myTable").ShowHeaders = False End Sub
Remove auto filter
The auto filter can be hidden. Please note, the table header must be visible for this code to work.
Sub RemoveAutoFilter() ActiveSheet.ListObjects("myTable").ShowAutoFilterDropDown = False End Sub
I have a separate post about controlling auto filter settings – check it out here. Most of that post applies to tables too.
Other range techniques
Other existing VBA techniques for managing ranges can also be applied to tables.
Using the union operator
To select multiple ranges, we can use VBA’s union operator. Here is an example, it will select rows 4, 1, and 3.
Sub SelectMultipleRangesUnionOperator() Union(ActiveSheet.ListObjects("myTable").ListRows(4).Range, _ ActiveSheet.ListObjects("myTable").ListRows(1).Range, _ ActiveSheet.ListObjects("myTable").ListRows(3).Range).Select End Sub
Assign values from a variant array to a table row
To assign values to an entire row from a variant array, use code similar to the following:
Sub AssignValueToTableFromArray() 'Assing values to array (for illustration) Dim myArray As Variant myArray = Range("A2:D2") 'Assign values in array to the table ActiveSheet.ListObjects("myTable").ListRows(2).Range.Value = myArray End Sub
Reference parts of a table using the range object
Within VBA, a table can be referenced as if it were a standard range object.
Sub SelectTablePartsAsRange() ActiveSheet.Range("myTable[Category]").Select End Sub
Counting rows and columns
Often, it is useful to count the number of rows or columns. This is a good method to reference rows or columns which have been added.
Counting rows
To count the number of rows within the table, use the following macro.
Sub CountNumberOfRows() Msgbox ActiveSheet.ListObjects("myTable").ListRows.Count End Sub
Counting columns
The following macro will count the number of columns within the table.
Sub CountNumberOfColumns() Msgbox ActiveSheet.ListObjects("myTable").ListColumns.Count End Sub
Useful table techniques
The following are some other useful VBA codes for controlling tables.
Show the table data entry form
If a table starts at cell A1, there is a simple data entry form that can be displayed.
Sub ShowDataEntryForm() 'Only works if Table starts at Cell A1 ActiveSheet.ShowDataForm End Sub
The following screenshot shows the data form for the example table.
Check if a table exists
The following macro checks if a table already exists within a workbook. Change the tblName variable to adapt this to your requirements.
Sub CheckIfTableExists() 'Create variables to hold the worksheet and the table Dim ws As Worksheet Dim tbl As ListObject Dim tblName As String Dim tblExists As Boolean tblName = "myTable" 'Loop through eac worksheet For Each ws In ActiveWorkbook.Worksheets 'Loop through each table in worksheet For Each tbl In ws.ListObjects If tbl.Name = tblName Then tblExists = True End If Next tbl Next ws If tblExists = True Then MsgBox "Table " & tblName & " exists." Else MsgBox "Table " & tblName & " does not exists." End If End Sub
Find out if a table has been selected, if so which
The following macros find the name of the selected table.
Method 1
As you will see in the comments Jon Peltier had an easy approach to this, which has now become my preferred approach.
Sub SimulateActiveTable() Dim ActiveTable As ListObject On Error Resume Next Set ActiveTable = ActiveCell.ListObject On Error GoTo 0 'Confirm if a cell is in a Table If ActiveTable Is Nothing Then MsgBox "Select table and try again" Else MsgBox "The active cell is in a Table called: " & ActiveTable.Name End If End Sub
Method 2
This option, which was my original method, loops through each table on the worksheet and checks if they intersect with the active cell.
Sub SimulateActiveTable_Method2() Dim ActiveTable As ListObject Dim tbl As ListObject 'Loop through each table, check if table intersects with active cell For Each tbl In ActiveSheet.ListObjects If Not Intersect(ActiveCell, tbl.Range) Is Nothing Then Set ActiveTable = tbl MsgBox "The active cell is in a Table called: " & ActiveTable.Name End If Next tbl 'If no intersection then no tabl selected If ActiveTable Is Nothing Then MsgBox "Select an Excel table and try again" End If End Sub
Conclusion
Wow! That was a lot of code examples.
There are over 30 VBA macros above, and even this does not cover everything, but hopefully covers 99% of your requirements. For your remaining requirements, you could try Microsoft’s VBA object reference library (https://docs.microsoft.com/en-us/office/vba/api/Excel.ListObject)
About the author
Hey, I’m Mark, and I run Excel Off The Grid.
My parents tell me that at the age of 7 I declared I was going to become a qualified accountant. I was either psychic or had no imagination, as that is exactly what happened. However, it wasn’t until I was 35 that my journey really began.
In 2015, I started a new job, for which I was regularly working after 10pm. As a result, I rarely saw my children during the week. So, I started searching for the secrets to automating Excel. I discovered that by building a small number of simple tools, I could combine them together in different ways to automate nearly all my regular tasks. This meant I could work less hours (and I got pay raises!). Today, I teach these techniques to other professionals in our training program so they too can spend less time at work (and more time with their children and doing the things they love).
Do you need help adapting this post to your needs?
I’m guessing the examples in this post don’t exactly match your situation. We all use Excel differently, so it’s impossible to write a post that will meet everybody’s needs. By taking the time to understand the techniques and principles in this post (and elsewhere on this site), you should be able to adapt it to your needs.
But, if you’re still struggling you should:
- Read other blogs, or watch YouTube videos on the same topic. You will benefit much more by discovering your own solutions.
- Ask the ‘Excel Ninja’ in your office. It’s amazing what things other people know.
- Ask a question in a forum like Mr Excel, or the Microsoft Answers Community. Remember, the people on these forums are generally giving their time for free. So take care to craft your question, make sure it’s clear and concise. List all the things you’ve tried, and provide screenshots, code segments and example workbooks.
- Use Excel Rescue, who are my consultancy partner. They help by providing solutions to smaller Excel problems.
What next?
Don’t go yet, there is plenty more to learn on Excel Off The Grid. Check out the latest posts:
In this Article
- VBA Tables and ListObjects
- Create a Table With VBA
- Inserting a Column at the End of the Table with VBA
- Inserting a Row at the Bottom of the Table with VBA
- Adding a Simple Sort with VBA
- Filter a Table With VBA
- Clear the Filter with the ShowAllData Method in VBA
- Clear All Filters From An Excel Table
- Deleting A Row With VBA
- Deleting a Column With VBA
- Converting a Table Back to a Range in VBA
- Adding Banded Columns and formatting to all the Tables in a Worksheet using VBA
- Creating a Table in Access in VBA Using DoCmd.RunSQL
- Filtering a Table in Access Using VBA
This tutorial will demonstrate how to work with Tables and ListObjects in VBA.
VBA Tables and ListObjects
Tables are one of Excel’s most useful and powerful features, in this tutorial, we will go over how to use VBA to create a table, add a simple sort to a table, filter a table and perform other table-related tasks.
Create a Table With VBA
The ListObjects.Add Method can add a table to a worksheet, based on a range in that worksheet. We have the range shown in ($A$1:$B$8) on a worksheet called Sheet1.
The following code will add a table, called Table1 to your worksheet, based on the range ($A$1:$B$8) using the default Table Style:
Sub CreateTableInExcel()
ActiveWorkbook.Sheets("Sheet1").ListObjects.Add(xlSrcRange, Range("$A$1:$B$8"), , xlYes).Name = _
"Table1"
End Sub
The result is:
Inserting a Column at the End of the Table with VBA
You can use the ListColumns.Add method in order to add a column to the end of your table. We have our table called Table1 shown below.
You can add a column to your table using the following code, which will always add a column to the end of the table:
Sub AddColumnToTheEndOfTheTable()
ActiveWorkbook.Sheets("Sheet1").ListObjects("Table1").ListColumns.Add
End Sub
The result is:
Inserting a Row at the Bottom of the Table with VBA
You can use the ListRows.Add method to add a row to the bottom of your table. We have our table called Table1 shown below.
The following code will always add a row to the bottom of your table.
Sub AddRowToTheBottomOfTheTable()
ActiveSheet.ListObjects("Table1").ListRows.Add
End Sub
The result is:
Adding a Simple Sort with VBA
You can sort a table with VBA. We have our table called Table1 shown below and we can use VBA to sort the Sales Column from lowest to highest.
The following code will sort the Sales column in ascending order.
Sub SimpleSortOnTheTable()
Range("Table1[[#Headers],[Sales]]").Select
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort.SortFields.Add _
Key:=Range("Table1[[#All],[Sales]]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
The result is:
Filter a Table With VBA
You can also filter an Excel table using VBA. We have our table called Table1 and we would like to filter the table so that only sales of greater than 1500 are shown.
We can use the Autofilter method, which has five optional parameters. Since we’d like to filter the Sales column which is the second column we set the Field to 2, and we use the xlAnd operator parameter, which is used for dates and numbers.
Sub SimpleFilter()
ActiveWorkbook.Sheets("Sheet1").ListObjects("Table1").Range.AutoFilter Field:=2, Criteria1:= _
">1500", Operator:=xlAnd
End Sub
The result is:
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
Clear the Filter with the ShowAllData Method in VBA
You can access the ShowAllData Method of the Worksheet class in order to clear the filter. If it’s a table’s filter(s) that you want to clear, then you first have to select a cell in the table, which you can do in VBA.
The ShowAllData method will generate an error if one does not use conditional logic in order to check if there has been a filter applied in the worksheet. The following code shows you how to do this:
Sub ClearingTheFilter()
Range("Table1[[#Headers],[Sales]]").Select
If ActiveWorkbook.Worksheets("Sheet1").FilterMode = True Then
ActiveSheet.ShowAllData
End If
End Sub
Clear All Filters From An Excel Table
You can access the ShowAllData Method of the ListObject class without having to select a cell in the table first. The following code shows you how to do this:
Sub ClearAllTableFilters()
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").AutoFilter.ShowAllData
End Sub
Deleting A Row With VBA
You can delete a row in the databody of your table using the ListRows.Delete method. You have to specify which row using the row number. We have the following table called Table1.
Let’s say you wanted to delete the second row in the databody of your table, the following code would allow you to do this:
Sub DeleteARow()
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").ListRows(2).Delete
End Sub
The result is:
VBA Programming | Code Generator does work for you!
Deleting a Column With VBA
You can delete a column from your table using the ListColumns.Delete method. We have the following table called Table1 shown below:
In order to delete the first column, you would use the following code:
Sub DeleteAColumn()
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").ListColumns(1).Delete
End Sub
The result is:
Converting a Table Back to a Range in VBA
You can convert a table back to a normal range using VBA. The following code shows you how to convert a table called Table1 back to a range:
Sub ConvertingATableBackToANormalRange()
ActiveWorkbook.Sheets("Sheet1").ListObjects("Table1").Unlist
End Sub
Adding Banded Columns and formatting to all the Tables in a Worksheet using VBA
You can access all the tables in your worksheet using the ListObjects collection. In the sheet below we have two tables and we would like to add a Banded Column to both the tables at once and change the font of the data section of both tables to bold, using VBA.
Sub AddingBandedColumns()
Dim tbl As ListObject
Dim sht As Worksheet
Set sht = ThisWorkbook.ActiveSheet
For Each tbl In sht.ListObjects
tbl.ShowTableStyleColumnStripes = True
tbl.DataBodyRange.Font.Bold = True
Next tbl
End Sub
The result is:
Creating a Table in Access in VBA Using DoCmd.RunSQL
One of the main ways to create a table in Access in VBA, is through using the DoCmd.RunSQL method to run an action query with a SQL statement.
We have a button on our sample form and when we click on the button we’d like to create a table called ProductsTable with two fields or columns, one would be the primary key field called ProductsID and the other would be a field called Sales.
In order to create this table we would use the following code:
Private Sub cmdCreateProductsTable_Click()
DoCmd.RunSQL "CREATE TABLE ProductsTable " _
& "(ProductID INTEGER PRIMARY KEY, Sales Integer);"
End Sub
The result is:
Filtering a Table in Access Using VBA
You can also filter a table in Access using the DoCmd.ApplyFilter method. We have our simple table shown below in Access called ProductsTable.
We would like to press this button on our form and then only see Sales that are greater than 1500.
So, we would use the following code to do this:
Private Sub cmdFilter_Click()
DoCmd.OpenTable "ProductsTable"
DoCmd.ApplyFilter , "[Sales]>1500"
End Sub
The result is:
Это продолжение перевода книги Зак Барресс и Кевин Джонс. Таблицы Excel: Полное руководство для создания, использования и автоматизации списков и таблиц (Excel Tables: A Complete Guide for Creating, Using and Automating Lists and Tables by Zack Barresse and Kevin Jones. Published by: Holy Macro! Books. First printing: July 2014. – 161 p.). Visual Basic for Applications (VBA) – это язык программирования, который можно использовать для расширения стандартных возможностей Excel. VBA позволяет автоматизировать сложные или повторяющиеся задачи. Например, VBA можно использовать для форматирования листа, получаемого ежедневно из внешнего источника, извлечения данных с веб-страницы раз в неделю или построения сложной пользовательской функции листа.
Предыдущая глава Содержание Следующая глава
Рис. 9.1. Редактирование макросов
Скачать заметку в формате Word или pdf
Вот некоторые примеры автоматизации Таблиц Excel:
- Вы создаете приложение для использования менее опытными пользователями, и хотите заблокировать Таблицу, предоставляя несколько простых функций для добавления, редактирования и удаления записей.
- Вы хотите предоставить функциональные возможности для редактирования групп записей в пользовательской форме, например, транзакции по одному заказу (аванс, финальная оплата, фрахт, пошлина и т.д.).
- Ваша Таблица поддерживает другие функции книги, такие как запись информации о событиях в журнал, и вы хотите вставлять строки в таблицу, обновлять существующие табличные данные, а также находить и извлекать строки из Таблицы.
- Вы хотите провести аудит Таблицы и отобразить ошибки, которые необходимо исправить.
Для работы с этой главой лучше всего, если у вас есть начальный уровень программирования, вы знакомы с объектной моделью и хотите расширить функциональность Таблиц Excel (см. Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA). Среда VBA не русифицирована.
Один из самых простых способов начать работать с VBA – это использовать запись макросов. При этом действия, которые вы совершаете в Excel, записываются в среде VBA в виде инструкций. Не забудьте выключить запись макросов, когда автоматизированные действия будут завершены. Вы можете просматривать и редактировать код VBA, пройдя по меню Разработчик –> Макросы, выбрать имя макроса и нажать кнопку Изменить (рис. 9.1). Код, сгенерированный при записи макросов, не самый эффективный, и вы часто можете улучшить его с помощью редактирования.
Если вкладка Разработчик не видна, включите ее, пройдя по меню Файл –> Параметры –> Настроить ленту, и установив флажок на вкладке Разработчик.
VBA, Excel и объекты
Этот раздел можно пропустить, если у вас уже есть опыт работы с объектами в среде Excel VBA.
В среде VBA приложение Excel представляет объекты, к которым можно получить доступ, в виде объектной модели Excel. Основные объекты Excel:
- Application – Приложение Excel.
- Workbooks – коллекция всех книг, открытых в данный момент в приложении Excel. В общем случае коллекция – набор объектов. В этом случае коллекция Workbooks представляет собой набор отдельных объектов Workbook.
- Workbook – одна книга.
- Worksheets – коллекция всех листов в рабочей книге.
- Worksheet – отдельный рабочий лист или вкладка в рабочей книге.
- Cells – совокупность всех ячеек на листе.
- Range – набор из одной или нескольких ячеек на одном листе. Клетки могут быть прерывистыми. Любая ссылка даже на одну ячейку является объектом Range.
Объекты имеют свойства. Каждый объект принадлежит родительскому объекту. Например, родителем объекта Workbook является объект Application, а родителем объекта Cell – объект Worksheet. Одним из исключений является объект Application, который не имеет родителя; это объект самого высокого уровня, доступный при просмотре объектной модели Excel. При описании контекста объекта или метода часто используются следующие термины:
- Parent – родительский объект. Например, родительский объект для Cell – это Worksheet.
- Member – член родительского объекта. Например, член объекта Worksheet – объект Cell. Член также может быть методом, который выполняет действие.
Когда вы ссылаетесь на объект, вы должны начать с самого высокого уровня. Чтобы найти каждый подчиненный объект, введите родительский объект, за которым следует точка, а затем дочерний элемент. Например, чтобы сослаться на значение ячейки A1 на листе Sheet1 в книге My Workbook.xlsx, используйте следующий синтаксис:
Application.Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»).Cells(1,1).Value |
Ссылки в VBA как правило используют синтаксис R1C1, а не А1.
Объектная модель Excel предоставляет объекты по умолчанию в зависимости от того, какой элемент приложения в данный момент активен. Например, следующий синтаксис ссылается на ячейку A1 на листе, активном в момент выполнения кода:
Хотя этот синтаксис работает, он не считается хорошей практикой. Мы рекомендуем использовать объект ActiveSheet, если вы действительно намеревались ссылаться на активный лист:
Application.ActiveSheet.Cells(1,1).Value |
Единственный объект, который подразумевается во всей среде Excel VBA, – это объект Application, и его можно без проблем опустить. Поэтому следующие ссылки не являются неоднозначными в любом месте среды Excel VBA:
Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»).Cells(1,1).Value ActiveSheet.Cells(1,1).Value |
Вы можете назначить ссылку на любой объект переменной, если эта переменная имеет тот же тип, что и объект, или определена как универсальный тип объекта. Основная причина для этого – удобство. Если вы ссылаетесь на объект повторно, то выделение переменной для ссылки на этот объект может привести к уменьшению объема кода, который будет легче читать и поддерживать. Например, вы можете назначить ссылку на Sheet1 переменной:
Dim TargetWorksheet As Worksheet Set TargetWorksheet = Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1») |
Теперь ссылка на А1 может быть записана в виде:
TargetWorksheet.Cells(1,1).Value |
Ключевое слово Set присваивает ссылку. VBA требует использования ключевого слова Set при назначении ссылок на объекты. Кроме того, переменная является ссылкой на объект, а не копией объекта. Вы можете иметь любое количество переменных, содержащих ссылку на один и тот же экземпляр объекта.
Следует различать объекты, экземпляры объектов и ссылки на объекты. Объект включает в себя объектную модель (свойства и методы, которые ему принадлежат) и код, который управляет его поведением. Примером объекта является Worksheet. Экземпляр объекта является конкретным экземпляром этого объекта и включает в себя данные и значения свойств, связанные с этим экземпляром объекта. Листы Sheet1 и Sheet2 примеры экземпляров объектов. Переменная, ссылающаяся на объект, содержит ссылку на объект.
При определении переменных, ссылающихся на объекты, необходимо определить переменную того же типа, что и объект, на который ссылаются, или присвоить универсальный тип объекта. В общем случае универсальный тип объекта следует использовать только в том случае, если этой переменной будут присвоены ссылки на другие объекты различных типов; при использовании универсального типа объекта редактор VBA не может помочь вам с интеллектуальной подсказкой IntelliSense (IntelliSense представляет список свойств и методов объекта при вводе ссылки на объект, за которой следует точка.)
В дальнейшем описании мы используем следующие объекты:
- ThisWorkbook – рабочая книга, в которой выполняется код. Это удобно, когда единственная книга, на которую ссылаются, является той, в которой находится код. С этой рабочей книгой работать легче, чем с рабочими книгами (My Workbook.xlsm), особенно когда имя рабочей книги может меняться.
- Me – когда код находится в модуле кода листа, Me – это удобный способ ссылаться на объект листа, в котором находится код.
Excel Online открывает файлы с VBA (при просмотре в браузере), но не выполняет код. Код игнорируется при открытии книги в приложении Excel Online, но сам код сохраняется.
Объект ListObject
Excel использует объект ListObject для представления таблицы в объектной модели Excel. Он содержится в коллекции ListObjects, которая принадлежит объекту Worksheet. Используйте этот синтаксис для ссылки на Таблицу на листе:
ThisWorkbook.Worksheets(«Sheet1»).ListObjects(«Table1») |
Назовите Таблицу как-то иначе, чем имя по умолчанию. Это поможет вам как при написании кода, так и позже, когда вы смотрите на свой код, пытаясь понять, что вы сделали. Это также будет полезно для других пользователей, которые будут изучать ваш код.
Поскольку ListObjects – это набор таблиц, вы можете получить доступ к конкретной Таблице с помощью индекса:
ThisWorkbook.Worksheets(«Sheet1»).ListObjects(1) |
Индекс (или позиция) объекта ListObject в коллекции ListObjects определяется порядком, в котором объекты ListObject были созданы на листе. Объект ListObject может быть назначен переменной, которая была определена как тип ListObject. Объект ListObject имеет ряд свойств и методов, используемых для доступа к таблицам и управления ими.
Свойства объекта Таблица
Пять свойств представляют собой основные части таблицы. Каждое из этих свойств является объектом диапазона Range. Два дополнительных свойства или коллекции предоставляют доступ к строкам и столбцам Таблицы. Каждая коллекция предоставляет доступ ко всем объектам ListRow и ListColumn в Таблице.
Свойство Range
Свойство Range возвращает всю таблицу, включая заголовок и итоговые строки. Тип объекта – Range. Свойство не может быть установлено.
Свойство HeaderRowRange
Свойство HeaderRowRange возвращает строку заголовка таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон всегда представляет собой одну строку – строку заголовка – и распространяется на все столбцы таблицы. Если строка заголовка отключена, этому свойству присваивается значение Nothing.
Свойство DataBodyRange
Свойство DataBodyRange возвращает тело таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон – это каждая строка между заголовком и общей строкой и распространяется на все столбцы таблицы. Если таблица не содержит строк, свойство DataBodyRange не возвращает Nothing (и ListRows.Count возвращает 0). Это единственный случай, когда свойство InsertRowRange возвращает объект диапазона, который можно использовать для вставки новой строки. В этом состоянии таблица выглядит как одна строка без каких-либо значений. Как только одна ячейка в таблице получает значение, InsertRowRange получает значение Nothing, а DataBodyRange – значение строк данных в таблице.
Свойство TotalRowRange
Свойство TotalRowRange возвращает итоговую строку Таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон всегда представляет собой одну строку – строку итогов – и распространяется на все столбцы Таблицы. Если строка итогов отключена, это свойство имеет значение Nothing.
Свойство InsertRowRange
Свойство InsertRowRange возвращает текущую строку вставки Таблицы. Тип объекта – Range. Свойство не может быть установлено. В Excel 2007 и более поздних версиях InsertRowRange возвращает только первую строку данных и только тогда, когда таблица не содержит никаких данных. В противном случае он ничего не возвращает и фактически бесполезен.
Свойство ListRows
Свойство ListRows возвращает коллекцию всех строк в таблице DataBodyRange. Это тип объекта ListRows, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов ListRow. Свойство не может быть установлено. На строки ссылаются по индексу, отсчитываемому от единицы (one-based index).[1] В пустой таблице нет строк. Метод Add объекта ListRows используется для вставки одной новой строки за один раз.
Свойство ListColumns
Свойство ListColumns возвращает коллекцию всех столбцов таблицы. Это тип объекта ListColumns, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов ListColumn. Свойство не может быть установлено. На столбцы ссылается one-based. Таблица всегда содержит хотя бы один столбец.
Свойства структуры Таблиц
Таких свойств несколько. Все они являются членами объекта ListObject.
Свойство ShowAutoFilter возвращает или задает, включен ли Автофильтр. Свойство имеет логический тип. Если значение True, Автофильтр включен, False – отключен. Свойство представлено в пользовательском интерфейсе Excel, меню Данные –> Сортировка и фильтр –> Фильтр.
Свойство ShowAutoFilterDropDown возвращает или задает значение, указывающее отображается ли кнопка ниспадающего списка Автофильтра. Свойство имеет логический тип. Если значение True, кнопка отражается, False – не отражается. Если ShowAutoFilter имеет значение False, то свойство ShowAutoFilterDropDown изменить нельзя. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Кнопка фильтра.
Свойство ShowHeaders возвращает или задает, включена ли строка заголовка таблицы. Свойство имеет логический тип. Если значение True, строка заголовка таблицы включена, False – отключена. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Строка заголовков.
Свойство ShowTotals возвращает или задает включена ли строка итогов. Свойство имеет логический тип. Если значение True, строка итогов включена, False – отключена. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Строка итогов.
Свойства стилей Таблиц
Этих свойств также несколько. Все они являются членами объекта ListObject.
Свойство TableStyle возвращает или задает имя стиля таблицы. Свойство имеет тип Variant. Чтобы изменить стиль таблицы, необходимо задать имя нужного стиля. При назначении стиля таблицы к таблице применяются только элементы стиля, определенные в этом стиле (подробнее см. Глава 7. Форматирование Таблиц Excel). Чтобы определить имя стиля, наведите курсор мыши на нужный стиль в галерее стилей таблиц, пока Excel не отобразит имя этого стиля:
Рис. 9.2. Определение имени стиля таблицы
Чтобы присвоить это имя свойству TableStyle, используйте код:
ActiveSheet.ListObjects(«qryCrosstab2»).TableStyle = «TableStyleLight21» |
Здесь qryCrosstab2 – имя Таблицы. Внутренние имена всех встроенных стилей не содержат пробелов и английские, хотя имена, отображаемые на ленте, содержат пробелы и русифицированы. Чтобы узнать имя таблицы, которое нужно использовать в коде VBA, запустите запись макроса, присвойте стиль, завершите запись макроса, и посмотрите его код.
Свойство TableStyle представлено в пользовательском интерфейсе Excel в виде массива кнопок в группе Работа с таблицами –> Конструктор –> Стили таблиц.
Свойство ShowTableStyleColumnStripes возвращает или задает, форматируются ли нечетные столбцы таблицы иначе, чем четные столбцы. Свойство имеет логический тип. Если значение True, нечетные столбцы таблицы форматируются иначе, чем четные столбцы, как определено в заданном стиле таблицы. Нечетные столбцы форматируются с использованием параметров полосы первого столбца стиля таблицы, а четные строки форматируются с использованием параметров полосы второго столбца стиля таблицы. Если ShowTableStyleColumnStripes имеет значение False, столбцы таблицы не форматируются с использованием назначенного стиля таблицы. Свойство ShowTableStyleColumnStripes представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Чередующиеся столбцы.
Обратите внимание, что по умолчанию количество столбцов в каждой полосе равно одному, но вы можете изменить его на большее число для элементов полосы первого столбца и полосы второго столбца независимо. Дополнительную информацию смотрите в главе 7.
Свойство ShowTableStyleRowStripes возвращает или задает, форматируются ли нечетные строки таблицы иначе, чем четные строки. Свойство имеет логический тип. Если значение True, нечетные строки таблицы форматируются иначе, чем четные строки, как определено в заданном стиле таблицы. Нечетные строки форматируются с использованием первой полосы строк стиля таблицы, а четные строки форматируются с использованием второй полосы строк стиля таблицы. Если свойству ShowTableStyleRowStripes присвоено значение False, строки таблицы не форматируются с использованием назначенного стиля таблицы. Это свойство эквивалентно флажку на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Чередующиеся строки.
Свойство ShowTableStyleFirstColumn возвращает или задает, выделяется ли первый столбец. Свойство имеет логический тип. Если значение True, первый столбец таблицы форматируется так, как определено в настройках первого столбца назначенного стиля таблицы. Если установлено значение False, первый столбец таблицы не форматируется в соответствии с заданным стилем таблицы. Это свойство представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Первый столбец.
Свойство ShowTableStyleLastColumn возвращает или задает, выделяется ли последний столбец. Свойство имеет логический тип. Если значение True, последний столбец таблицы форматируется так, как определено в настройках последнего столбца назначенного стиля таблицы. Если установлено значение False, последний столбец таблицы не форматируется в соответствии с заданным стилем таблицы. Это свойство представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Последний столбец.
Другие свойства объекта Таблицы
В следующих разделах рассматриваются свойства объекта таблицы для использования в VBA. Они отличаются от методов.
Свойство Active возвращает True, если активная ячейка находится в пределах таблицы, включая заголовок и итоговые строки; в противном случае оно возвращает False. Свойство имеет логический тип. Свойство не может быть установлено.
Свойство AlternativeText возвращает или задает замещающий текст таблицы. Свойство имеет строковый тип. Установка этого свойства перезаписывает любое предыдущее значение. Это свойство представлено в пользовательском интерфейсе Excel в диалоговом окне Замещающий текст, доступ к которому можно получить, щелкнув правой кнопкой мыши в любом месте таблицы и пройдя по меню Таблица –> Замещающий текст. Это свойство отображается и редактируется в текстовом поле Заголовок.
Рис. 9.3. Замещающий текст
Свойство AutoFilter – это объект AutoFilter со своими собственными свойствами и методами. Его можно использовать для проверки настроек Автофильтра и повторного применения или очистки настроек Автофильтра в таблице. Он не используется для установки фильтров; для этого используется метод AutoFilter объекта Range.
Свойство Comment возвращает или задает комментарий таблицы. Свойство имеет строковый тип. Это свойство, добавленное в Excel 2007, представлено в пользовательском интерфейсе Excel в диалоговом окне Диспетчер имен, доступ к которому можно получить, пройдя по меню Формулы –> Определенные имена –> Диспетчер имен. Комментарий (примечание) отображается в правом столбце, и вы можете изменить его, кликнув на кнопку Изменить (рис. 9.4). Напомним, поскольку все Таблицы именуются, их имена отражаются в окне Диспетчер имен.
Рис. 9.4. Диспетчер имен
Свойство DisplayName возвращает или задает имя таблицы. Свойство имеет строковый тип. При назначении имени применяются те же ограничения, что и при изменении имени таблицы в пользовательском интерфейсе Excel; например, оно не может дублировать иное имя и не может содержать пробелов. Это свойство, добавленное в Excel 2007, ведет себя почти так же, как и свойство Name, но при использовании свойства DisplayName присваиваемое имя должно соответствовать ограничениям на имя таблицы, иначе возникает ошибка. Это свойство представлено в пользовательском интерфейсе Excel в виде поля ввода текста Работа с таблицами –> Конструктор –> Свойства –> Имя таблицы.
Свойство Name возвращает или задает имя таблицы. Свойство имеет строковый тип. В отличие от свойства DisplayName, когда вы присваиваете значение свойству Name, Excel изменяет имя так, чтобы оно соответствовало правилам имени таблицы. Например, он меняет пробелы на подчеркивания и, если имя уже существует, добавляет к нему символ подчеркивания, за которым следует число. Это свойство представлено в пользовательском интерфейсе Excel в виде поля ввода текста Работа с таблицами –> Конструктор –> Свойства –> Имя таблицы.
Чтобы избежать проблем, используйте свойство DisplayName вместо свойства Name для присвоения имени таблице. Свойство DisplayName создает ошибку, если имя является незаконным или уже определено в другом месте. С другой стороны, Excel будет искажать значение, присвоенное свойству Name, чтобы сделать его законным, и таким образом имя может оказаться не совсем тем, что вы намеревались.
Свойство Parent возвращает родителя таблицы. Свойство имеет тип объекта и всегда возвращает Worksheet. Свойство не может быть установлено.
Свойство QueryTable возвращает объект QueryTable, который ссылается на сервер списков. Это тип объекта QueryTable. Свойство не может быть установлено. Объект QueryTable предоставляет свойства и методы, позволяющие управлять таблицей. Следующий код публикует Таблицу на сервере SharePoint и называет опубликованный список Register. Затем он восстанавливает объект QueryTable для таблицы и устанавливает свойству MaintainConnection Таблицы значение True:
Dim Table As ListObject Dim QueryTable As QueryTable Dim PublishTarget(4) As String Dim ConnectionString As String Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») PublishTarget(0) = «0» PublishTarget(1) = «http://myserver/myproject» PublishTarget(2) = «1» PublishTarget(3) = «Register» ConnectionString = Table.Publish(PublishTarget, True) Set QueryTable = Table.QueryTable QueryTable.MaintainConnection = True |
Свойство SharePointURL возвращает URL-адрес списка SharePoint. Свойство имеет строковый тип. Это свойство устанавливается при создании или обслуживании подключения к SharePoint и не может быть изменено. Это свойство представлено в пользовательском интерфейсе Excel в виде кнопки Работа с таблицами –> Конструктор –> Данные из внешней таблицы –> Экспорт –> Экспорт таблицы в список SharePoint. Следующий код публикует существующую таблицу на сервере SharePoint с помощью SharePointURL и называет опубликованный список Register:
Dim Table As ListObject Dim QueryTable As QueryTable Dim PublishTarget(4) As String Dim ConnectionString As String Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») PublishTarget(0) = «0» PublishTarget(1) = Table.SharePointURL PublishTarget(2) = «1» PublishTarget(3) = «Register» ConnectionString = Table.Publish(PublishTarget, True) |
Свойство Slicers возвращает коллекцию срезов, связанных с таблицей. Свойство имеет тип Slicers, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов Slicer. Свойство не может быть установлено. Объект Slicers используется для добавления, управления и удаления срезов, связанных с таблицей. Каждый объект среза предоставляет свойства и методы, которые позволяют управлять срезом. Свойства срезов была добавлена в объект ListObject в Excel 2013.
В следующем примере срез добавляется и помещается на том же листе, что и Таблица. Чтобы добавить срез сначала нужно создать объект SlicerCache для каждого среза:
Dim Table As ListObject Dim SlicerCache As SlicerCache Dim Slicer As Slicer Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set SlicerCache = ThisWorkbook.SlicerCaches.Add(Table, «Category») SlicerCache.RequireManualUpdate = False Set Slicer = SlicerCache.Slicers.Add(Table.Parent, , _ «tblRegisterCategory», «Category», 100, 400) |
Объект SlicerCache привязан к таблице и фильтруемому столбцу. Сам срез является визуальным представлением кэша среза и имеет родителя, имя, заголовок и позицию; он также имеет размер, но в приведенном выше примере используется размер по умолчанию. Свойство RequireManualUpdate объекта SlicerCache имеет значение False, чтобы избежать появления в срезе сообщения Устарело.
Следующий срез настроен на отображение категории Расходы (Expense) и скрытие категории Доходы (Income):
Dim Table As ListObject Dim Slicer As Slicer Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set Slicer = Table.Slicers(«tblRegisterCategory») With Slicer.SlicerCache .SlicerItems(«Expense»).Selected = True .SlicerItems(«Income»).Selected = False End With |
Следующий срез настроен для отображения только одной категории:
Dim Table As ListObject Dim Slicer As Slicer Dim SlicerItem As SlicerItem Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set Slicer = Table.Slicers(«tblRegisterCategory») With Slicer.SlicerCache .ClearManualFilter For Each SlicerItem In .SlicerItems If SlicerItem.Name <> «Expense» Then SlicerItem.Selected = False End If Next SlicerItem End Wit |
В следующем примере происходит очистка фильтр среза:
Dim Table As ListObject Dim Slicer As Slicer Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set Slicer = Table.Slicers(«tblRegisterCategory») Slicer.SlicerCache.ClearManualFilter |
В следующем примере срез удаляется. Обратите внимание, что кэш среза также удаляется:
Dim Table As ListObject Dim Slicer As Slicer Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set Slicer = Table.Slicers(«tblRegisterCategory») Slicer.Delete Table.ShowAutoFilter = False |
Обратите внимание, что свойство таблицы ShowAutoFilter имеет значение False, чтобы скрыть раскрывающийся список, который остается после удаления среза. Если Автофильтр таблицы был включен при создании среза, то этот шаг не требуется. Если Автофильтр таблицы не был включен до добавления среза, то после удаления среза раскрывающийся элемент управления Автофильтром остается только у столбца, для которого был удален срез.
Свойство Sort возвращает объект сортировки таблицы. Свойство имеет тип Sort object. Свойство не может быть установлено. В следующем примере Таблица сортируется по дате и описанию:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») With Table .Sort.SortFields.Add .ListColumns(«Date»).DataBodyRange,_ xlSortOnValues, xlAscending .Sort.SortFields.Add .ListColumns(«Description»)._ DataBodyRange, xlSortOnValues, xlAscending .Sort.Apply .Sort.SortFields.Clear End With |
На защищенном листе невозможно выполнить сортировку Таблицы, если не будут разблокированы все ячейки в заголовке таблицы и теле данных. Или снимите защиту со всего листа, выполните сортировку, и затем снова защитите лист.
Свойство SourceType возвращает текущий источник таблицы. Свойство имеет тип XlListObjectSourceType. Свойство не может быть установлено. Свойство может принимать следующие константы:
- xlSrcExternal или 0 – источник является внешним источником данных, таким как сайт Microsoft SharePoint.
- xlSrcModel или 4 – источником является модель Power Pivot.
- xlSrcQuery или 3 – источником является запрос Power Query.
- xlSrcRange или 1 – источником является объект Range.
- xlSrcXml или 2 – источником является XML.
Свойство Summary возвращает или задает текст, используемый для замещающего текста при публикации таблицы. Свойство имеет строковый тип, введенный в Excel 2010. Установка этого свойства перезаписывает любое предыдущее значение. Это свойство представлено в пользовательском интерфейсе Excel в диалоговом окне Замещающий текст, доступ к которому можно получить, щелкнув правой кнопкой мыши в любом месте Таблицы и выбрав Таблица –> Замещающий текст (см. рис. 9.3). Это свойство отображается и редактируется в текстовом поле Описание.
Свойство TableObject возвращает объект TableObject Таблицы. Свойство имеет тип объекта TableObject. Свойство не может быть установлено. Объект TableObject предоставляет свойства и методы, позволяющие управлять объектами таблицы. TableObject – это объект, построенный на основе данных, полученных из модели Power Pivot. Он был введен в Excel 2013.
Свойство XmlMap возвращает объект XmlMap Таблицы, который предоставляет карту XML Таблицы. Свойство имеет тип объекта XmlMap. Объект XmlMap предоставляет свойства и методы, позволяющие управлять XML-картой. Свойство не может быть установлено.
Другие свойства Таблиц
Свойство ListColumn – это элемент в свойстве или коллекции ListColumns. ListColumn – это объект с рядом полезных свойств, включая следующие:
- Range – ссылки на ячейки в столбце, включая заголовок и итоговые строки, если они включены.
- DataBodyRange – тип объекта Range, который ссылается на столбец, исключая строки заголовка и итогов. Это пересечение диапазонов, представленных свойством Range объекта ListObject и диапазоном DataBodyRange объекта ListObject.
- Index – относительный номер индекса столбца, представленного объектом ListColumn.
- Parent – объект ListObject, которому принадлежит столбец.
ListColumn также включает метод Delete – удаляет столбец из Таблицы.
Каждый объект ListRow в коллекции строк имеет три часто используемых свойства: Range, которое ссылается на ячейки в этой строке; Index, которое является относительным номером индекса этой строки, и Parent, которое ссылается на объект ListObject, содержащий строку. Объект ListRow также имеет один метод Delete, который удаляет строку из таблицы.
Методы объекта Таблицы
Метод Delete удаляет Таблицу, включая все ее значения, формулы и форматирование. Не путайте этот метод с методом Unlist, который преобразует таблицу в обычный диапазон ячеек.
Метод ExportToVisio экспортирует и открывает в Visio динамическую сводную диаграмму в новом документе. Этот метод был добавлен в Excel 2007. Ошибка возникает, если Visio не установлен у вас на ПК (см. также Глава 3. Работа с таблицами Excel).
Метод Publish публикует таблицу в службе SharePoint. Он возвращает URL-адрес опубликованного списка в SharePoint в виде строки:
expression.Publish(Target, LinkSource) |
где: expression – переменная, представляющая объект ListObject; Target – одномерный массив типа Variant, содержащий два или три элемента: URL-адрес SharePoint server, отображаемое имя списка и, при необходимости, описание списка; LinkSource – логическое значение. Если оно равно True, создает новую ссылку на новый список SharePoint. Если False, хранит ссылку на текущий список SharePoint и заменяет этот список, или, если нет никакого текущего списка, создает новый список на SharePoint без ссылок на него.
Метод Refresh обновляет таблицу из внешнего источника, если Таблица имеет такую связь. Если Таблица не связана с внешним источником данных, возвращает ошибку. Все изменения, внесенные в таблицу после последнего обновления, будут потеряны.
Метод Resize изменяет диапазон Таблицы на указанный диапазон. Метод принимает один параметр Range, который определяет новый диапазон Таблицы. Если строка заголовка включена, новый диапазон должен включать по крайней мере одну ячейку строки заголовка. Если строка заголовка отключена, новый диапазон должен содержать по крайней мере одну ячейку в первой строке диапазона тела данных. Столбцы можно добавлять и удалять с обоих концов, а строки можно добавлять и удалять только снизу. При удалении строк и столбцов все существующие данные в удаленных строках и столбцах остаются, но теперь находятся вне Таблицы. При добавлении строк и столбцов в Таблицу добавляются любые данные из дополнительных ячеек. После изменения размера структурированные ссылки в формулах в ячейках, отсутствующих в Таблице, преобразуются в абсолютные стандартные ссылки на ячейки. Если Таблица связана со списком SharePoint, можно добавлять и удалять только строки. Попытка добавить или удалить столбцы в связанной таблице приводит к ошибке.
Метод Unlink удаляет любую внешнюю ссылку на данные, если она существует.
Метод Unlist преобразует Таблицу в обычный диапазон ячеек. В интерфейсе Excel это эквивалентно команде Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Инструменты –> Преобразовать в диапазон.
Другие методы
Метод Add объекта ListObject добавляет новую таблицу, используя существующий список данных или другой источник. При использовании существующего заголовка числовые значения преобразуются в текст, а все повторяющиеся заголовки становятся уникальными путем добавления целых значений. Вот синтаксис этого метода:
expression.Add(SourceType, Source, LinkSource, _ XlListObjectHasHeaders, Destination, TableStyleName) |
где:
- expression – переменная, представляющая объект ListObjects,
- SourceType – передает константу XlListObjectSourceType, которая определяет тип источника, используемого для создания Таблицы. Необязательный параметр. Если опущен, предполагается xlSrcRange.
- Source – если SourceType = xlSrcRange, то передайте объект Range, представляющий диапазон значений данных для преобразования в Таблицу. Необязательный параметр. Если опущен, используется текущий выбор. Если SourceType = xlSrcExternal, передайте массив строковых значений, указывающих соединение с источником, где элементы массива: 0 – URL-адрес сайта SharePoint, 1 – имя списка SharePoint, 2 – код представления GUID (уникальный шестнадцатеричный идентификатор представления),
- LinkSource – логическое значение, указывающее, должен ли внешний источник данных быть связан с объектом ListObject. Если SourceType имеет значение xlSrcExternal, то значение по умолчанию равно True, и этот параметр не требуется передавать. Если значение передается и SourceType является xlSrcRange, генерируется ошибка.
- XlListObjectHasHeaders – передает тип константы xlYesNoGuess, которая может принимать три значения: xlYes, xlNo или xlGuess. Константа указывает, имеют ли импортируемые данные метки столбцов. Если источник не содержит заголовков, Excel автоматически создает заголовки. Необязательный параметр. Если опущено, значение по умолчанию = xlGuess. Имя этого параметра должно было быть HasHeaders, но, когда метод был реализован, разработчики ошибочно использовали XlListObjectHasHeaders.
- Destination – передает объект Range, который указывает ссылку на одну ячейку в качестве назначения для верхнего левого угла Таблицы. Ошибка генерируется, если диапазон относится к нескольким ячейкам. Этот параметр должен быть указан, если SourceType = xlSrcExternal. Он игнорируется, если SourceType имеет значение xlSrcRange. Диапазон назначения должен находиться на листе, содержащем коллекцию ListObjects, указанную в expression. Столбцы вставляются перед целевым диапазоном, чтобы соответствовать новому списку, предотвращая перезапись существующих данных. Необязательный параметр.
- TableStyleName – передает имя стиля, который будет применен к Таблице. Необязательный параметр. Если опущен, применяется стиль по умолчанию.
Метод Add объекта ListRows вставляет одну новую строку в таблицу в указанной позиции. Вот синтаксис этого метода:
expression.Add(Position, AlwaysInsert) |
где:
- expression – переменная, представляющая объект ListRows.
- Position – целое число, определяющее относительное положение новой строки. Новая строка вставляется над текущей строкой в этой позиции. Необязательный параметр. Если опущен, новая строка добавляется в нижнюю часть Таблицы.
- AlwaysInsert – логическое значение, указывающее, следует ли всегда сдвигать данные в ячейках под последней строкой таблицы при вставке новой строки, независимо от того, является ли строка под таблицей пустой. При значении True ячейки под таблицей сдвигаются на одну строку вниз. При значении False, если строка под Таблицей пуста, Таблица расширяется, чтобы занять (добавить) эту строку без сдвига ячеек под ней; если строка под Таблицей содержит данные, эти ячейки сдвигаются вниз при вставке новой строки.
Метод Add возвращает объект ListRow, представляющий новую строку.
Метод Delete объекта ListRow удаляет строку Таблицы, представленную объектом ListRow.
Метод Add объекта ListColumns вставляет один новый столбец в Таблицу в указанной позиции:
- expression – переменная, представляющая объект ListColumns.
- Position – целое число, определяющее относительное положение нового столбца. Новый столбец вставляется перед текущим столбцом в этой позиции. Необязательный параметр. Если этот параметр опущен, новый столбец добавляется в правую часть Таблицы.
Этот метод возвращает объект ListColumn, представляющий новый столбец.
Метод Delete объекта ListColumn удаляет столбец Таблицы, представленный объектом ListColumn.
Метод Автофильтр объекта Range
Метод позволяет создать критерии Автофильтра для столбца, очистить критерии Автофильтра или переключить статус Автофильтра:
expression.AutoFilter(Field, Criteria1, Operator, _ Criteria2, VisibleDropDown) |
где:
- expression – выражение, возвращающее объект Range.
- Field – целочисленное смещение поля, на котором будет основан фильтр, где крайнее левое поле = 1. Необязательный параметр. Если опущен, то состояние Автофильтра (включено/выключено) переключается для всего диапазона. Отключение Автофильтра удаляет раскрывающиеся элементы управления Автофильтра.
- Criteria1 – критерий в виде числа, строки или массива, например, 20 или
"
Расход"
. Можно использовать знаки равенства = и неравенства <>. Чтобы найти несколько строк, используйте функцию Array со значением оператора xlFilterValues, например, Array("
Значение 1"
,"
Значение 2"
). Подстановочные знаки * (один или несколько символов) и ? (можно использовать любой отдельный символ). Если оператор xlTop10Items, то Criteria1 задает число элементов, например 10. Когда оператор xlFilterDynamic, Criteria1 – это константа xlDynamicFilterCriteria (описана ниже). Необязательный параметр. Если опущен, критерии для столбца очищаются. - Operator – передает константу XlAutoFilterOperator, определяющую тип фильтра. Необязательный параметр. Если опущен, то принимается равным 0, и Crtiteria1 рассматривается как простое значение для поиска; в этом случае, если в Crtiteria1 передается массив значений, то используется только последнее значение. Если этот параметр опущен, а Crtiteria1 не указан, то Автофильтр для указанного столбца будет очищен.
- Criteria2 – второй критерий в виде числа, строки или массива. Он используется с Crtiteria1 и Operator для построения составных критериев или когда Operator = xlFilterValues, а фильтруются дата и время (описано ниже). Необязательный параметр.
- VisibleDropDown – передает True, чтобы отобразить стрелку раскрывающегося списка Автофильтра для отфильтрованного поля, и False, чтобы скрыть раскрывающийся список Автофильтра для отфильтрованного поля. Необязательный параметр. Если опущен, принимает значение True.
Если заданы критерии фильтрации, то возвращаемое значение является значением Field. При переключении статуса Автофильтра возвращается значение True.
Значения констант оператора XlAutoFilterOperator:
- xIAnd или 1 – фильтры с логическим И для Criteria1 and Criteria Оба критерия являются строками, задающими условия, например,
"
>0"
и"
<100"
. - xlBottom10Items или 4 – находит отображаемые элементы с наименьшим значением, где число элементов задается как число или строка в Criteria1, например, 5 или
"
5"
, то есть пять наименьших элементов. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка. - xlBottom10Percent или 6 – найти отображаемые элементы с наименьшим значением, где процент указан как число или строка в Criteria1, например, 20 или
"
20"
для элементов в нижних 20%. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка. - xlFilterCellColor или 8 – находит цвет ячейки, где цвет указан как значение RGB в Criteria
- xlFilterDynamic или 11 – динамический фильтр, где критерий фильтра задается как значение XlDynamicFilterCriteria в Criteria Динамический фильтр – это фильтр, изменяющийся в зависимости от какого-либо другого значения, например сегодняшней даты или среднего значения в столбце.
- xlFilterFontColor или 9 – находит цвет шрифта, где цвет указан как значение RGB в Criteria
- xlFilterIcon или 10 – находит значок, указанный в Criteria Значки извлекаются из свойства ActiveWorkbookIconSets. Свойство IconSets представляет собой набор объектов IconSets, в котором каждый набор иконок представляет собой набор из ряда иконок, таких как набор
"
3 стрелки (цветные)"
или"
3 Arrows (Colored)"
. В приведенном ниже примере извлекается первый значок в наборе"
3 стрелки (цветные)"
:
ActiveWorkbook.IconSets(xlIconSet.xl3Arrows).Item(1) |
Обратите внимание, что при вводе в редакторе VBA "
xlIconSet."
(включая точку) появится всплывающий список IntelliSense со всеми доступными ссылками на набор значков.
- xlFilterValues или 7 – находит несколько значений, заданных в виде массива в Criteria1 или Criteria Значения в массиве должны быть строковыми и точно соответствовать отображаемому значению, если оно числовое; например, если соответствующие значения отображаются как
"
$25.00"
, передаваемое значение должно быть"
$25.00"
. Criteria2 используется при поиске дат и времени. При поиске дат и времен массив передается как массив пар значений, где первое значение каждой пары является типом поиска, а второе –датой. Типы поиска: 0 – находит элементы в том же году, что и следующее значение даты / времени; 1 – находит элементы в том же месяце, что и следующее значение даты / времени; 2 – находит элементы на ту же дату, что и следующее значение даты / времени; 3 – находит элементы в тот же час, что и следующее значение даты / времени; 4 – находит элементы в ту же минуту, что и следующее значение даты / времени; 5 – находит элементы в ту же секунду, что и следующее значение даты / времени.
Может быть передано любое количество пар типа поиска и значения даты / времени. Все значения типа поиска должны находиться в нечетных позициях в массиве (1, 3, 5 и т.д.), а все значения даты/времени должны быть в четных позициях (2, 4, 6 и т.д.). Любое значение, переданное для типа поиска, которого нет в приведенном выше списке, создает ошибку. Любое значение, переданное для значения даты/времени, которое не является значением даты/времени, создает ошибку. Допустимо любое значение даты/времени, которое может быть введено в ячейку и распознано как дата. Некоторые примеры значений Criteria2:
Показать все элементы в 2014 году: Array(0, "
1/1/2014"
)
Показать все элементы в 2014 году, когда текущий год 2014: Array(0, "
1/1"
)
Показать все элементы в январе 2014 года: Array(1, "
1/1/2014"
)
Показать все элементы 15 января 2014 года: Array(2, "
15/1/2014"
)
Показывать все элементы 15, 20 и 25 января 2014 года: Array(2, "
15/1/2014"
, 2, "
20/1/2014"
, 2, "
25/1/2014"
)
Показать все элементы в 2013 году и в январе 2014 года: Array(0, "
1/1/2013"
, 1, "
1/1/2014"
)
Показать все элементы в в 3 часа дня 15 января 2014 года: Array(3, "
15/1/2014 15:00"
) или Array(3, "
15/1/2014 3 PM"
)
Показать все элементы в 15:01 15 января 2014 года: Array (3, "
15/1/2014 15:01"
) или Array(3, "
15/1/2014 3:01 PM"
)
- xlOr или 2 – логическим ИЛИ для Criteria1 and Criteria Оба критерия – это строки, задающие условие, например
"
<0"
и"
>100"
для значений меньше нуля или больше 100. - xlTop10Items или 3 – находит отображаемые элементы с наибольшим значением, где число элементов задается как число или строка в Criteria1, например 5 или
"
5"
, то есть пять самых больших элементов. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка. - xlTop10Percent или 5 – находит отображаемые элементы с наибольшим значением, где процент указан как число или строка в Criteria1, например 20 или
"
20"
для элементов в верхних 20%. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
Значения констант оператора XlDynamicFilterCriteria:
- xlFilterToday – фильтрует все значения дат, равные сегодняшнему дню.
- xlFilterYesterday – фильтрует все значения дат, равные вчерашнему дню.
- xlFilterTomorrow – фильтрует все значения дат, равные завтрашнему дню.
- xlFilterThisWeek – фильтрует все значения дат на текущей неделе.
- xlFilterLastWeek – фильтрует все значения дат за предыдущую неделю.
- xlFilterNextWeek – фильтрует все значения дат на следующей неделе.
- xlFilterThisMonth – фильтрует все значения дат в текущем месяце.
- xlFilterLastMonth – фильтрует все значения дат за предыдущий месяц.
- xlFilterNextMonth – фильтрует все значения дат в следующем месяце.
- xlFilterThisQuarter – фильтрует все значения дат в текущем квартале.
- xlFilterLastQuarter – фильтрует все значения дат в предыдущем квартале.
- xlFilterNextQuarter – фильтрует все значения дат в следующем квартале.
- xlFilterThisYear – фильтрует все значения дат в текущем году.
- xlFilterLastYear – фильтрует все значения дат за предыдущий год.
- xlFilterNextYear – фильтрует все значения, относящиеся к следующему году.
- xlFilterYearToDate – фильтрует все значения дат с начала года по сегодня.
- xlFMterAMDatesInPeriodQuarterl – фильтрует все значения дат в квартале
- xlFMterAMDatesInPeriodQuarter2 – фильтрует все значения дат в квартале 2.
- xlFMterAMDatesInPeriodQuarter3 – фильтрует все значения дат в квартале 3.
- xlFilterAllDatesInPeriodQuarter4 – фильтрует все значения дат в квартале 4.
- xlFilterAllDatesInPeriodJanuary – фильтрует все значения дат в январе.
- xlFilterANDatesInPeriodFebruary – фильтрует все значения дат в феврале.
- xlFilterAllDatesInPeriodMarch – фильтрует все значения дат в марте.
- xlFilterAllDatesInPeriodApril – фильтрует все значения дат в апреле.
- xlFilterAllDatesInPeriodMay – фильтрует все значения дат в мае.
- xlFilterAllDatesInPeriodJune – фильтрует все значения дат в июне.
- xlFilterAllDatesInPeriodJuly – фильтрует все значения дат в июле.
- xlFilterAllDatesInPeriodAugust – фильтрует все значения дат в августе.
- xlFilterAllDatesInPeriodSeptember – фильтрует все значения дат в сентябре.
- xlFilterAllDatesInPeriodOctober – фильтрует все значения дат в октябре.
- xlFilterAllDatesInPeriodNovember – фильтрует все значения дат в ноябре.
- xlFilterAllDatesInPeriodDecember – фильтрует все значения дат в декабре.
- xlFilterAboveAverage – фильтрует все значения выше среднего.
- xlFilterBelowAverage – фильтрует все значения ниже среднего.
Доступ к элементам Таблицы
Хотя свойства ListObject, ListColumns, ListRows предоставляют доступ к основным частям таблицы, существуют и другие способы доступа к элементам таблицы с использованием синтаксиса структурированных ссылок, описанного в главе 4. Эти способы могут быть более удобными, в зависимости от стиля программирования и предпочтений. В приведенных ниже примерах предполагается, что есть Таблица с именем "
tblRegister"
на листе с именем "
Register"
с заголовками столбцов "
Date"
, "
Description"
, "
Category"
и "
Amount"
:
Чтобы использовать структурированную ссылку, используйте объект Range для извлечения диапазона, описанного ссылкой. Объект Range является дочерним объектом многих объектов Excel, включая объекты Application и Worksheet. При использовании объекта Range с объектом Application ссылка должна иметь глобальную область действия. При использовании Range с Worksheet (или Sheet) ссылка может иметь глобальную или локальную (Worksheet) область.
Область действия имени определяет, откуда к нему можно получить доступ. Ссылка с глобальной областью действия может быть доступна из любого объекта. На ссылку с локальной областью действия можно ссылаться только из листа, на котором определена конкретная ссылка.
Имена таблиц определены глобально, то есть, вы можете получить к ним доступ из любого модуля кода, не уточняя ссылку на объект листа, в котором находится таблица. Например, следующие ссылки эквивалентны:
ThisWorkbook.Worksheets(«Register»).Range(«tblRegister[Date]») Application.Range(«tblRegister[Date]») Range(«tblRegister[Date]») [tblRegister[Date]] |
Чтобы соответствовать этому правилу, Excel требует, чтобы каждая Таблица в книге имела уникальное имя. Это правило управляет всеми глобальными именами, а не только именами Таблиц.
Чтобы уменьшить вероятность коллизии имен, можно предварить все имена таблиц общим префиксом, часто называемым «венгерской нотацией», описанной в главе 2, например, "
tbl"
.
Excel 2003 не поддерживает структурированные ссылки. Существуют также некоторые различия между Excel 2007, 2010 и 2013 с точки зрения поддержки структурированных ссылок.
Создание и присвоение имени Таблице
Таблицы создаются с помощью метода Add объекта ListObjects. После создания новой Таблицы свойству DisplayName объекта ListObject присваивается имя новой Таблицы. Имя Таблицы, присваиваемое по умолчанию, зависит от источника Таблицы: xlSrcRange (диапазон данных на листе), xlSrcExternal (внешний источник данных), xlSrcModel (модель данных Power Pivot) и xlSrcQuery (запрос). Тип источника xlSrcXml (источник XML) не рассматривается, но показаны обходные пути.
Использование диапазона данных
В этом примере создается новая таблица, использующая существующий диапазон данных с заголовками. Параметр SourceType имеет значение xlSrcRange:
Dim TableRange As Range Dim Table As ListObject Set TableRange = ThisWorkbook.Worksheets(«Register»). _ Range(«A1»).CurrentRegion Set Table = ThisWorkbook.Worksheets(«Register»). _ ListObjects.Add(xlSrcRange, TableRange, ,xlYes) Table.DisplayName = «tblRegister» |
Обратите внимание, что четвертый параметр, xlYes, сообщает Excel, что список данных уже содержит заголовки. В этом примере Таблица будет названа сразу же после ее создания; это поможет вам найти объект ListObject позже.
Использование модели данных Power Pivot
В этом примере для создания соединения с базой данных SQL Server используется объект TableObject. Таблица SQL "
Product"
добавляется в модель данных Power Pivot. Таблица помещается на рабочий лист "
Sheet1"
в ячейку A1. Поскольку взаимодействие происходит с моделью данных, то вместо объекта ListObject с xlSrcModel, переданного для SourceType, должен использоваться объект TableObject. Измените текст "
YourServerName"
на имя нужного SQL-сервера. Используется база данных AdventureWorks2012:
Dim SQLConnection As WorkbookConnection Dim TargetWorksheet As Worksheet Dim Table As TableObject Dim ConnectionString As String Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1») ConnectionString = «OLEDB;Provider=SQLOLEDB.1; _ Integrated Security=SSPI;» & «Initial Catalog _ =AdventureWorks2012;Data Source=YourServerName» Set SQLConnection = ActiveWorkbook.Connections.Add2(«FriendlyName», _ «Description», ConnectionString, «Product», 3, True) With TargetWorksheet Set Table = .ListObjects.Add(SourceType:=xlSrcModel, _ Source:=SQLConnection, Destination:=.Range(«A1»)).NewTable End With Table.ListObject.DisplayName = «tblNewTable» |
Константа xlSrcModel была добавлена в Excel 2013.
В следующем примере предполагается, что книга уже имеет соединение SQL Server с Таблицей в модели данных Power Pivot, и задача состоит в том, чтобы извлечь данные из таблицы модели данных в новую Таблицу Excel. Тип источника – xlSrcModel, и предполагается, что имя Таблицы модели данных – "
Product"
. Этот пример работает только в Excel 2013:
Dim ModelSource As Model Dim SourceTable As ModelTable Dim TargetWorksheet As Worksheet Dim Table As TableObject Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1») Set ModelSource = ThisWorkbook.Model Set SourceTable = ModelSource.ModelTables(«Product») Set Table = TargetWorksheet.ListObjects.Add(SourceType:=xlSrcModel, _ Source:=SourceTable.SourceWorkbookConnection, _ LinkSource:=True, Destination:=DestinationSheet.Range(«A1»)).TableObject Table.Refresh |
Использование запроса Power Query
В этом примере объект QueryTable используется для создания соединения с базой данных SQL Server. Таблица "
Product"
добавляется на лист "
Sheet1"
в ячейку А1. Измените текст "
YourServerName"
на имя нужного SQL-сервера. Используется база данных AdventureWorks2012:
Dim TargetWorksheet As Worksheet Dim Table As QueryTable Dim ConnectionString As String Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1») ConnectionString = «OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;» _ & «Initial Catalog=AdventureWorks2012;Data Source=YourServerName» Set Table = TargetWorksheet.ListObjects.Add(SourceType:=xlSrcExternal, _ Source:=ConnectionString, LinkSource:=True, _ Destination:=DestinationSheet.Range(«A1»)).QueryTable Table.CommandText = Array(«»«AdventureWorks2012»«.»«Production»«.»«Product»«») Table.CommandType = xlCmdTable Table.Refresh BackgroundQuery:=False Table.ListObject.DisplayName = «tblNewTable» |
Константа xlSrcQuery была добавлена в Excel 2007.
При использовании xlSrcExternal необходимо указать параметр назначения. При использовании объекта QueryTable необходимо задать свойства CommandText и CommandType перед обновлением соединения.
В этом примере используется тип источника xlSrcExternal, который используется для любого внешнего подключения к данным. Передача xlSrcQuery для параметра SourceType приводит к тому же результату. Как правило, xlSrcQuery используется для подключения к базе данных, а xlSrcExternal используется для подключения к SharePoint.
Использование источника XML
По замыслу, метод Add объекта ListObjects с типом источника xlSrcXml должен создать объект ListObject, используя в качестве источника XML-файл. Однако этот метод ненадежен, и нет известных рабочих примеров его использования. Для импорта исходного файла XML в Таблицу рекомендуется использовать два метода. Во-первых, необходимо импортировать XML-файл в новую пустую книгу:
Workbooks.OpenXML Filename:=«C:XML File Name.xml», _ LoadOption:=xlXmlLoadImportToList |
Во-вторых, необходимо импортировать XML-файл в существующий лист в указанном диапазоне.:
ActiveWorkbook.XmlImport URL:=«C:XML File Name.xml», _ ImportMap:=Nothing, Overwrite:=True, _ Destination:=Range(«A1») |
В этих примерах, если указанный источник XML не ссылается на схему, Excel создает ее на основе того, что он найдет в указанном XML-файле.
Информация о Таблице
В следующих примерах предполагается, что DataBodyRange является допустимым объектом диапазона. Если в Таблице нет существующих строк (то есть если ListRows.Count равно 0), любая ссылка на DataBodyRange вернет ошибку.
Определение того, существует ли таблица
Это не простая задача, так как имя таблицы, которой нет, может использоваться с коллекцией ListObjects. В следующем коде показано, как использовать обработку ошибок для определения того, существует ли таблица:
Dim Table As ListObject Set Table = Nothing On Error Resume Next Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») On Error GoTo 0 If Table Is Nothing Then Debug.Print «Table does not exist» Else Debug.Print «Table exists» End If |
Зачем устанавливать объектную переменную равную Nothing, прежде чем пытаться присвоить ей значение? В приведенном выше случае это не обязательно, поскольку VBA инициализирует каждую переменную, когда она определена с помощью оператора Dim. Но он включен выше в качестве примера написания надежного кода, потому что, если возникает ошибка, переменная не трогается и, если она уже содержит ссылку на другой объект, следующий тест не даст желаемого результата.
Определение адреса таблицы
В следующем примере выводится адрес Таблицы и адрес DataBodyRange Таблицы:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Debug.Print «Table’s address: « & Table.Range.Address Debug.Print «Table’s data body range address: « _ & Table.DataBodyRange.Address |
Определение количества строк
Количество строк в таблице определяется с помощью свойства Count объекта ListRows:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Debug.Print «Number of rows: « & Table.ListRows.Count |
Свойство Count возвращает 0, если таблица пуста (то есть имеет одну строку, готовую для ввода данных, и нет данных ни в одной ячейке).
Определение количества столбцов
Количество столбцов в таблице определяется с помощью свойства Count объекта ListColumns:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Debug.Print «Number of columns: « & Table.ListColumns.Count |
Определение того, существует ли столбец
Это также непростая задача. В следующем коде показано, как использовать обработку ошибок для определения того, существует ли столбец:
Dim Table As ListObject Dim ListColumn As ListColumn Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set ListColumn = Nothing On Error Resume Next Set ListColumn = Table.ListColumns(«Description») On Error GoTo 0 If ListColumn Is Nothing Then Debug.Print «Column does not exist» Else Debug.Print «Column exists» End If |
Добавление строк
Существует несколько способов добавления новых строк в Таблицу. Если вы добавляете одну строку, используйте метод Add объекта ListRows. Он возвращает объект ListRow, который затем можно использовать для добавления значений в эту новую строку:
Dim Table As ListObject Dim NewRow As ListRow Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set NewRow = Table.ListRows.Add With NewRow.Range .Columns(1).Value = #1/1/2015# .Columns(2).Value = «Transaction 20» .Columns(3).Value = «Expense» .Columns(4).Value = —75 End With |
Обратите внимание, что в этом примере параметр Position не был передан методу Add, что привело к добавлению новой строки в конец таблицы. Чтобы вставить новую строку в определенную позицию таблицы, используйте параметр Position.
Чтобы добавить более одной строки в нижнюю часть таблицы, удобнее добавлять строки за один шаг, чем вызывать метод Add объекта ListRows несколько раз. В следующем примере строка итогов отключена, новые данные копируются в пустые ячейки непосредственно под Таблицей, после чего строка итогов включается. (Если функция TotalRow не отключена, Таблица не распознает новые строки и поэтому не расширяется для их включения.) Новые данные копируются из диапазона A2:D11 на листе Data:
Dim Table As ListObject Dim NewValues As Variant Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») NewValues = ThisWorkbook.Worksheets(«Data»).Range(«A2:D11»).Value Table.ShowTotals = False With Table.DataBodyRange .Resize(10).Offset(.Rows.Count).Value = NewValues End With Table.ShowTotals = True |
Чтобы вставить несколько строк в середину таблицы, используйте метод Insert объекта Range для вставки пустых ячеек, а затем эти ячейки заполняются новыми данными. В следующем примере 10 строк данных вставляются после существующей строки 2 (и перед строкой 3):
Dim Table As ListObject Dim NewValues As Variant Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») NewValues = ThisWorkbook.Worksheets(«Data»).Range(«A2:D11»).Value With Table.DataBodyRange .Resize(10).Offset(2).Insert Shift:=xlShiftDown .Resize(10).Offset(2).Value = NewValues End With |
Удаление строк
Метод, который вы используете, зависит от того, сколько строк вы хотите удалить.
Удаление одной строки
Для удаления одной строки используется метод Delete объекта ListRow:
Dim Table As ListObject Dim ListRow as ListRow Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Set ListRow = Table.ListRows(3) ListRow.Delete |
Переменной ListRow присваивается третий объект ListRow в коллекции ListRows, а затем вызывается метод Delete объекта ListRow. Вот альтернативная, более короткая версия примера, которая не требует переменной ListRow:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Table.ListRows(3).Delete |
Удаление нескольких строк
Удаление нескольких строк одновременно требует использования метода Delete объекта Range. В следующем примере удаляются 10 строк, начиная со строки 3:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Table.DataBodyRange.Resize(10).Offset(2).Delete |
Удаление всех строк
В следующем примере удаляются все строки таблицы:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Table.DataBodyRange.Delete |
В этом примере объекту DataBodyRange после завершения кода присваивается значение Nothing. Любые последующие ссылки на этот объект возвращают ошибку, если в Таблицу не добавлена хотя бы одна строка.
Циклы
В первом примере выполняется цикл по всем строкам Таблицы, добавляя в переменную TotalExpenses значения всех строк в столбце Expense (расходы) и выводя результат в окно Immediate:
Dim Table As ListObject Dim ListRow As ListRow Dim TotalExpenses As Double Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») For Each ListRow In Table.ListRows If ListRow.Range.Columns(3).Value = «Expense» Then TotalExpenses = TotalExpenses + ListRow.Range.Columns(4).Value End If Next ListRow Debug.Print «Total expenses: « & TotalExpenses |
Ниже приведен альтернативный метод, использующий имена столбцов:
Dim Table As ListObject Dim ListRow As ListRow Dim TotalExpenses As Double Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») For Each ListRow In Table.ListRows If Intersect(ListRow.Range, Table.ListColumns(«Category»).Range) _ .Value = «Expense» Then TotalExpenses = TotalExpenses + Intersect(ListRow.Range, Table. ListColumns(«Amount»).Range).Value End If Next ListRow Debug.Print «Total expenses: « & TotalExpenses |
Во втором примере выполняется цикл по столбцам Таблицы, выводя имя каждого столбца на экран с помощью коллекции ListColumns и оператора For / Each:
Dim Table As ListObject Dim ListColumn As ListColumn Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») For Each ListColumn In Table.ListColumns Debug.Print ListColumn.Name Next ListColumn |
Фильтрация
Одной из самых мощных особенностей Таблиц является их способность фильтровать строки. Объектная модель Excel предоставляет объект AutoFilter (дочерний элемент объекта ListObject) и метод AutoFilter (дочерний элемент объекта Range), что позволяет полностью контролировать процесс фильтрации в VBA. Используйте объект ListObject.AutoFilter для проверки текущих настроек Автофильтра, обновления Автофильтра и очистки Автофильтра. Используйте метод Range.AutoFilter для задания критериев Автофильтра.
Включение и выключение Автофильтра
Вы включаете и выключаете Автофильтр, задавая свойству ShowAutoFilter значения True (вкл.) и False (выкл.). В следующем примере показано, как включить Автофильтр:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Table.ShowAutoFilter = True |
Поскольку Автофильтр – это объект, который не имеет значения при отключенном Автофильтре, любой код, ссылающийся на какие-либо свойства и методы объекта Автофильтра, будет генерировать ошибку, если Автофильтр отключен. Чтобы избежать ошибок, убедитесь, что Автофильтр включен, и получите доступ к свойствам и методам объекта Автофильтра только в этом случае. Примеры ниже показывают, как осуществить эту проверку.
Вы также можете включать и отключать Автофильтр, повторно вызывая метод Range.AutoFilter без каких-либо параметров. Использование этого метода просто переключает состояние Автофильтра.
Определение состояния фильтрации
Объект Автофильтр используется для определения того, включен ли Автофильтр:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») If Table.ShowAutoFilter Then Debug.Print «AutoFilter is on» Else Debug.Print «AutoFilter is off» End If |
Если Автофильтр включен, вы используете свойство FilterMode объекта Автофильтра, чтобы определить, установлены ли критерии фильтрации:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») If Table.ShowAutoFilter Then If Table.AutoFilter.FilterMode Then Debug.Print «Filtering is active» Else Debug.Print «Filtering is inactive» End If Else Debug.Print «AutoFilter is off» End If |
Определение того, фильтруется ли столбец
Если Автофильтр включен, можно использовать свойство On объекта Filter, чтобы определить, имеет ли столбец активный критерий фильтра:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») If Table.ShowAutoFilter Then If Table.AutoFilter.Filters(3).On Then Debug.Print «Column 3 is being filtered» End If Else Debug.Print «AutoFilter is off» End If |
Создание фильтров
Вы создаете (применяете) фильтры по одному столбцу за раз. Для добавления и удаления критериев фильтрации используется метод AutoFilter объекта Range. При применении критерия Автофильтра строка заголовка включается автоматически. В примерах ниже предполагается, что Таблица не имеет активных критериев фильтрации: Ниже приведены примеры, каждый из которых начинается с этих двух строк кода. Предполагается, что Таблица не имеет активных критериев фильтрации:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») |
В следующем примере фильтруются строки со значением Expense в третьем столбце.:
Table.Range.AutoFilter Field:=3, Criteria1:=«Expense» |
А здесь фильтруются строки с Expense или Income в третьем столбце.:
Table.Range.AutoFilter Field:=3, _ Criteria1:=Array(«Expense», «Income»), Operator:=xlFilterValues |
Ниже показаны только строки со значениями во втором столбце, которые начинаются с Transaction:
Table.Range.AutoFilter Field:=2, Criteria1:=«Transaction*» |
Строки в четвертом столбце со значениями больше нуля:
Table.Range.AutoFilter Field:=4, Criteria1:=«>0» |
Строки с Income в третьем столбце и значениями более 100 – в четвертом:
Table.Range.AutoFilter Field:=3, Criteria1:=«Income» Table.Range.AutoFilter Field:=4, Criteria1:=«>100» |
Повторное применение критериев активного фильтра
Видимость строк в отфильтрованной таблице может не совпадать с критериями фильтра при изменении данных и добавлении новых строк. Эту ситуацию можно исправить, повторно применив критерии активного фильтра:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») If Table.ShowAutoFilter Then Table.AutoFilter.ApplyFilter End If |
Очистка фильтра одного столбца
Вы можете очистить фильтр одного столбца, используя метод AutoFilter и указав только параметр Field. В следующем примере очищаются критерии фильтра третьего столбца:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») Table.Range.AutoFilter Field:=3 |
Очистка всех фильтров
Вы можете очистить критерии фильтрации для всех столбцов за один шаг, не отключая Автофильтр, вызвав метод ShowAllData:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») If Table.ShowAutoFilter Then Table.AutoFilter.ShowAllData End If |
Скрытие раскрывающихся элементов управления по столбцам
Вы можете скрыть раскрывающиеся элементы управления Автофильтра в определенных столбцах. В следующем примере показано, как скрыть раскрывающийся элемент управления AutoFilter во втором столбце Таблицы:
Dim Table As ListObject Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister») If Table.ShowAutoFilter Then Table.Range.AutoFilter Field:=2, VisibleDropDown:=False End If |
Пользовательские процедуры
В следующих разделах приведены некоторые пользовательские процедуры. Более надежные версии этих программ и ряд других программ, а также полезные утилиты и библиотеки доступны по адресу http://exceltables.com/.
Делаем объемную вставку
Следующая функция вставляет массив значений в Таблицу и возвращает новые строки в виде диапазона. Если задана строка, то значения вставляются выше этой строки; в противном случае значения добавляются в нижнюю часть Таблицы. Функция также сопоставляет столбцы значений со столбцами Таблицы с помощью параметра ColumnAssignmentS. Дополнительные сведения о параметрах см. в комментариях к процедуре.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
Public Function BulkInsertIntoTable( _ ByVal Table As ListObject, _ ByVal Values As Variant, _ Optional ByVal Position As Long = —1, _ Optional ByVal ColumnAssignments As Variant _ ) As Range ‘ Insert an array of values into a Table. Optionally specify the row before ‘ which the new rows are inserted. Optionally specify how the columns are ‘ assigned. The new rows in the Table are returned as a Range. ‘ Syntax ‘ BulkInsertIntoTable(Table, Values, Position, ColumnAssignments) ‘ Table — A Table object. ‘ Values — A single value, a single dimension array of values, or a two ‘ dimension array of values. ‘ Position — The row number before which the new rows are inserted. Optional. ‘ If omitted then the new rows are appended to the end of the Table. ‘ ColumnAssignments — A single dimension array of integer values specifying ‘ which Table column receives what column of values in the Values parameter. ‘ Each element in the array is a column number in the Table. The position of ‘ the element in the array corresponds to the column in the Values array. ‘ Optional. If omitted then the values are placed in column order starting in ‘ the first Table column. For example, passing Array(2,3,1) results in this ‘ column mapping: ‘ Values column 1 is placed in Table column 2. ‘ Values column 2 is placed in Table column 3. ‘ Values column 3 is placed in Table column 1. Dim Calculation As XlCalculation Dim ScreenUpdating As Boolean Dim Result As Long Dim TwoDimensionArray As Boolean Dim WorkArray As Variant Dim Column As Long Dim SourceColumn As Long Dim TargetColumn As Long Dim ShowTotals As Boolean Dim InsertRange As Range ‘ Exit if no values to insert If IsEmpty(Values) Then Exit Function Calculation = Application.Calculation Application.Calculation = xlCalculationManual ScreenUpdating = Application.ScreenUpdating Application.ScreenUpdating = False ‘ Normalize Values parameter — must be a two—dimension array On Error Resume Next Result = LBound(Values, 2) TwoDimensionArray = Err.Number = 0 On Error GoTo 0 If Not TwoDimensionArray Then If Not IsArray(Values) Then Values = Array(Values) End If ReDim WorkArray(1 To 1, 1 To UBound(Values) — LBound(Values) + 1) For Column = 1 To UBound(WorkArray, 2) WorkArray(1, Column) = Values(Column — 1 + LBound(Values)) Next Column Values = WorkArray End If ‘ Normalize Position parameter If Position < 0 Then Position = Table.ListRows.Count End If Position = Application.Max(1, Application.Min(Position, _ Table.ListRows.Count+ 1)) ‘ Save total row setting and disable total ShowTotals = Table.ShowTotals Table.ShowTotals = False ‘ Insert the new rows If Table.ListRows.Count > 0 And Position <= Table.ListRows.Count Then Table.DataBodyRange.Resize(UBound(Values)). _ Offset(Position — 1).InsertShift:=xlShiftDown End If If Table.ListRows.Count > 0 Then Set InsertRange = Table.DataBodyRange.Resize _ (UBound(Values)).Offset(Position — 1) Else Set InsertRange = Table.InsertRowRange.Resize(UBound(Values)) End If If IsEmpty(ColumnAssignments) Or IsMissing(ColumnAssignments) Then InsertRange.Value = Values Else For TargetColumn = LBound(ColumnAssignments) To _ UBound(ColumnAssignments) SourceColumn = TargetColumn — LBound(ColumnAssignments) + 1 If ColumnAssignments(TargetColumn) >= 1 And _ ColumnAssignments(TargetColumn) <= _ Table.ListColumns.Count Then InsertRange.Columns(ColumnAssignments(TargetColumn)) _ .Value = Application.Index(Values, , SourceColumn) End If Next TargetColumn End If Set BulkInsertIntoTable = InsertRange ‘ Restore the total row setting Table.ShowTotals = ShowTotals Application.Calculation = Calculation Application.ScreenUpdating = ScreenUpdating End Function |
Восстановление форматирования и формул
Обычно Таблица поддерживает одинаковое форматирование и формулы во всех строках, исключая строки заголовка и итоговые строки. При изменении форматирования или формулы в ячейке столбца Таблицы Excel применяет это новое форматирование или формулу ко всему столбцу. Форматирование и формулы автоматически применяются к новым строкам по мере их добавления.
Форматирование или формулы Таблицы могут стать несогласованными, если вы вручную редактируете форматирование или применяете разные формулы в одном столбце Таблицы. Вы можете исправить столбец Таблицы, повторно применив форматирование ко всему столбцу плюс одна дополнительная строка внизу (строка итогов должна быть отключена, чтобы выполнить эту корректировку). Вы можете исправить формулу (преобразовать столбец обратно в вычисляемый столбец), применив формулу ко всему столбцу.
Процедура ниже выполняет это с помощью метода изменения размера Таблицы. Сначала Таблица изменяется, чтобы быть только одной строкой. Затем форматирование и формулы удаляются из всех строк таблицы от строки 2 до последней строки плюс одна строка. Наконец, диапазон Таблицы возвращается к тому, что было. На этом заключительном этапе Excel должен применить форматирование и формулы в первой строке ко всем строкам ниже первой строки. В результате получается последовательно отформатированная таблица, использующая первую строку данных в качестве шаблона для всех остальных строк. Код предполагает, что в Таблице есть по крайней мере одна строка данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Public Sub RepairTable( _ ByVal Table As ListObject _ ) ‘ Repair the Table’s formatting and formulas by making them consistent down the ‘ entire length of each column. ‘ ‘ Syntax ‘ ‘ RepairTable(Table) ‘ ‘ Table — A Table object (ListObject object). Dim RowCount As Long Dim ListColumn As ListColumn Dim ShowTotals As Boolean RowCount = Table.ListRows.Count If RowCount < 2 Then Exit Sub With Table ShowTotals = .ShowTotals .ShowTotals = False .Resize .HeaderRowRange.Resize(2) For Each ListColumn In .ListColumns With ListColumn.DataBodyRange.Resize( _ Application.Max(RowCount, 1)).Offset(1) If Left(.Rows(1).Formula, 1) = «=» Then .Cells.Clear Else .Cells.ClearFormats End If End With Next ListColumn .Resize .HeaderRowRange.Resize(1 + RowCount) .ShowTotals = ShowTotals End With End Sub |
Копирование стиля Таблицы в новую книгу
Нет простого способа скопировать стиль Таблицы из одной книги в другую. Следующий пример кода копирует стиль, присвоенный Таблице с именем "
tblRegister"
, в книгу "
Destination Workbook. xlsx"
:
Sub ExportTableStyle() Dim Source As Workbook Dim Target As Workbook Dim Table As ListObject Set Source = ThisWorkbook Set Target = Workbooks(«Destination Workbook.xlsx») Set Table = Source.Worksheets(«Register»).ListObjects(«tblRegister») Target.Worksheets.Add Before:=Target.Worksheets(1) Table.Range.Copy Target.Worksheets(1).Range(«A1») Target.Worksheets(1).Delete End Sub |
[1] Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based) и с отсчетом от специфического значения заданного программистом (n-based).
[#All])
If you’ve worked with tables in VBA, you may have noticed that when deleting a table’s entire data body, you are still left with a single, blank row. This is because you must have at least one row of data for the table to still be “alive”. No data rows, no table. You can hide the header and totals row, but you can’t get rid of the body. This presents some interesting coding when working with tables, and can be problematic, aka headache-inducing.
* Check the links at the bottom of the post for additional information on these topics.
Here are some VBA examples for doing various things with tables in VBA. The file will be available (link at bottom of post) for download.
Common variables used throughout
[sourcecode language=”text”] Public WS As Worksheet
Public loSet As ListObject
Public loGet As ListObject
Public loTest As ListObject
Public rCols As Range
Public rRows As Range
Public rBody As Range
Public rData As Range
Public rHeader As Range
Public rStart As Range
Public iCol As Long
Public iRow As Long
Public iStep As Long
Public iLastRow As Long
Public iRowCnt As Long
Public iColCnt As Long
Public sMsg As String
Public Const sSheetName As String = “Sheet1”
Public Const sTableName As String = “Table1”
Public Const sTableName2 As String = “Table2”
Public Const NL As String = vbNewLine
Public Const DNL As String = vbNewLine & vbNewLine[/sourcecode]
As you can see I used some constants for testing in this specific workbook. Change these variables for testing in your environment. I tried to keep the naming convention simple.
Getting information from your tables
When working with tables via VBA it’s important to know how to look at them, and thus where to go for information. These are some examples of how to get dimension(s) information from your tables.
Listing columns
This will step through a table and list the column headers in a message box, as well as the Immediate window in the Visual Basic Editor (Ctrl + G to show it).
[sourcecode language=”vb”] Sub Table_ListColumns()
On Error Resume Next
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loTest = WS.ListObjects(sTableName)
On Error GoTo 0
If WS Is Nothing Or loTest Is Nothing Then
MsgBox “There was an error setting the variables.”, vbInformation, “ERROR!”
Exit Sub
End If
sMsg = vbNullString
For iStep = 1 To loTest.ListColumns.Count
Debug.Print loTest.ListColumns.Item(iStep).Name
sMsg = sMsg & NL & iStep & “) ” & loTest.ListColumns(iStep)
Next iStep
sMsg = “‘” & loTest.Name & “‘ column headers:” & NL & sMsg
MsgBox sMsg, vbOKOnly, “COLUMN HEADERS”
End Sub[/sourcecode]
Column count
This will not loop through the table, but give a straight count of columns, along with which/where the start/end columns are.
[sourcecode language=”vb”] Sub Table_CountColumns()
On Error Resume Next
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loTest = WS.ListObjects(sTableName)
On Error GoTo 0
If WS Is Nothing Or loTest Is Nothing Then
MsgBox “There was an error setting the variables.”, vbInformation, “ERROR!”
Exit Sub
End If
sMsg = “There are ” & loTest.ListColumns.Count & ” columns in ‘” & sTableName & “‘.”
sMsg = sMsg & DNL & “Starting on column ” & loTest.ListColumns(1).Range.Column & ” (” & loTest.ListColumns(1) & “)”
sMsg = sMsg & NL & “Ending on column ” & loTest.ListColumns(loTest.ListColumns.Count).Range.Column & ” (” & loTest.ListColumns(loTest.ListColumns.Count) & “)”
MsgBox sMsg, vbInformation, UCase(sTableName)
End Sub[/sourcecode]
Row count
Again, no loop, just find out how many rows are in the table and where they are.
[sourcecode language=”vb”] Sub Table_CountRows()
On Error Resume Next
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loTest = WS.ListObjects(sTableName)
On Error GoTo 0
If WS Is Nothing Or loTest Is Nothing Then
MsgBox “There was an error setting the variables.”, vbInformation, “ERROR!”
Exit Sub
End If
sMsg = “There are ” & loTest.ListRows.Count & ” rows in ‘” & sTableName & “‘.”
sMsg = sMsg & DNL & “Starting on row ” & loTest.ListRows(1).Range.Row
sMsg = sMsg & NL & “Ending on row ” & loTest.ListRows(loTest.ListRows.Count).Range.Row
MsgBox sMsg, vbInformation, UCase(sTableName)
End Sub[/sourcecode]
Resizing Tables
Resize table based on original
This will basically clear out the manual data and leave the formulas. It gets a row count and uses that to insert rows to its original size. Please note these focus on resizing rows programmatically, not columns, which can be trickier.
[sourcecode language=”vb”] Sub ResizeTableRows()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
‘/// Ensure the table has a data range
If loSet.DataBodyRange Is Nothing Then
MsgBox “The source table has no data stucture.”, vbExclamation, “ERROR!”
Exit Sub
End If
‘/// Get the number of rows in the table
iRowCnt = loSet.ListRows.Count
‘/// Delete destination table data
If Not loSet.DataBodyRange Is Nothing Then
loSet.DataBodyRange.Delete
End If
‘/// Resize to source table size
For iStep = 1 To iRowCnt
loSet.ListRows.Add iStep
Next iStep
‘///////////////////////////////////////////////////////////////////////////
‘/// At this point the table is restructured, and the formulas which were
‘/// there are re-populated
‘///////////////////////////////////////////////////////////////////////////
End Sub[/sourcecode]
Resize table based on another tables size (in rows)
This utilizes two tables. The second table is only used for its row size and makes the first table the same size. It deletes the DataBodyRange as well, so all manual data will be erased, leaving only formulas.
[sourcecode language=”vb”] Sub ResizeTableRowsBasedOnAnother()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
‘/// Set two tables, one to set (destination)
‘/// and one to resize from (source)
Set loSet = WS.ListObjects(sTableName)
Set loGet = WS.ListObjects(sTableName2)
‘/// Delete destination table data
If Not loSet.DataBodyRange Is Nothing Then
loSet.DataBodyRange.Delete
End If
‘/// Ensure source table has data range
If loGet.DataBodyRange Is Nothing Then
MsgBox “The source table has no data stucture.”, vbExclamation, “ERROR!”
Exit Sub
End If
‘/// Resize to source table size
For iStep = 1 To loGet.ListRows.Count
loSet.ListRows.Add iStep
Next iStep
‘///////////////////////////////////////////////////////////////////////////
‘/// At this point the table is restructured, and the formulas which were
‘/// there are re-populated
‘///////////////////////////////////////////////////////////////////////////
End Sub[/sourcecode]
Resize table columns
This example will add a single column. While I am very hesitant to code something like this, here is an example. While it’s easier to add rows, adding columns present some unique problems, which include:
- Where should the columns be inserted?
- Without proper absolute structured formula referencing, this could throw off formulas
- Ideally no data should be to the right of the table, so an error won’t be thrown.
[sourcecode language=”vb”] Sub ResizeTableCols()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
‘/// Ensure the table has a data range
If loSet.DataBodyRange Is Nothing Then
MsgBox “The source table has no data stucture.”, vbExclamation, “ERROR!”
Exit Sub
End If
‘/// Get the number of columns in the table, add one
iColCnt = loSet.ListColumns.Count + 1
‘/// Delete destination table data
If Not loSet.DataBodyRange Is Nothing Then
loSet.DataBodyRange.Delete
End If
‘/// Resize to source table size
On Error Resume Next
For iStep = 1 To iColCnt
If loSet.ListColumns(iStep) Is Nothing Then
Err.Clear
loSet.ListColumns.Add
If Err.Number > 0 Then
‘something prevented the column from being added
Exit For
End If
End If
Next iStep
On Error GoTo 0
‘///////////////////////////////////////////////////////////////////////////
‘/// At this point the table is restructured, and the formulas which were
‘/// there are re-populated
‘///////////////////////////////////////////////////////////////////////////
End Sub[/sourcecode]
Select table parts
Table ranges
It’s always best to work with actual table range referernces. While you can access the range object of the underlying worksheet, it gets tough. This shows an example.
[sourcecode language=”vb”] Sub ListTableParts()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
If loSet.DataBodyRange Is Nothing Then
If MsgBox(“Data range has been deleted. Create now?”, vbYesNo, “ERROR!”) = vbYes Then
loSet.ListRows.Add 1
End If
End If
‘/// Using standard table referencing objects
sMsg = “Standard table referencing” & DNL
If Not loSet.DataBodyRange Is Nothing Then
sMsg = sMsg & “Data range: ” & loSet.DataBodyRange.Address(0, 0) & NL
End If
If Not loSet.HeaderRowRange Is Nothing Then
sMsg = sMsg & “Header range: ” & loSet.HeaderRowRange.Address(0, 0) & NL
Else
sMsg = sMsg & “Header range: (none set)” & NL
End If
If Not loSet.TotalsRowRange Is Nothing Then
sMsg = sMsg & “Totals range: ” & loSet.TotalsRowRange.Address(0, 0) & NL
Else
sMsg = sMsg & “Totals range: (none set)”
End If
‘/// Using range referencing objects
sMsg = sMsg & DNL & “Range referencing” & NL
If Not loSet.DataBodyRange Is Nothing Then
sMsg = sMsg & “Data range: ” & loSet.Range(1, 1).Address(0, 0) & “:” & loSet.Range(loSet.Range.Rows.Count, loSet.Range.Columns.Count).Address(0, 0) & NL
End If
MsgBox sMsg, vbInformation, “INFO”
End Sub[/sourcecode]
Select table Header
This selects just the header range of the table, if it is showing. If it’s not showing the user gets the option to show it at that time.
[sourcecode language=”vb”] Sub SelectHeader()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
If Not loSet.HeaderRowRange Is Nothing Then
loSet.HeaderRowRange.Select
Else
If MsgBox(“Header row isn’t showing. Show now?”, vbYesNo, “ERROR!”) = vbYes Then
loSet.ShowHeaders = True
End If
End If
End Sub[/sourcecode]
Select table data
This selects just the data range of the table, if it is not deleted. If it’s not there the user gets the option to add it at that time.
NOTE: Adding a data body (DataBodyRange) to a table is as simple as inserting a row. This is quite a useful trick when working with tables via VBA.
[sourcecode language=”vb”] Sub SelectData()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
If Not loSet.DataBodyRange Is Nothing Then
loSet.DataBodyRange.Select
Else
If MsgBox(“Data range has been deleted. Create now?”, vbYesNo, “ERROR!”) = vbYes Then
loSet.ListRows.Add 1
End If
End If
End Sub[/sourcecode]
Select table Totals row
This selects just the totals row range of the table, if it is showing. If it’s not showing the user gets the option to show it at that time.
[sourcecode language=”vb”] Sub SelectTotalRow()
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
If Not loSet.TotalsRowRange Is Nothing Then
loSet.TotalsRowRange.Select
Else
If MsgBox(“Totals row isn’t showing. Show now?”, vbYesNo, “ERROR!”) = vbYes Then
loSet.ShowTotals = True
End If
End If
End Sub[/sourcecode]
Show table parts
This routine has a Boolean (True/False) variable passed to it to turn on or off all table parts (non-formatting)
[sourcecode language=”vb”] Sub ShowTableParts(Optional ByVal bState As Boolean = True)
‘/// Set misc variables
Set WS = ThisWorkbook.Worksheets(sSheetName)
Set loSet = WS.ListObjects(sTableName)
loSet.ShowTotals = bState
loSet.ShowHeaders = bState
If bState = True Then loSet.ShowAutoFilter = bState
End Sub [/sourcecode]
Note that the ShowAutoFilter portion only runs if a True variable is passed (turning properties on). This is because if you turn off the header row, there’s nothing to filter on, so there’s no need to worry about it.
Summary
The important parts of the object model to look at with respect to tables are:
- ListObject
- DataBodyRange
- HeaderRowRange
- TotalsRowRange
- ListRows
- ListColumns
There are other things you can do with tables via VBA, this certainly isn’t the complete guide. Some of those things include:
- Work with slicers *
- Unlist it (convert to standard range)
- Set style/formatting options
Additional information
Jan Karel Pieterse: http://www.jkp-ads.com/articles/Excel2007Tables.asp
Colin Legg: http://colinlegg.wordpress.com/2012/09/01/clearing-excel-tables/
Sample file for download: tblExample
File tested and works in Excel 2010 and 2013 without issue.
A special thanks to Chris “Smitty” Smith, Christopher T. Fennell and Colin Legg, equally for the direction, support and inspiration for this blog post. Thank you.
Содержание
- VBA Excel. Создание таблицы (умной, обычной)
- Создание и удаление умной таблицы
- Создание умной таблицы
- Стиль умной таблицы
- Умная таблица excel vba
- Команды VBA к умной таблице
- VBA Excel. Создание таблицы (умной, обычной)
- Работа с «умной» таблицей
- Создание «умной» таблицы
- Стиль «умной» таблицы
- Добавление строки итогов
- Удаление «умной» таблицы
- Создание пользовательской таблицы
- Примеры создания таблиц
- Задание для примеров
- Пример 1 – «умная» таблица
- VBA Excel PivotTable Сводные таблицы
- «Пример создания Сводной таблицы макросом VBA Excel (эксель)»
- Мнение о Средствах (инструментах) специалиста-аналитика
- Проверка вводимых данных в Excel (ключевых для работы макроса)
- Диалоговые окна Windows в макросах Word и Excel
- Фильтры данных (информации из баз данных Excel)
- Пример создания Сводной таблицы макросом VBA Excel (эксель)
- Определение строк сводной таблицы.
- Определение фильтров сводной таблицы.
- Определение полей сводной таблицы с Итоговыми данными (здесь суммами значений).
- VBA Projects
- Programming and other
- Умные схемы Excel
- Навигация по записям
- Умные схемы Excel : 12 комментариев
- Добавить комментарий Отменить ответ
- VBA Excel: примеры программ. Макросы в Excel
- Что такое VBA
- Объекты, коллекции, свойства и методы
- Как начать
- Макросы в Excel
- Пример 1
- Пример 2
VBA Excel. Создание таблицы (умной, обычной)
Создание таблицы с помощью кода VBA Excel. Создание умной и обычной пользовательской таблицы. Указание стиля умной таблицы, добавление строки итогов. Примеры.
Создание и удаление умной таблицы
Создание умной таблицы
Создается умная таблица Excel с помощью следующего кода:
В данном примере:
ActiveSheet — лист, на котором создается таблица, может быть любой лист рабочей книги Excel.
Range(«$A$1:$L$15») — диапазон, который преобразуется в таблицу. Можно использовать и такую форму: Range(Cells(1, 1), Cells(15, 12)), где индексы строк и столбцов можно заменить переменными.
xlNo — указывает, что первая строка выбранного диапазона не содержит заголовки столбцов (граф) будущей таблицы, и их необходимо добавить. В этом случае будет добавлена дополнительная строка с наименованиями столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д., которые в дальнейшем можно переименовать (количество строк в таблице, включая строку заголовков, получится на одну больше, чем в указанном диапазоне). Если в диапазоне уже содержатся заголовки столбцов будущей таблицы, то следует указать вместо xlNo значение xlYes. В этом случае первая строка указанного диапазона будет преобразована в строку заголовков, а если она будет не заполнена, то добавятся названия столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д. (количество строк в таблице, включая строку заголовков, будет то же, что и в указанном диапазоне).
МояТаблица1 — имя, присваиваемое создаваемой таблице. Имя должно быть без пробелов: при указании в коде VBA названия таблицы с пробелами, во время его выполнения Excel заменит пробелы знаками подчеркивания (по крайней мере, так происходит в Excel 2016).
Таблица будет создана со стилем по умолчанию (TableStyleMedium2 в Excel 2016).
Стиль умной таблицы
Присвоение стиля таблице (изменение стиля) осуществляется с помощью свойства TableStyle объекта ListObjects:
Источник
Умная таблица excel vba
Команды VBA к умной таблице
Добрый день,
Где можно посмотреть синтаксис команд обращения к умной таблице?
По сути мне необходимо проверить в ячейке на наличие формулы только в пределах умной таблицы
Задать имя «Умной таблице» через VBA
Приветствую! Имеется лист с множеством не больших «Умных таблиц», необходимо пройтись макросом.
Поиск последней заполненной строки в умной таблице
Добрый день! Ищу последние заполненные строки в двух умных таблицах одинаковым способом, но в одном.
Создать равный размер производным умной таблице
Добрый вечер форумчане! имеется на листе Таблица1, от не ссылками некоторые данные отражены в.
Как определить последнюю строку в умной таблице Excel
Добрый день. Работаю над решением такой задачи: Private Sub CommandButton2_Click() Dim iRow As.
Вообще, проверку наличия формулы в ячейке можно выполнить так:
Добавлено через 3 минуты
Можете сохранить ссылку на наглядное описание диапазонов умной таблицы:
http://www.thespreadsheetguru.com/bl. t-excel-tables
Казанский, не посоветуете как запретить вставку формул с дублированием по всему столбцу, в принципе умной таблицей было предусмотрено наоборот)), в общем мне нужна была реализация всего потенциала умной таблицы, кроме вставки формулы в диапазон данных таблицы
имеются 4 отчета, во всех применен формат умной таблицы, только первая является резиновой, к которой привязаны остальные три с запасом строк, в случае внесения построчно новых данных в первую форму, так вот пользователь чтобы не ставил формулы, мне это нужно блокировать
К сожалению победа достигается только в рамках одной ячейки, в остальных умная таблица по столбцу дулирует
Можно было конечно пойти другим путем, но. много чего наделано)) переделывать времени нет
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Количество записей в умной таблице по фильтру
Создал умную таблицу, произвел выбор по фильтрам. Какая формула производит подсчет количества.
Разные заголовки в умной таблице сделать одинаковыми
Добрый день. Создал «умную таблицу» из имеющейся. На ней были повторяющиеся столбцы. А после.
Сортировка разных частей столбца в «умной таблице» Эксель
Доброй ночи! Проблема: в «умной таблице» записаны данные по 2м командам в виде список ФИО и.
Поиск максимального значения в стобце умной таблице, и генерация значения+1
Всем привет! Кто может подсказать, как писать код в VBA в таком случае. Имеется умная таблица.
VBA Excel. Создание таблицы (умной, обычной)
Создание таблицы с помощью кода VBA Excel. Создание «умной» и обычной пользовательской таблицы. Указание стиля «умной» таблицы, добавление строки итогов. Примеры.
Работа с «умной» таблицей
Создание «умной» таблицы
Создается «умная» таблица Excel с помощью следующего кода:
В данном примере:
ActiveSheet – лист, на котором создается таблица, может быть любой лист рабочей книги Excel.
Range(“$A$1:$L$15”) – диапазон, который преобразуется в таблицу. Можно использовать и такую форму: Range(Cells(1, 1), Cells(15, 12)), где индексы строк и столбцов можно заменить переменными.
xlNo – указывает, что первая строка выбранного диапазона не содержит заголовки столбцов (граф) будущей таблицы, и их необходимо добавить. В этом случае будет добавлена дополнительная строка с наименованиями столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д., которые в дальнейшем можно переименовать (количество строк в таблице, включая строку заголовков, получится на одну больше, чем в указанном диапазоне). Если в диапазоне уже содержатся заголовки столбцов будущей таблицы, то следует указать вместо xlNo значение xlYes. В этом случае первая строка указанного диапазона будет преобразована в строку заголовков, а если она будет не заполнена, то добавятся названия столбцов по умолчанию: Столбец1, Столбец2, Столбец3 и т.д. (количество строк в таблице, включая строку заголовков, будет то же, что и в указанном диапазоне).
МояТаблица1 – имя, присваиваемое создаваемой таблице. Имя должно быть без пробелов: при указании в коде VBA названия таблицы с пробелами, во время его выполнения Excel заменит пробелы знаками подчеркивания (по крайней мере, так происходит в Excel 2016).
Таблица будет создана со стилем по умолчанию (TableStyleMedium2 в Excel 2016).
Стиль «умной» таблицы
Присвоение стиля таблице (изменение стиля) осуществляется с помощью свойства TableStyle объекта ListObjects:
Свойство TableStyle может принимать следующие значения:
- TableStyleLight (светлый) с индексом от 1 до 21 (в Excel 2016);
- TableStyleMedium (средний) с индексом от 1 до 28 (в Excel 2016);
- TableStyleDark (темный) с индексом от 1 до 11 (в Excel 2016).
Например, TableStyleLight5, TableStyleMedium24, TableStyleDark8.
Чтобы отменить стиль таблицы в коде VBA, необходимо свойству TableStyle присвоить пустую строку:
Этому коду соответствует выбор в разделе «Конструктор» на ленте инструментов Excel самого первого значка стилей в разделе «Светлый».
Добавление строки итогов
Строка итогов «умной» таблицы добавляется следующим образом:
Удаляется строка итогов «умной» таблицы так:
Удаление «умной» таблицы
Удалить умную таблицу очень просто:
Создание пользовательской таблицы
Мне не приходилось на практике с помощью VBA Excel создавать «умные» таблицы, в отличие от пользовательских таблиц, которые использовались для улучшения восприятия различных отчетов или сгенерированных документов.
Для создания такой таблицы необходимо:
- определить диапазон, если он заранее не известен (иногда для этого может понадобиться определить номер последней заполненной строки);
- добавить границы ячеек;
- отформатировать строку заголовков;
- добавить строку итогов, если она необходима.
Подробнее о создании пользовательской таблицы в Примере 2.
Примеры создания таблиц
Задание для примеров
Набор данных для примеров создания таблиц
Допустим, на лист Excel переданы данные для заполнения табличной части товарного чека со следующими условиями:
- в табличной части 5 граф: № п/п, Наименование, Количество, Цена и Сумма;
- сколько наименований добавил пользователь неизвестно.
- определить количество строк;
- добавить строку заголовков;
- отобразить сетку (границы ячеек);
- добавить строку итогов.
Таблицу будем оформлять двумя способами: путем создания «умной» и пользовательской таблиц.
Пример 1 – «умная» таблица
Упаковываем набор данных из задания в «умную» таблицу:
VBA Excel PivotTable
Сводные таблицы
«Пример создания Сводной таблицы макросом VBA Excel (эксель)»
В процессе профессиональной деятельности, оператор-аналитик многократно выполняет перегруппировку исходных (сырых) данных в тот формат, который удобен ему для анализа (например: таблица, график, диаграмма). Это может быть фильтрация, сортировка, создание сводных таблиц и т.д. …
Вспомните и проанализируйте свою повседневную работу…
Как часто Вам приходится выполнять однотипные операции с однотипными файлами?
Это и есть — работа по определенному алгоритму…
А значит, эту работу можно запрограммировать и поручить компьютеру…
Исходных данных может быть много!
Возможно, это будет множество листов во множестве книг Excel !
Результатов тоже может быть много (я имею в виду получение промежуточных результатов), но цель (или конечный результат) должна быть ясна и четко обозначена…
Один макрос может прочитать мегабайты данных из разных источников (обязательно предварительно указанных) и создать несколько новых файлов (или дописать информацию в существующие файлы)…
Мнение о Средствах (инструментах) специалиста-аналитика
Сфера деятельности специалиста-аналитика может быть любой (определяется компанией-работодателем), но в любом случае это работа с большими объемами информации. Как правило, информация поступает в виде однотипных файлов, генерируемых системами автоматического слежения за процессами или статистической отчетностью подразделений компании.
Файлы с расширением xlsx, а ранее xls (книги Excel) для этой цели подходят как нельзя лучше и используются чаще обычного.
В Вашей организации так? Или по-другому?
Начиная с MS Office 2007, для работы с макросами используются файлы с другим расширением: xlsm – книга Excel с поддержкой макросов. Поэтому наиболее целесообразно в виде инструментов специалисту-аналитику использовать именно файлы с расширением xlsm. Это будут небольшие файлы, не содержащие больших объемов данных, но содержащие программный код макроса и указывающие какой лист какой книги этому макросу следует обработать…
Такой инструмент дает возможность быстро использовать возможности макроса для многих файлов (регулярно поступающих к аналитику) без переноса VBA-модулей в них.
Проверка вводимых данных в Excel (ключевых для работы макроса)
Такой подход накладывает несколько более строгие требования к задаваемым ключевым данным для работы макроса (тем данным, которые вводятся над исполнительной командной кнопкой). И хотя (в случае их отсутствия) ничего страшного не произойдет и пользователь просто получит сообщение об ошибке, но желательно средствами макроса подсказать пользователю, что им «не так сделано» и как удовлетворить справедливые запросы макроса на данные…
Видимо, название листа с целевыми данными (в отличие от предыдущего файла) было изменено, но Вам всего лишь нужно уточнить (посмотреть) как именуется лист в новом файле и вбить новое название в ячейку «В2». Именно так! Не переименовывать лист под требования макроса, а изменить ключевые данные для макроса… Ведь те, кто создавал для Вас файл данных, по каким-то причинам переименовали Лист…, то есть, с большой вероятностью, и в следующем файле (например, через месяц) Лист будет называться по-новому…
Диалоговые окна Windows в макросах Word и Excel
Конечно, не очень сложно указать путь к требуемой книге Excel (ключевые данные для макроса в ячейке «В1»), но удобнее, как только Вы перешли в ячейку «В1» увидеть стандартное диалоговое окно Windows, специально предназначенное для открытия файлов и открыть книгу через него.
При этом в ячейку «В1» автоматически запишется имя открытой книги… В общем, сразу двух зайцев убиваем… И книга открыта, и макрос имеет на 100% безошибочные данные…
Фильтры данных (информации из баз данных Excel)
Фильтрация данных – это как процесс получения полезного продукта из руды…, то есть отсев всего не нужного и повышение, таким образом, полезности информации…
Фильтрация производится по эталонным данным… Вы должны указать, что Вам нужно или что Вам не нужно…
То есть можно смело говорить о двух видах фильтров:
- положительные фильтры – пропускают в результирующий файл информацию, которая совпала хотя бы с одним из эталонов, а остальную игнорируют…
- отрицательные фильтры – выбрасывают любую информацию, которая совпала хотя бы с одним из эталонов, и только оставшуюся пропускают в результирующий файл…
Для формирования сводных таблиц средствами макроса придется широко использовать и те, и другие виды фильтров.
Например, в определенной колонке листа указан город расположения аптеки…
Задача может ставиться так:
- суммирование данных по 3-5 конкретным городам – резонно использовать положительный фильтр;
- суммирование данных по всем городам, кроме Москвы и Санкт-Петербурга – здесь удобнее отрицательный фильтр;
Функция формирования фильтров для сводной таблицы (по массиву эталонных строковых значений) написана и есть в коде…
Пример создания Сводной таблицы макросом VBA Excel (эксель)
Хочу сразу оговориться, что многие авторитетные сайты, не считают задачу формирования сводной таблицы средствами VBA уместной. По их мнению, прекрасный инструментарий Excel позволяет с наименьшими трудностями обходиться без макросов в этом вопросе… Но, ко мне обращались, представители аналитического сообщества, которым скучно, и неприятно утомительно, из раза в раз устанавливать десятки флажков (checkbox) по нескольким полям большой Базы данных…. Так что все зависит от конкретного случая…. Для кого-то это решение может стать лучшим….
Определение строк сводной таблицы.
На этом этапе важно определить уровни группировки данных (по Вашему желанию или желанию Вашего руководства).
With svT.PivotFields(«Препарат»)
.Orientation = xlRowField
.Position = 1
End With
With svT.PivotFields(«Упаковка»)
.Orientation = xlRowField
.Position = 2
End With
Как видим, здесь в группу «Препарат» попали все виды упаковок данного лекарства.
Определение фильтров сводной таблицы.
На этом этапе определяем фильтры, по которым макрос создаст сводную таблицу, но подкорректировать эти фильтры возможно будет и в ручную… Excel для этого предоставляет удобные возможности.
‘добавляем эталонные строковые значения в массив необходимого размера
ReDim ar(0 To 5)
ar(0) = «Москва»:
ar(1) = «г Москва»:
ar(2) = «Москва г»:
ar(3) = «Москва, ТЦ «»Малая Родина»»»:
ar(4) = «г Владимир»:
ar(5) = «Зеленоград»
А сейчас формируем положительный фильтр по этим нескольким значениям
FilterPlusMinus True, ar, «Город» ‘оставляет только указанные города
Или отрицательный фильтр (результат показан на Рис.4)
FilterPlusMinus False, ar, «Город» ‘оставляет города, за исключением указанных
Конечно, фильтр, допускающий только одно значение выглядит проще…
‘добавление фильтра с одним значением
With ActiveSheet.PivotTables(tNam).PivotFields(«Поставщик»)
.Orientation = xlPageField
.Position = 1
End With
svT.PivotFields(«Поставщик»).ClearAllFilters
svT.PivotFields(«Поставщик»).CurrentPage = «Санофи Россия»
А это фильтр, который по умолчанию фильтром не является, так как пропускает любые значения…, но все же есть смысл его добавить к сводной таблице, чтобы иногда… (в некоторых трудно прогнозируемых случаях), можно было его подстроить вручную…
‘добавление фильтра со всеми значениями (для ручной корректировки в процессе анализа)
With ActiveSheet.PivotTables(tNam).PivotFields(«Плательщик»)
.Orientation = xlPageField
.Position = 1
End With
svT.PivotFields(«Плательщик»).CurrentPage = «(All)»
Определение полей сводной таблицы с Итоговыми данными (здесь суммами значений).
Итоговые данные (не обязательно суммирование) всегда представляют исключительный интерес… Правда?
Таких полей в сводной таблице может быть несколько, но в моем примере на «листе данных» больше нет числовых полей, поэтому и суммирование проводить больше, как по полю «Количество», не уместно…
svT.AddDataField svT.PivotFields(«Количество»), «Сумма по полю Количество», xlSum
И вот, результат.
Безошибочность работы макроса в разы превышает возможности человека…
Про скорость я уж вообще не говорю…, Ни каких сравнений…
Поэтому, изучать язык программирования VBA очень интересно и выгодно.
Долго…? Времени на изучение жалко…?
В принципе… это не обязательно… Как не обязательно знать электронную начинку телевизора, чтобы использовать этот телевизор по назначению…
Если Вы сотрудничаете с программистом, то Вам останется – указать минимум данных и запустить уже готовый макрос… Все.
Пробуйте…
VBA Projects
Programming and other
Умные схемы Excel
Если вы не любите читать статьи, а предпочитаете разбираться сами, то вот ссылки:
Последняя версия
Версия 3.0 от 18-06-2015:
Все версии с картой регионов РФ, для Excel 2007 и выше, с открытым программным кодом с комментариями.
В работе над отчетами и презентациями нередко возникает задача сделать привлекательную картинку, отражающую, например, итоги работы компании в различных регионах страны. Обычно делается это вручную, или в графических редакторах, или в офисных программах.
А если нужно сделать десятки похожих карт?
Можно воспользоваться специальными картографическими программными продуктами, например Microsoft MapPoint или MapInfo Professional , способными визуализировать данные на карте (и решить многие другие задачи).
Но мы поступим просто и удобно – встроим макрос, раскрашивающий карты или схемы в книгу Excel с нашими числами, и получим возможность двумя кликами мышки получать симпатичную картинку.
Базовая программа / макрос умеет делать вот что
- Выводить столбец с названиями фигур, полигонов (на примере каждый регион представлен одним или несколькими полигонами). Вы можете удалить с карты РФ не интересующие Вас области или создать свою карту. Очистите устаревшую таблицу «Данные», и макрос создаст актуальный список элементов.
- Автоматически разбивать набор числовых данных на указанное количество ступеней (линейно), присваивать соответствующие цвета каждой ступеньке, рисовать легенду для карты.
- Обновлять цвета карты в соответствии с выбранным набором значений. Макрос может оперировать набором значений от одного и более. Не забывайте указывать название набора данных в первой строке листа ДАННЫЕ, например, «Январь 11».
- Текущая версия может работать только в Excel 2007, т.к. использует новые свойства объекта Shape.
Порядок работы с картой
- Определитесь, каким образом вы будете работать с картами. Если Ваши результаты подвержены изменениям, удобнее скопировать листы СХЕМА и ДАННЫЕ в ваш проект Excel и связать формулами числовые значения для карты с листами проекта. Вы сможете быстро получить свежие иллюстрации, если в расчетах сделаны уточнения. Сохраняйте проект в книге с поддержкой макросов, чтобы сохранить возможность обновлять схемы автоматически.
- Или используйте книгу отдельно, как самостоятельный проект.
- Отредактируйте карту. Создавайте фигуры в Excel с говорящими названиями для удобства работы с таблицей. Этот макрос выводит в список только полигоны (autoshapetype = 138). По коду 138 найдите в макросе листа «Схема» строку, прерывающую функцию. Удалите строку или отредактируйте, если вам нужно раскрашивать фигуры, отличные от типа полигон (№138). Удобно, если дополнительные элементы оформления карты не будут загромождать список.
- Очистите устаревшие значения таблицы на листе Данные. Нажмите кнопку Обновить. Будет создан список названий фигур, которые вы собираетесь окрашивать в соответствии с числовыми данными.
- Перенесите значения, характеризующие, например, один временной период, в один столбец, начиная с четвертого, в соответствующие строки. Не забывайте про необходимость названия столбца данных в первой строке листа Данные.
- На листе СХЕМА выберите базовый цвет для палитры. Он будет примерно в середине расчетного градиента. В случае ошибки обработки Вашего выбора, автоматически устанавливается синий (тема №4).
- Укажите количество ступеней или цветовых оттенков. В данном макросе выбор ограничен – от 2 до 7. Использовать больше ступеней вы можете после изменения кода и м.б. дизайна листа.
- Выберите набор данных и кликните кнопку Обновить. Дождитесь завершения работы программы.
Про работу с макросами
В книге Excel 2007 с поддержкой макросов (.xlsm) может храниться и выполнятся программный код на языке VBA.
Чтобы не подвергаться лишнему риску открыть документ с опасными программами, в настройках Excel отключите макросы с уведомлением:
Получив уведомление, запустите макрос визуализации:
Навигация по записям
Умные схемы Excel : 12 комментариев
Случайно наткнулся на Ваш блог, а конкретно на программу Визуализация наборов числовых значений на карте или любом другом рисунке из фигур Excel Версия 1.0. В связи с чем у меня к Вам вопрос, а нет ли случайно у Вас более продвинутой версии данной программы, в которой ступени цвета распределяются не от 0 (нуля). Чтобы можно было самостоятельно задавать как например «параметры оси» при построении графика в Excel ну т.е. минимальное, максимальное значение и шаг. А также чтобы можно было бы делать распределение в процентах, сейчас конечно тоже это можно, но в легенде отображаются доли, а не проценты (т.е. легенда воспринимала бы формат числа.
Ну а если бы на карту можно было бы наносить кружочками города и размер кружка также бы изменялся в зависимости от показателя было бы вообще супер.
Новой версии пока нет.
Полезные интересные функции, спасибо. Попробую реализовать.
В новой версии 2.0 от 04.02.2014г. можно создавать легенду как автоматически, так и вручную, самостоятельно выбирая цвета и размеры каждого диапазона.
Приветствую. Отличный файл!
В версиях 2.0 и 2.1 не удается применить значения второго столбца столба с данными (в примере — 2014), всегда возвращает на первый столбец с данными (в примере — 2013). Что нужно поправить в макросе?
Владимир, спасибо.
Ошибка исправлена в последней версии. В процедуре Public Sub Init() добавлено сохранение названия выбранного набора данных (столбца).
Спасибо за исправление. Отличный файл!
добрый день
вы написали как удалить формы с карты и создать собственную карту и не сказали как добавить, например, хочу добавить Крым
Заранее спасибо
Добрый день!
Спасибо за проявленный интерес. Добавить очень просто. Действия, касающиеся работы макроса, на примере Крыма:
1. Копируете Крым с карты Украины на карту России.
2. Установите название объекта формы Крыма (левый верхний угол, там где адреса ячеек таблицы, после редактирования обязательно нажмите Enter).
3. Обновляете карту — кнопка «Обновить».
4. На листе «Данные» в конце списка должно появиться название нового региона — значит все ок.
5. Вводите числовые значения для визуализации и пользуетесь картой.
Оформление настраивайте на свой вкус.
А города как можно добавить?
Добрый день, возможна ли работа данной карты в Excel версии 2003?
Для Офиса 2003 установите бесплатный «Пакет совместимости форматов Office».
Ссылка: https://www.microsoft.com/ru-ru/softmicrosoft/compatibility.aspx
Добрый день, скажите, есть возможность добавить карту пермского края вместо карты России??
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
VBA Excel: примеры программ. Макросы в Excel
Немногие знают, что первая версия популярного продукта Microsoft Excel появилась в 1985 году. С тех пор он пережил несколько модификаций и востребован у миллионов пользователей по всему миру. При этом многие работают лишь с малой толикой возможностей этого табличного процессора и даже не догадываются, как им могло бы облегчить жизнь умение программирования в Excel.
Что такое VBA
Программирование в Excel осуществляется посредством языка программирования Visual Basic for Application, который изначально встроен в самый известный табличный процессор от Microsoft.
К его достоинствам специалисты относят сравнительную легкость освоения. Как показывает практика, азами VBA могут овладеть даже пользователи, которые не имеют навыков профессионального программирования. К особенностям VBA относится выполнение скрипта в среде офисных приложений.
Недостатком программы являются проблемы, связанные с совместимостью различных версий. Они обусловлены тем, что код программы VBA обращается к функциональным возможностям, которые присутствуют в новой версии продукта, но отсутствуют в старой. Также к минусам относят и чрезмерно высокую открытость кода для изменения посторонним лицом. Тем не менее Microsoft Office, а также IBM Lotus Symphony позволяют пользователю применять шифрование начального кода и установку пароля для его просмотра.
Объекты, коллекции, свойства и методы
Именно с этими понятиями нужно разобраться тем, кто собирается работать в среде VBA. Прежде всего необходимо понять, что такое объект. В Excel в этом качестве выступают лист, книга, ячейка и диапазон. Данные объекты обладают специальной иерархией, т.е. подчиняются друг другу.
Главным из них является Application, соответствующий самой программе Excel. Затем следуют Workbooks, Worksheets, а также Range. Например, для обращения к ячейке A1 на конкретном листе следует указать путь с учетом иерархии.
Что касается понятия «коллекция», то это группа объектов того же класса, которая в записи имеет вид ChartObjects. Ее отдельные элементы также являются объектами.
Следующее понятие — свойства. Они являются необходимой характеристикой любого объекта. Например, для Range — это Value или Formula.
Методы — это команды, показывающие, что требуется сделать. При написании кода в VBA их необходимо отделять от объекта точкой. Например, как будет показано в дальнейшем, очень часто при программировании в «Эксель» используют команду Cells(1,1).Select. Она означает, что необходимо выбрать ячейку с координатами (1,1) т.е. A1.
Вместе с ней нередко используется Selection.ClearContents. Ее выполнение означает очистку содержимого выбранной ячейки.
Как начать
Прежде всего требуется создать файл и сохранить его, присвоив имя и выбрав тип «Книга Excel с поддержкой макросов».
Затем необходимо перейти в приложение VB, для чего достаточно воспользоваться комбинацией клавиш «Alt» и «F11». Далее:
- в строке меню, расположенном в верхней части окна, нажимают на иконку рядом с иконкой Excel;
- выбирают команду Mudule;
- сохраняют, нажав на иконку с изображением floppy disk;
- пишут, скажем так, набросок кода.
Он выглядит следующим образом:
Обратите внимание, что строка «’Наш код» будет выделена другим цветом (зеленым). Причина в апострофе, поставленном в начале строки, который обозначает, что далее следует комментарий.
Теперь вы можете написать любой код и создать для себя новый инструмент в VBA Excel (примеры программ см. далее). Конечно, тем, кто знаком с азами Visual Basic, будет намного проще. Однако даже те, кто их не имеет, при желании смогут освоиться достаточно быстро.
Макросы в Excel
За таким названием скрываются программы, написанные на языке Visual Basic for Application. Таким образом, программирование в Excel — это создание макросов с нужным кодом. Благодаря этой возможности табличный процессор Microsoft саморазвивается, подстраиваясь под требования конкретного пользователя. Разобравшись с тем, как создавать модули для написания макросов, можно приступать к рассмотрению конкретных примеров программ VBA Excel. Лучше всего начать с самых элементарных кодов.
Пример 1
Задача: написать программу, которая будет копировать значение содержимое одной ячейки и затем записывать в другую.
- открывают вкладку «Вид»;
- переходят на пиктограмму «Макросы»;
- жмут на «Запись макроса»;
- заполняют открывшуюся форму.
Для простоты в поле «Имя макроса» оставляют «Макрос1», а в поле «Сочетание клавиш» вставляют, например, hh (это значит, что запустить программку можно будет блиц-командой «Ctrl+h»). Нажимают Enter.
Теперь, когда уже запущена запись макроса, производят копирование содержимого какой-либо ячейки в другую. Возвращаются на исходную пиктограмму. Нажимают на «Запись макроса». Это действие означает завершение программки.
- вновь переходят на строку «Макросы»;
- в списке выбирают «Макрос 1»;
- нажимают «Выполнить» (то же действие запускается начатием сочетания клавиш «Ctrl+hh»).
В результате происходит действие, которое было осуществлено в процессе записи макроса.
Имеет смысл увидеть, как выглядит код. Для этого вновь переходят на строку «Макросы» и нажимают «Изменить» или «Войти». В результате оказываются в среде VBA. Собственно, сам код макроса находится между строками Sub Макрос1() и End Sub.
Если копирование было выполнено, например, из ячейки А1 в ячейку C1, то одна из строк кода будет выглядеть, как Range(“C1”).Select. В переводе это выглядит, как «Диапазон(“C1”).Выделить», иными словами осуществляет переход в VBA Excel, в ячейку С1.
Активную часть кода завершает команда ActiveSheet.Paste. Она означает запись содержания выделенной ячейки (в данном случае А1) в выделенную ячейку С1.
Пример 2
Циклы VBA помогают создавать различные макросы в Excel.
Циклы VBA помогают создавать различные макросы. Предположим, что имеется функция y=x + x 2 + 3x 3 – cos(x). Требуется создать макрос для получения ее графика. Сделать это можно только, используя циклы VBA.
За начальное и конечное значение аргумента функции берут x1=0 и x2=10. Кроме того, необходимо ввести константу — значение для шага изменения аргумента и начальное значение для счетчика.
Все примеры макросов VBA Excel создаются по той же процедуре, которая представлена выше. В данном конкретном случае код выглядит, как:
Do While x1 0 Then Cells(1, 1).Value = 1
Источник
Содержание
- Таблицы и объекты VBA
В этом руководстве будет показано, как работать с таблицами и объектами ListObject в VBA.
Таблицы — одна из самых полезных и мощных функций Excel. В этом руководстве мы рассмотрим, как использовать VBA для создания таблицы, добавления простой сортировки в таблицу, фильтрации таблицы и выполнения других задач, связанных с таблицами.
Создать таблицу с VBA
Метод ListObjects.Add может добавлять таблицу на лист на основе диапазона на этом листе. У нас есть диапазон, показанный в ($ A $ 1: $ B $ на листе под названием Sheet1.
Следующий код добавит на ваш рабочий лист таблицу с именем Table1 в зависимости от диапазона ($ A $ 1: $ B $ с использованием стиля таблицы по умолчанию:
123456 | Подложка CreateTableInExcel ()ActiveWorkbook.Sheets («Sheet1»). ListObjects.Add (xlSrcRange, Range («$ A $ 1: $ B $ 8»),, xlYes) .Name = _»Таблица 1″Конец подписки |
Результат:
Вставка столбца в конец таблицы с помощью VBA
Вы можете использовать метод ListColumns.Add, чтобы добавить столбец в конец вашей таблицы. У нас есть таблица под названием Table1, показанная ниже.
Вы можете добавить столбец в свою таблицу, используя следующий код, который всегда будет добавлять столбец в конец таблицы:
12345 | Sub AddColumnToTheEndOfTheTable ()ActiveWorkbook.Sheets («Sheet1»). ListObjects («Table1»). ListColumns.AddКонец подписки |
Результат:
Вставка строки внизу таблицы с помощью VBA
Вы можете использовать метод ListRows.Add, чтобы добавить строку в конец таблицы. У нас есть таблица под названием Table1, показанная ниже.
Следующий код всегда будет добавлять строку в конец таблицы.
12345 | Подложка AddRowToTheBottomOfTheTable ()ActiveSheet.ListObjects («Таблица1»). ListRows.AddКонец подписки |
Результат:
Добавление простой сортировки с помощью VBA
Вы можете отсортировать таблицу с помощью VBA. У нас есть таблица с именем Table1, показанная ниже, и мы можем использовать VBA для сортировки столбца продаж от самого низкого до самого высокого.
Следующий код отсортирует столбец «Продажи» в порядке возрастания.
12345678910111213141516171819 | Sub SimpleSortOnTheTable ()Диапазон («Таблица1 [[# заголовков], [Продажи]]»). ВыберитеActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). Sort.SortFields.ClearActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). Sort.SortFields.Add _Ключ: = Диапазон («Таблица1 [[# Все], [Продажи]]»), SortOn: = xlSortOnValues, Order: = _xlAscending, DataOption: = xlSortNormalС ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). Sort.Header = xlYes.MatchCase = Ложь.Orientation = xlTopToBottom.SortMethod = xlPinYin.Подать заявлениеКонец сКонец подписки |
Результат:
Фильтрация таблицы с помощью VBA
Вы также можете фильтровать таблицу Excel с помощью VBA. У нас есть таблица с именем Table1, и мы хотели бы отфильтровать ее, чтобы отображались только продажи, превышающие 1500.
Мы можем использовать метод автофильтра, который имеет пять необязательных параметров. Поскольку мы хотим отфильтровать столбец «Продажи», который является вторым столбцом, мы устанавливаем для поля значение 2 и используем параметр оператора xlAnd, который используется для дат и чисел.
123456 | Подложка SimpleFilter ()ActiveWorkbook.Sheets («Sheet1»). ListObjects («Table1″). Range.AutoFilter Field: = 2, Criteria1: = _»> 1500″, оператор: = xlAndКонец подписки |
Результат:
Очистите фильтр с помощью метода ShowAllData в VBA
Вы можете получить доступ к методу ShowAllData класса Worksheet, чтобы очистить фильтр. Если вы хотите очистить фильтр (-ы) таблицы, вам сначала нужно выбрать ячейку в таблице, что вы можете сделать в VBA.
Метод ShowAllData сгенерирует ошибку, если не использовать условную логику, чтобы проверить, был ли применен фильтр на листе. В следующем коде показано, как это сделать:
123456789 | Sub ClearingTheFilter ()Диапазон («Таблица1 [[# заголовков], [Продажи]]»). ВыберитеЕсли ActiveWorkbook.Worksheets («Sheet1»). FilterMode = True, тоActiveSheet.ShowAllDataКонец, еслиКонец подписки |
Очистить все фильтры из таблицы Excel
Вы можете получить доступ к методу ShowAllData класса ListObject, не выбирая сначала ячейку в таблице. В следующем коде показано, как это сделать:
123 | Подложка ClearAllTableFilters ()ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). AutoFilter.ShowAllDataКонец подписки |
Удаление строки с помощью VBA
Вы можете удалить строку в базе данных вашей таблицы с помощью метода ListRows.Delete. Вы должны указать, какая строка используется по номеру строки. У нас есть следующая таблица под названием Table1.
Допустим, вы хотите удалить вторую строку в базе данных вашей таблицы, следующий код позволит вам это сделать:
12345 | Sub DeleteARow ()ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). ListRows (2) .DeleteКонец подписки |
Результат:
Удаление столбца с помощью VBA
Вы можете удалить столбец из таблицы с помощью метода ListColumns.Delete. У нас есть следующая таблица под названием Table1, показанная ниже:
Чтобы удалить первый столбец, вы должны использовать следующий код:
12345 | Подраздел DeleteAColumn ()ActiveWorkbook.Worksheets («Sheet1»). ListObjects («Table1»). ListColumns (1) .DeleteКонец подписки |
Результат:
Преобразование таблицы обратно в диапазон в VBA
Вы можете преобразовать таблицу обратно в нормальный диапазон с помощью VBA. В следующем коде показано, как преобразовать таблицу с именем Table1 обратно в диапазон:
12345 | Sub ConvertingATableBackToANormalRange ()ActiveWorkbook.Sheets («Sheet1»). ListObjects («Table1»). UnlistКонец подписки |
Добавление чередующихся столбцов и форматирование ко всем таблицам на листе с помощью VBA
Вы можете получить доступ ко всем таблицам на вашем листе с помощью коллекции ListObjects. На приведенном ниже листе у нас есть две таблицы, и мы хотели бы добавить столбец с чередованием к обеим таблицам сразу и изменить шрифт раздела данных обеих таблиц на полужирный, используя VBA.
12345678910111213 | Sub AddingBandedColumns ()Dim tbl As ListObjectТусклый лист как рабочий листУстановить sht = ThisWorkbook.ActiveSheetДля каждой табл. В шт.ListObjectstbl.ShowTableStyleColumnStripes = Истинаtbl.DataBodyRange.Font.Bold = ИстинаСледующая таблицаКонец подписки |
Результат:
Создание таблицы в Access в VBA с использованием DoCmd.RunSQL
Одним из основных способов создания таблицы в Access в VBA является использование метода DoCmd.RunSQL для выполнения запроса действия с оператором SQL.
У нас есть кнопка в нашем образце формы, и когда мы нажимаем на кнопку, мы хотим создать таблицу с именем ProductsTable с двумя полями или столбцами, одно будет полем первичного ключа с именем ProductsID, а другое будет полем с именем Sales.
Чтобы создать эту таблицу, мы будем использовать следующий код:
123456 | Частная подпрограмма cmdCreateProductsTable_Click ()DoCmd.RunSQL «СОЗДАТЬ ТАБЛИЦУ ProductsTable» _& «(ProductID INTEGER PRIMARY KEY, целое число продаж);»Конец подписки |
Результат:
Фильтрация таблицы в доступе с помощью VBA
Вы также можете фильтровать таблицу в Access с помощью метода DoCmd.ApplyFilter. У нас есть наша простая таблица, показанная ниже в Access, которая называется ProductsTable.
Мы хотели бы нажать эту кнопку в нашей форме, и тогда мы увидим только продажи, превышающие 1500.
Итак, мы бы использовали следующий код для этого:
1234567 | Частная подпрограмма cmdFilter_Click ()DoCmd.OpenTable «ProductsTable»DoCmd.ApplyFilter, «[Продажи]> 1500»Конец подписки |
Результат: