Макрос для динамического диапазона в excel

Содержание

  • Ссылка на диапазоны и ячейки
  • Динамические диапазоны с переменными
  • SpecialCells — LastCell
  • UsedRange
  • CurrentRegion
  • Именованный диапазон
  • Таблицы

В этой статье будет продемонстрировано, как создать динамический диапазон в Excel VBA.

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

Ссылка на диапазоны и ячейки

Когда мы ссылаемся на объект Range или Cell в Excel, мы обычно обращаемся к ним путем жесткого кодирования в строке и столбцах, которые нам требуются.

Свойство диапазона

Используя свойство Range в приведенных ниже примерах строк кода, мы можем выполнять действия с этим диапазоном, такие как изменение цвета ячеек или выделение ячеек полужирным шрифтом.

12 Диапазон («A1: A5»). Font.Color = vbRedДиапазон («A1: A5»). Полужирный шрифт = True

Ячейки собственности

Точно так же мы можем использовать свойство Cells для ссылки на диапазон ячеек, напрямую ссылаясь на строку и столбец в свойстве Cells. Строка всегда должна быть числом, но столбец может быть числом или буквой, заключенной в кавычки.

Например, на адрес ячейки A1 можно ссылаться как на:

Или

Чтобы использовать свойство Cells для ссылки на диапазон ячеек, нам нужно указать начало диапазона и конец диапазона.

Например, для ссылки на диапазон A1: A6 мы могли бы использовать следующий синтаксис:

1 Диапазон (Ячейки (1,1), Ячейки (1,6)

Затем мы можем использовать свойство Cells для выполнения действий с диапазоном в соответствии с приведенными ниже примерами кода:

12 Диапазон (Ячейки (2, 2), Ячейки (6, 2)). Font.Color = vbRedДиапазон (Ячейки (2, 2), Ячейки (6, 2)). Жирный шрифт = Истина

Динамические диапазоны с переменными

Поскольку размер наших данных в Excel изменяется (т.е. мы используем больше строк и столбцов, чем диапазоны, которые мы закодировали), было бы полезно, если бы диапазоны, на которые мы ссылаемся в нашем коде, также изменились. Используя объект Range выше, мы можем создавать переменные для хранения максимальных номеров строк и столбцов в области рабочего листа Excel, которую мы используем, и использовать эти переменные для динамической настройки объекта Range во время выполнения кода.

Например

1234 Dim lRow как целое числоDim lCol как целое числоlRow = Диапазон («A1048576»). Конец (xlUp) .RowlCol = Range («XFD1»). End (xlToLeft) .Column

Последняя строка в столбце

Поскольку на листе 1048576 строк, переменная lRow переместится в нижнюю часть листа, а затем с помощью специальной комбинации клавиши End и клавиши со стрелкой вверх перейдите к последней строке, используемой на листе — это даст нам номер нужной нам строки в нашем диапазоне.

Последний столбец в строке

Аналогичным образом lCol переместится в столбец XFD, который является последним столбцом на листе, а затем с помощью специальной комбинации клавиш, состоящей из клавиши End и клавиши со стрелкой влево, перейдет к последнему столбцу, используемому на листе — это даст нам номер нужного нам столбца в нашем диапазоне.

Следовательно, чтобы получить весь диапазон, который используется на листе, мы можем запустить следующий код:

1234567891011 Sub GetRange ()Dim lRow As IntegerDim lCol как целое числоDim rng As RangelRow = Диапазон («A1048576»). Конец (xlUp) .Row’используйте lRow, чтобы найти последний столбец в диапазонеlCol = Range («XFD» & lRow) .End (xlToLeft) .ColumnУстановить rng = Range (Cells (1, 1), Cells (lRow, lCol))’msgbox, чтобы показать нам диапазонMsgBox «Range is» & rng.AddressКонец подписки

SpecialCells — LastCell

Мы также можем использовать метод SpecialCells объекта Range, чтобы получить последнюю строку и столбец, используемые в рабочем листе.

123456789101112 Sub UseSpecialCells ()Dim lRow As IntegerDim lCol как целое числоDim rng As RangeDim rngBegin As RangeУстановить rngBegin = Range («A1»)lRow = rngBegin.SpecialCells (xlCellTypeLastCell) .RowlCol = rngBegin.SpecialCells (xlCellTypeLastCell) .ColumnУстановить rng = Range (Cells (1, 1), Cells (lRow, lCol))’msgbox, чтобы показать нам диапазонMsgBox «Range is» & rng.AddressКонец подписки

UsedRange

Метод используемого диапазона включает все ячейки, в которых есть значения на текущем листе.

123456 Sub UsedRangeExample ()Dim rng As RangeУстановить rng = ActiveSheet.UsedRange’msgbox, чтобы показать нам диапазонMsgBox «Range is» & rng.AddressКонец подписки

CurrentRegion

Текущая область отличается от UsedRange тем, что она просматривает ячейки, окружающие ячейку, которую мы объявили как начальный диапазон (т.е. переменную rngBegin в приведенном ниже примере), а затем просматривает все ячейки, которые « прикреплены » или связаны в объявленную ячейку. Если в строке или столбце появится пустая ячейка, CurrentRegion перестанет искать другие ячейки.

12345678 К югу от CurrentRegion ()Dim rng As RangeDim rngBegin As RangeУстановить rngBegin = Range («A1»)Установите rng = rngBegin.CurrentRegion’msgbox, чтобы показать нам диапазонMsgBox «Range is» & rng.AddressКонец подписки

Если мы используем этот метод, нам нужно убедиться, что все ячейки в требуемом диапазоне связаны между собой, и среди них нет пустых строк или столбцов.

Именованный диапазон

Мы также можем ссылаться на именованные диапазоны в нашем коде. Именованные диапазоны могут быть динамическими, поскольку при обновлении или вставке данных имя диапазона может измениться, чтобы включить новые данные.

В этом примере шрифт для названия диапазона «Январь» будет изменен на полужирный.

12345 Sub RangeNameExample ()Dim rng as RangeSet rng = Range («Январь»)rng.Font.Bold = = ВерноКонец подписки

Как вы увидите на рисунке ниже, если строка добавляется в имя диапазона, имя диапазона автоматически обновляется, чтобы включить эту строку.

Если мы затем снова запустим пример кода, диапазон, на который воздействует код, будет C5: C9, тогда как в первом случае это будет C5: C8.

Таблицы

Мы можем ссылаться на таблицы (щелкните для получения дополнительной информации о создании и управлении таблицами в VBA) в нашем коде. Когда данные таблицы в Excel обновляются или изменяются, код, который ссылается на таблицу, будет ссылаться на обновленные данные таблицы. Это особенно полезно при обращении к сводным таблицам, подключенным к внешнему источнику данных.

Используя эту таблицу в нашем коде, мы можем ссылаться на столбцы таблицы по заголовкам в каждом столбце и выполнять действия с столбцом в соответствии с их именем. По мере того, как строки в таблице увеличиваются или уменьшаются в соответствии с данными, диапазон таблицы будет соответствующим образом корректироваться, и наш код будет по-прежнему работать для всего столбца в таблице.

Например:

123 Подраздел DeleteTableColumn ()ActiveWorkbook.Worksheets («Лист1»). ListObjects («Таблица1»). ListColumns («Поставщик»). УдалитьКонец подписки

In this Article

  • Referencing Ranges and Cells
    • Range Property
    • Cells Property
  • Dynamic Ranges with Variables
    • Last Row in Column
    • Last Column in Row
  • SpecialCells – LastCell
  • UsedRange
  • CurrentRegion
  • Named Range
  • Tables

This article will demonstrate how to create a Dynamic Range in Excel VBA.

Declaring a specific range of cells as a variable in Excel VBA limits us to working only with those particular cells. By declaring Dynamic Ranges in Excel, we gain far more flexibility over our code and the functionality that it can perform.

Referencing Ranges and Cells

When we reference the Range or Cell object in Excel, we normally refer to them by hardcoding in the row and columns that we require.

Range Property

Using the Range Property, in the example lines of code below, we can perform actions on this range such as changing the color of the cells, or making the cells bold.

Range("A1:A5").Font.Color = vbRed
Range("A1:A5").Font.Bold = True

Cells Property

Similarly, we can use the Cells Property to refer to a range of cells by directly referencing the row and column in the cells property. The row has to always be a number but the column can be a number or can a letter enclosed in quotation marks.

For example, the cell address A1 can be referenced as:

Cells(1,1)

Or

Cells(1, "A")

To use the Cells Property to reference a range of cells, we need to indicate the start of the range and the end of the range.

For example to reference range A1: A6 we could use this syntax below:

Range(Cells(1,1), Cells(1,6)

We can then use the Cells property to perform actions on the range as per the example lines of code below:

Range(Cells(2, 2), Cells(6, 2)).Font.Color = vbRed
Range(Cells(2, 2), Cells(6, 2)).Font.Bold = True

Dynamic Ranges with Variables

As the size of our data changes in Excel (i.e. we use more rows and columns that the ranges that we have coded), it would be useful if the ranges that we refer to in our code were also to change.  Using the Range object above we can create variables to store the maximum row and column numbers of the area of the Excel worksheet that we are using, and use these variables to dynamically adjust the Range object while the code is running.

For example

Dim lRow as integer
Dim lCol as integer
lRow  = Range("A1048576").End(xlUp).Row
lCol  = Range("XFD1").End(xlToLeft).Column

Last Row in Column

As there are 1048576 rows in a worksheet,  the variable lRow will go to the bottom of the sheet and then use the special combination of the End key plus the Up Arrow key to go to the last row used in the worksheet – this will give us the number of the row that we need in our range.

Last Column in Row

Similarly, the lCol will move to Column XFD which is the last column in a worksheet, and then use the special key combination of the End key plus the Left Arrow key to go to the last column used in the worksheet – this will give us the number of the column that we need in our range.

Therefore, to get the entire range that is used in the worksheet, we can run the following code:

Sub GetRange()
  Dim lRow As Integer
  Dim lCol As Integer
  Dim rng As Range
  lRow = Range("A1048576").End(xlUp).Row
'use the lRow to help find the last column in the range
  lCol = Range("XFD" & lRow).End(xlToLeft).Column
  Set rng = Range(Cells(1, 1), Cells(lRow, lCol))
'msgbox to show us the range
  MsgBox "Range is " & rng.Address
End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

SpecialCells – LastCell

We can also use SpecialCells method of the Range Object to get the last row and column used in a Worksheet.

Sub UseSpecialCells()
  Dim lRow As Integer
  Dim lCol As Integer
  Dim rng As Range
  Dim rngBegin As Range
  Set rngBegin = Range("A1")
  lRow = rngBegin.SpecialCells(xlCellTypeLastCell).Row
  lCol = rngBegin.SpecialCells(xlCellTypeLastCell).Column
  Set rng = Range(Cells(1, 1), Cells(lRow, lCol))
'msgbox to show us the range
  MsgBox "Range is " & rng.Address
End Sub

UsedRange

The Used Range Method includes all the cells that have values in them in the current worksheet.

Sub UsedRangeExample()
  Dim rng As Range
  Set rng = ActiveSheet.UsedRange
'msgbox to show us the range
  MsgBox "Range is " & rng.Address
End Sub

CurrentRegion

The current region differs from the UsedRange in that it looks at the cells surrounding a cell that we have declared as a starting range (ie the variable rngBegin in the example below), and then looks at all the cells that are ‘attached’ or associated to that declared cell.   Should a blank cell in a row or column occur, then the CurrentRegion will stop looking for any further cells.

Sub CurrentRegion()
  Dim rng As Range
  Dim rngBegin As Range
  Set rngBegin = Range("A1")
  Set rng = rngBegin.CurrentRegion
'msgbox to show us the range
  MsgBox "Range is " & rng.Address
End Sub

If we use this method, we need to make sure that all the cells in the range that you require are connected with no blank rows or columns amongst them.

VBA Programming | Code Generator does work for you!

Named Range

We can also reference Named Ranges in our code. Named Ranges can be dynamic in so far as when data is updated or inserted, the Range Name can change to include the new data.

This example will change the font to bold for the range name “January”

Sub RangeNameExample()
  Dim rng as Range 
  Set rng = Range("January")
  rng.Font.Bold = = True 
End Sub

As you will see in the picture below, if a row is added into the range name, then the range name automatically updates to include that row.

VBA DynamicRange Range

Should we then run the example code again, the range affected by the code would be C5:C9 whereas in the first instance it would have been C5:C8.

Tables

We can reference tables (click for more information about creating and manipulating tables in VBA) in our code. As a table data in Excel is updated or changed, the code that refers to the table will then refer to the updated table data.  This is particularly useful when referring to Pivot tables that are connected to an external data source.

VBA DynamicRange Table

Using this table in our code, we can refer to the columns of the table by the headings in each column, and perform actions on the column according to their name.  As the rows in the table increase or decrease according to the data, the table range will adjust accordingly and our code will still work for the entire column in the table.

For example:

Sub DeleteTableColumn()
  ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").ListColumns("Supplier").Delete
End Sub

Динамический диапазон с автоподстройкой размеров

Есть ли у вас таблицы с данными в Excel, размеры которых могут изменяться, т.е. количество строк (столбцов) может увеличиваться или уменьшаться в процессе работы? Если размеры таблицы «плавают», то придется постоянно мониторить этот момент и подправлять:

  • ссылки в формулах отчетов, которые ссылаются на нашу таблицу
  • исходные диапазоны сводных таблиц, которые построены по нашей таблице
  • исходные диапазоны диаграмм, построенных по нашей таблице
  • диапазоны для выпадающих списков, которые используют нашу таблицу в качестве источника данных

Все это в сумме не даст вам скучать ;)

Гораздо удобнее и правильнее будет создать динамический «резиновый» диапазон, который автоматически будет подстраиваться в размерах под реальное количество строк-столбцов данных. Чтобы реализовать такое, есть несколько способов.

Способ 1. Умная таблица

Выделите ваш диапазон ячеек и выберите на вкладке Главная – Форматировать как Таблицу (Home – Format as Table):

dynamic_range1.png

Если вам не нужен полосатый дизайн, который добавляется к таблице побочным эффектом, то его можно отключить на появившейся вкладке Конструктор (Design). Каждая созданная таким образом таблица получает имя, которое можно заменить на более удобное там же на вкладке Конструктор (Design) в поле Имя таблицы (Table Name).

dynamic_range3.png

Теперь можно использовать динамические ссылки на нашу «умную таблицу»:

  • Таблица1 – ссылка на всю таблицу кроме строки заголовка (A2:D5)
  • Таблица1[#Все] – ссылка на всю таблицу целиком (A1:D5)
  • Таблица1[Питер] – ссылка на диапазон-столбец без первой ячейки-заголовка (C2:C5)
  • Таблица1[#Заголовки] – ссылка на «шапку» с названиями столбцов (A1:D1)

Такие ссылки замечательно работают в формулах, например:

=СУММ(Таблица1[Москва]) – вычисление суммы по столбцу «Москва»

или

=ВПР(F5;Таблица1;3;0) – поиск в таблице месяца из ячейки F5 и выдача питерской суммы по нему (что такое ВПР?)

Такие ссылки можно успешно использовать при создании сводных таблиц, выбрав на вкладке Вставка – Сводная таблица (Insert – Pivot Table) и введя имя умной таблицы в качестве источника данных:

dynamic_range4.png

Если выделить фрагмент такой таблицы (например, первых два столбца) и создать диаграмму любого типа, то при дописывании новых строк они автоматически будут добавляться к диаграмме.

При создании выпадающих списков прямые ссылки на элементы умной таблицы использовать нельзя, но можно легко обойти это ограничение с помощью тактической хитрости – использовать функцию ДВССЫЛ (INDIRECT), которая превращает текст в ссылку:

dynamic_range5.png

Т.е. ссылка на умную таблицу в виде текстовой строки (в кавычках!) превращается в полноценную ссылку, а уж ее выпадающий список нормально воспринимает.

Способ 2. Динамический именованный диапазон

Если превращение ваших данных в умную таблицу по каким-либо причинам нежелательно, то можно воспользоваться чуть более сложным, но гораздо более незаметным и универсальным методом – создать в Excel динамический именованный диапазон, ссылающийся на нашу таблицу. Потом, как и в случае с умной таблицей, можно будет свободно использовать имя созданного диапазона в любых формулах, отчетах, диаграммах и т.д. Для начала рассмотрим простой пример:

dynamic_range6.png

Задача: сделать динамический именованный диапазон, который ссылался бы на список городов и автоматически растягивался-сжимался в размерах при дописывании новых городов либо их удалении.

Нам потребуются две встроенных функции Excel, имеющиеся в любой версии – ПОИКСПОЗ (MATCH) для определения последней ячейки диапазона и ИНДЕКС (INDEX) для создания динамической ссылки.

Ищем последнюю ячейку с помощью ПОИСКПОЗ

ПОИСКПОЗ(искомое_значение;диапазон;тип_сопоставления) – функция, которая ищет заданное значение в диапазоне (строке или столбце) и выдает порядковый номер ячейки, где оно было найдено. Например, формула ПОИСКПОЗ(“март”;A1:A5;0) выдаст в качестве результата число 4, т.к. слово «март» расположено в четвертой по счету ячейке в столбце A1:A5. Последний аргумент функции Тип_сопоставления = 0 означает, что мы ведем поиск точного соответствия. Если этот аргумент не указать, то функция переключится в режим поиска ближайшего наименьшего значения – это как раз и можно успешно использовать для нахождения последней занятой ячейки в нашем массиве.

Суть трюка проста. ПОИСКПОЗ перебирает в поиске ячейки в диапазоне сверху-вниз и, по идее, должна остановиться, когда найдет ближайшее наименьшее значение к заданному. Если указать в качестве искомого значение заведомо больше, чем любое имеющееся в таблице, то ПОИСКПОЗ дойдет до самого конца таблицы, ничего не найдет и выдаст порядковый номер последней заполненной ячейки. А нам это и нужно!

Если в нашем массиве только числа, то можно в качестве искомого значения указать число, которое заведомо больше любого из имеющихся в таблице:

dynamic_range7.png

Для гарантии можно использовать число 9E+307 (9 умножить на 10 в 307 степени, т.е. 9 с 307 нулями) – максимальное число, с которым в принципе может работать Excel.

Если же в нашем столбце текстовые значения, то в качестве эквивалента максимально большого числа можно вставить конструкцию ПОВТОР(“я”;255) – текстовую строку, состоящую из 255 букв «я» — последней буквы алфавита. Поскольку при поиске Excel, фактически, сравнивает коды символов, то любой текст в нашей таблице будет технически «меньше» такой длинной «яяяяя….я» строки:

dynamic_range8.png

Формируем ссылку с помощью ИНДЕКС

Теперь, когда мы знаем позицию последнего непустого элемента в таблице, осталось сформировать ссылку на весь наш диапазон. Для этого используем функцию:

ИНДЕКС(диапазон; номер_строки; номер_столбца)

Она выдает содержимое ячейки из диапазона по номеру строки и столбца, т.е. например функция =ИНДЕКС(A1:D5;3;4) по нашей таблице с городами и месяцами из предыдущего способа выдаст 1240 – содержимое из 3-й строки и 4-го столбца, т.е. ячейки D3. Если столбец всего один, то его номер можно не указывать, т.е. формула ИНДЕКС(A2:A6;3) выдаст «Самару» на последнем скриншоте.

Причем есть один не совсем очевидный нюанс: если ИНДЕКС не просто введена в ячейку после знака =, как обычно, а используется как финальная часть ссылки на диапазон после двоеточия, то выдает она уже не содержимое ячейки, а ее адрес! Таким образом формула вида $A$2:ИНДЕКС($A$2:$A$100;3) даст на выходе уже ссылку на диапазон A2:A4.

И вот тут в дело вступает функция ПОИСКПОЗ, которую мы вставляем внутрь ИНДЕКС, чтобы динамически определить конец списка:

=$A$2:ИНДЕКС($A$2:$A$100; ПОИСКПОЗ(ПОВТОР(«я»;255);A2:A100))

Создаем именованный диапазон

Осталось упаковать все это в единое целое. Откройте вкладку Формулы (Formulas) и нажмите кнопку Диспетчер Имен (Name Manager). В открывшемся окне нажмите кнопку Создать (New), введите имя нашего диапазона и формулу в поле Диапазон (Reference):

Динамический именованный диапазон

Осталось нажать на ОК и готовый диапазон можно использовать в любых формулах, выпадающих списках или диаграммах.

Ссылки по теме

  • Использование функции ВПР (VLOOKUP) для связывания таблиц и подстановки значений
  • Как создать автоматически наполняющийся выпадающий список
  • Как создать сводную таблицу для анализа большого массива данных

Присвоение диапазона ячеек объектной переменной в VBA Excel. Адресация ячеек в переменной диапазона и работа с ними. Определение размера диапазона. Примеры.

Присвоение диапазона ячеек переменной

Чтобы переменной присвоить диапазон ячеек, она должна быть объявлена как Variant, Object или Range:

Dim myRange1 As Variant

Dim myRange2 As Object

Dim myRange3 As Range

Чтобы было понятнее, для чего переменная создана, объявляйте ее как Range.

Присваивается переменной диапазон ячеек с помощью оператора Set:

Set myRange1 = Range(«B5:E16»)

Set myRange2 = Range(Cells(3, 4), Cells(26, 18))

Set myRange3 = Selection

В выражении Range(Cells(3, 4), Cells(26, 18)) вместо чисел можно использовать переменные.

Для присвоения диапазона ячеек переменной можно использовать встроенное диалоговое окно Application.InputBox, которое позволяет выбрать диапазон на рабочем листе для дальнейшей работы с ним.

Адресация ячеек в диапазоне

К ячейкам присвоенного диапазона можно обращаться по их индексам, а также по индексам строк и столбцов, на пересечении которых они находятся.

Индексация ячеек в присвоенном диапазоне осуществляется слева направо и сверху вниз, например, для диапазона размерностью 5х5:

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

Индексация строк и столбцов начинается с левой верхней ячейки. В диапазоне этого примера содержится 5 строк и 5 столбцов. На пересечении 2 строки и 4 столбца находится ячейка с индексом 9. Обратиться к ней можно так:

‘обращение по индексам строки и столбца

myRange.Cells(2, 4)

‘обращение по индексу ячейки

myRange.Cells(9)

Обращаться в переменной диапазона можно не только к отдельным ячейкам, но и к части диапазона (поддиапазону), присвоенного переменной, например,

обращение к первой строке присвоенного диапазона размерностью 5х5:

myRange.Range(«A1:E1»)

‘или

myRange.Range(Cells(1, 1), Cells(1, 5))

и обращение к первому столбцу присвоенного диапазона размерностью 5х5:

myRange.Range(«A1:A5»)

‘или

myRange.Range(Cells(1, 1), Cells(5, 1))

Работа с диапазоном в переменной

Работать с диапазоном в переменной можно точно также, как и с диапазоном на рабочем листе. Все свойства и методы объекта Range действительны и для диапазона, присвоенного переменной. При обращении к ячейке без указания свойства по умолчанию возвращается ее значение. Строки

MsgBox myRange.Cells(6)

MsgBox myRange.Cells(6).Value

равнозначны. В обоих случаях информационное сообщение MsgBox выведет значение ячейки с индексом 6.

Важно: если вы планируете работать только со значениями, используйте переменные массивов, код в них работает значительно быстрее.

Преимущество работы с диапазоном ячеек в объектной переменной заключается в том, что все изменения, внесенные в переменной, применяются к диапазону (который присвоен переменной) на рабочем листе.

Пример 1 — работа со значениями

Скопируйте процедуру в программный модуль и запустите ее выполнение.

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

Sub Test1()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Range(«C6:E8»)

‘Заполняем первую строку

‘Присваиваем значение первой ячейке

myRange.Cells(1, 1) = 5

‘Присваиваем значение второй ячейке

myRange.Cells(1, 2) = 10

‘Присваиваем третьей ячейке

‘значение выражения

myRange.Cells(1, 3) = myRange.Cells(1, 1) _

* myRange.Cells(1, 2)

‘Заполняем вторую строку

myRange.Cells(2, 1) = 20

myRange.Cells(2, 2) = 25

myRange.Cells(2, 3) = myRange.Cells(2, 1) _

+ myRange.Cells(2, 2)

‘Заполняем третью строку

myRange.Cells(3, 1) = «VBA»

myRange.Cells(3, 2) = «Excel»

myRange.Cells(3, 3) = myRange.Cells(3, 1) _

& » « & myRange.Cells(3, 2)

End Sub

Обратите внимание, что ячейки диапазона на рабочем листе заполнились так же, как и ячейки в переменной диапазона, что доказывает их непосредственную связь между собой.

Пример 2 — работа с форматами

Продолжаем работу с тем же диапазоном рабочего листа «C6:E8»:

Sub Test2()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Range(«C6:E8»)

‘Первую строку выделяем жирным шрифтом

myRange.Range(«A1:C1»).Font.Bold = True

‘Вторую строку выделяем фоном

myRange.Range(«A2:C2»).Interior.Color = vbGreen

‘Третьей строке добавляем границы

myRange.Range(«A3:C3»).Borders.LineStyle = True

End Sub

Опять же, обратите внимание, что все изменения форматов в присвоенном диапазоне отобразились на рабочем листе, несмотря на то, что мы непосредственно с ячейками рабочего листа не работали.

Пример 3 — копирование и вставка диапазона из переменной

Значения ячеек диапазона, присвоенного переменной, передаются в другой диапазон рабочего листа с помощью оператора присваивания.

Скопировать и вставить диапазон полностью со значениями и форматами можно при помощи метода Copy, указав место вставки (ячейку) на рабочем листе.

В примере используется тот же диапазон, что и в первых двух, так как он уже заполнен значениями и форматами.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Sub Test3()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Range(«C6:E8»)

‘Присваиваем ячейкам рабочего листа

‘значения ячеек переменной диапазона

Range(«A1:C3») = myRange.Value

MsgBox «Пауза»

‘Копирование диапазона переменной

‘и вставка его на рабочий лист

‘с указанием начальной ячейки

myRange.Copy Range(«E1»)

MsgBox «Пауза»

‘Копируем и вставляем часть

‘диапазона из переменной

myRange.Range(«A2:C2»).Copy Range(«E11»)

End Sub

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

Размер диапазона в переменной

При получении диапазона с помощью метода Application.InputBox и присвоении его переменной диапазона, бывает полезно узнать его размерность. Это можно сделать следующим образом:

Sub Test4()

‘Объявляем переменную

Dim myRange As Range

‘Присваиваем диапазон ячеек

Set myRange = Application.InputBox(«Выберите диапазон ячеек:», , , , , , , 8)

‘Узнаем количество строк и столбцов

MsgBox «Количество строк = « & myRange.Rows.Count _

& vbNewLine & «Количество столбцов = « & myRange.Columns.Count

End Sub

Запустите процедуру, выберите на рабочем листе Excel любой диапазон и нажмите кнопку «OK». Информационное сообщение выведет количество строк и столбцов в диапазоне, присвоенном переменной myRange.


May 25, 2015/



Chris Newman

5 Ways To Create Dynamic VBA Macro Ranges

Dynamic Code Is Vital!

A huge turning point for me when I was teaching myself how to write VBA was being able to create dynamic code. This meant I didn’t have to go into my macros and change range addresses in my code every time the size of my data changed (which was typically every day). Through lots of trial and error, I’ve come up with a list of 5 different methods you can use to turn your static range references into powerful, auto-adjusting machines! All of these code snippets have advantages and disadvantages, so make sure you pick the one that works for your particular situation.

Method 1: UsedRange

The UsedRange method creates a range that includes every cell that contains data in it on the spreadsheet. It is vital that you refresh (recalculate) the UsedRange before using it as the method will pick up ghost cells (cells that had values in them and you used the Delete key to remove the values). Manually you can do this by saving your spreadsheet or you can use the command shown in the below code to refresh with VBA.

Sub DynamicRange()
‘Best used when only your target data is on the worksheet

‘Refresh UsedRange (get rid of «Ghost» cells)
  Worksheets(«Sheet1»).UsedRange

‘Select UsedRange
  Worksheets(«Sheet1»).UsedRange.Select

End Sub

Method 2: Ctrl + Shift + Right Arrow/Down Arrow

This code simulates the range that would show up if you were to use the keyboard shortcut Ctrl + Shift + Right Arrow and then Ctrl + Shift + Down Arrow. If the last cell in the first row or the last cell in the first column are empty, this code will not calculate properly.

Sub DynamicRange()
‘Best used when first column has value on last row and first row has a value in the last column

Dim sht As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim StartCell As Range

Set sht = Worksheets(«Sheet1»)
Set StartCell = Range(«D9»)

‘Find Last Row and Column
  LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row
  LastColumn = sht.Cells(StartCell.Row, sht.Columns.Count).End(xlToLeft).Column

‘Select Range
  sht.Range(StartCell, sht.Cells(LastRow, LastColumn)).Select

End Sub

Method 3: SpecialCells — LastCell

This code uses the SpecialCells method (the non-VBA terminology is called Go To Cells) to search for the last cell containing data on the spreadsheet. Once this cell is found, the code can use the cell reference of the «last cell» to determine the last row and column.

Sub DynamicRange()
‘Best used when you want to include all data stored on the spreadsheet

Dim sht As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim StartCell As Range

Set sht = Worksheets(«Sheet1»)
Set StartCell = Range(«D9»)

‘Refresh UsedRange
  Worksheets(«Sheet1»).UsedRange

‘Find Last Row and Column
  LastRow = StartCell.SpecialCells(xlCellTypeLastCell).Row
  LastColumn = StartCell.SpecialCells(xlCellTypeLastCell).Column

‘Select Range
  sht.Range(StartCell, sht.Cells(LastRow, LastColumn)).Select

  End Sub

Method 4: CurrentRegion

This example uses the CurrentRegion method. CurrentRegion tries to calculate the range associated with a cell reference by analyzing the surrounding cells. If there is a completely blank row or blank column, CurrentRegion stops looking and assumes that you were only wanting the data that was connected with your starting point. Make sure there are no chances of your data having a completely blank row or column before using this method.

Sub DynamicRange()
‘Best used when your data does not have any entirely blank rows or columns

Dim sht As Worksheet
Dim StartCell As Range

Set sht = Worksheets(«Sheet1»)
Set StartCell = Range(«D9»)

‘Select Range
  StartCell.CurrentRegion.Select

End Sub

Method 5: Static Columns

I’ve experienced lots of situations where the column length never changed and the VBA code just needed to dynamically adjust for row length. In cases like this, you may not want to write lines to look for the last column. The below code shows you how to adjust a ranges row length dynamically.

Note: You could also use the LastRow calculation used in Method 2 instead of the Find calculation shown below.

Sub DynamicRange()
‘Best used when column length is static

Dim sht As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim StartCell As Range

Set sht = Worksheets(«Sheet1»)
Set StartCell = Range(«D9»)

‘Refresh UsedRange
  Worksheets(«Sheet1»).UsedRange

‘Find Last Row
  LastRow = sht.Cells.Find(«*», SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

‘Select Range
  sht.Range(«D9:M» & LastRow).Select

End Sub

What Can I Do With A Dynamic Range?

There are a ton of scenarios that may require you to have an automatically expanding and collapsing range reference. Examples could be:

  • Resizing a Pivot Table source range

  • Looping through cells in a data set

  • Deleting only the raw data range

There are many, many more examples of this and I’m am sure you can think of a few examples yourself. Let me know in the comments section below how you use resizing a range in your macro code!  Also, if you can think of any other ways to use VBA code to resize your ranges automatically, post your coding method in the comments section so we can improve the current list.  I look forward to reading about your experiences.

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!

— Chris
Founder, TheSpreadsheetGuru.com

Понравилась статья? Поделить с друзьями:
  • Макрос для разъединения ячеек в excel
  • Макрос для группировки строк excel
  • Макрос для разделения текста по столбцам в excel
  • Макрос для гиперссылок excel
  • Макрос для разделения документа word на отдельные файлы