Количество строк в диапазоне vba excel
Функции, основанные на критериях, являются лидером в расчетах. В начале изучения Excel мы должны были изучить процесс COUTNIF в Excel. В наших предыдущих статьях мы показали вам, как работать с функцией СЧЁТЕСЛИ в Excel VBA.
Обратитесь к нашей статье о Формула СЧЁТЕСЛИ в Excel Формула СЧЁТЕСЛИ в Excel Функция СЧЁТЕСЛИ в Excel подсчитывает количество ячеек в диапазоне на основе заранее определенных критериев. Он используется для подсчета ячеек, содержащих даты, числа или текст. Например, СЧЁТЕСЛИ (A1: A10, «Козырный») подсчитает количество ячеек в диапазоне A1: A10, содержащих текст «Козырный».
читать далее чтобы узнать основы функции СЧЁТЕСЛИ в Excel VBA. В этой статье мы покажем вам, как использовать ту же функцию в кодировании VBA. Теперь мы увидим ту же формулу в VBA. Прежде всего, СЧЁТЕСЛИ не является функцией VBA; вместо этого это функция рабочего листа, к которой можно получить доступ из класса функции рабочего листа.
Пример функции счетчика Excel VBA
Хорошо, давайте посмотрим на простой пример.
Посмотрите на приведенный ниже пример подсчета значений из лота.
На изображении выше у нас есть названия городов от ячейки A1 до A10. В ячейке C3 нам нужно подсчитать, сколько раз название города «Бангалор» встречается в диапазоне от A1 до A10.
Хорошо, выполните следующие шаги, чтобы написать код для применения функции СЧЁТЕСЛИ.
Шаг 1: Запустите процедуру Sub.
Код:
Шаг 2: Поскольку нам нужно сохранить результат в ячейке C3, запустите Range («C3»). Value.
Код:
Шаг 3: В ячейке C3, применяя функцию excel VBA COUNTIF, мы пытаемся получить результат. Итак, чтобы получить доступ к функции, нам нужно сначала использовать класс Worksheet Function.
Код:
Шаг 4: Из утерянного выберите функцию Excel VBA COUNTIF.
Код:
Шаг 5: Если вы посмотрите на параметры функции VBA COUNTIF, мы не увидим параметр, как мы видим на рабочем листе.
Как мы видим на приведенном выше изображении на листе, у нас есть точный синтаксис, но в VBA мы можем видеть только Arg 1 и Arg 2.
Arg 1 — это диапазон, поэтому выберите диапазон от A1 до A10.
Код:
Шаг 6: Arg 2 — это значение, которое нам нужно посчитать в диапазоне от A1 до A10. В этом примере нам нужно вычислить «Бангалор».
Код:
Хорошо, мы закончили.
Запустите код, чтобы увидеть результат в ячейке C3.
Мы получили результат 4. Так как название города «Бангалор» появляется в ячейках A1, A4, A7 и A10, функция СЧЁТЕСЛИ VBA вернула результат как 4.
Если вы видите, что код VBA вернул только результат формулы, мы не узнаем о процедуре в строке формул.
Чтобы прийти к формуле, нам нужно написать код немного иначе. Ниже приведен код, позволяющий применить к ячейке саму формулу.
Код:
Это применит формулу к ячейке C3.
Получите результат с переменными
Переменные — неотъемлемая часть любого языка программирования. Нам нужно объявить переменные для эффективной работы с Код VBA Код VBA Код VBA относится к набору инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи. читать далее . Например, посмотрите на приведенный ниже код.
Код:
Позвольте мне расшифровать код, чтобы вы лучше поняли.
Сначала я объявил две переменные как Range.
Тусклый ValuesRange В виде Диапазон: это ссылка на список значений.
Тусклый ResultCell В виде Диапазон: это ссылка на ячейку результата.
Затем я установил диапазон ссылок на обе переменные.
Набор ValuesRange = Range («A1: A10»): это диапазон, в котором присутствуют все названия городов.
Набор ResultCell = Range («C3»): в этой ячейке мы будем хранить результат функции СЧЁТЕСЛИ.
А пока я объявил еще одну переменную для хранения значения критерия.
Тусклый CriteriaValue В виде Нить
Итак, теперь переменная CriteteriaValue содержит значение Bangalore.
В следующей строке я, как обычно, применил функцию СЧЁТЕСЛИ.
ResultCell = WorksheetFunction.CountIf (ValuesRange, CriteriaValue)
Таким образом, мы можем применить функцию СЧЁТЕСЛИ в Excel VBA в соответствии с нашими потребностями.
Представляет ячейку, строку, столбец или группу ячеек, содержащую один или несколько смежных блоков ячеек или объемный диапазон.
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.
Примечания
Элемент по умолчанию объекта Range направляет вызовы без параметров в свойство Value, а вызовы с параметрами — в элемент Item. Таким образом, someRange = someOtherRange соответствует someRange.Value = someOtherRange.Value , someRange(1) соответствует someRange.Item(1) и someRange(1,1) соответствует someRange.Item(1,1) .
В разделе Пример описаны следующие свойства и методы для возврата объекта Range:
Пример
Чтобы вернуть объект Range, представляющий одну ячейку или диапазон ячеек, используйте синтаксис Range ( arg ), где arg обозначает диапазон. В следующем примере значение ячейки A1 помещается в ячейку A5.
В следующем примере диапазон A1:H8 заполняется случайными числами путем задания формулы для каждой ячейки в диапазоне. При использовании без квалификатора объекта (объекта слева от точки) свойство Range возвращает диапазон на активном листе. Если активное окно не является листом, метод завершается с ошибкой.
Используйте метод Activate объекта Worksheet, чтобы активировать лист перед использованием свойства Range без явного квалификатора объекта.
В следующем примере очищается содержимое диапазона Criteria.
Если используется текстовый аргумент для адреса диапазона, необходимо указать адрес в нотации стиля A1 (нельзя использовать нотацию в стиле R1C1).
Чтобы получить диапазон, содержащий все отдельные ячейки листа, используйте свойство Cells на листе. Вы можете обращаться к отдельным ячейкам, используя синтаксис Item(строка, столбец), где строка — индекс строки, а столбец — индекс столбца. Свойство Item можно пропустить, так как вызов направляется к нему с помощью элемента по умолчанию объекта Range. В следующем примере на первом листе активной книги ячейке A1 присваивается значение 24, а в ячейке B1 — значение 42.
В следующем примере задается формула для ячейки A2.
Хотя также можно использовать Range("A1") , чтобы вернуть значение ячейки A1, иногда свойство Cells может быть удобнее, так как позволяет использовать переменную для строки или столбца. В следующем примере создаются заголовки столбцов и строк на листе Sheet1. Обратите внимание, что после активации листа можно использовать свойство Cells без явного объявления листа (оно возвращает ячейку на активном листе).
Хотя для изменения ссылок в стиле A1 можно использовать строковые функции Visual Basic, проще (и лучше при программировании) использовать нотацию Cells(1, 1) .
Используйте синтаксис_выражение_.Cells, где выражение возвращает объект Range, чтобы получить диапазон с тем же адресом, состоящий из отдельных ячеек. В таком диапазоне отдельные ячейки доступны с помощью синтаксиса Item(строка, столбец) относительно левого верхнего угла первой области диапазона. Свойство Item можно пропустить, так как вызов направляется к нему с помощью элемента по умолчанию объекта Range. В следующем примере на первом листе активной книги в ячейках C5 и D5 указывается формула.
Чтобы вернуть объект Range, используйте синтаксис Range ( ячейка1, ячейка2 ), где ячейка1 и ячейка2 — это объекты Range, указывающие начальную и конечную ячейки. В следующем примере устанавливается тип линии границы для ячеек A1:J10.
Имейте в виду, что точка перед каждым появлением свойства Cells является обязательной, если результат предыдущего оператора With нужно применять к свойству Cells. В данном случае указано, что ячейки расположены на листе один (без точки свойство Cells будет возвращать ячейки активного листа).
Чтобы получить диапазон, содержащий все строки листа, используйте свойство Rows на листе. Вы можете обращаться к отдельным строкам с помощью синтаксиса Item(строка), где строка — это индекс строки. Свойство Item можно пропустить, так как вызов направляется к нему с помощью элемента по умолчанию объекта Range.
Недопустимо указывать второй параметр свойства Item для диапазонов, состоящих из строк. Сначала нужно преобразовать их в отдельные ячейки, используя свойство Cells.
В следующем примере удаляются строки 4 и 10 первого листа активной книги.
Чтобы получить диапазон, содержащий все столбцы листа, используйте свойство Columns на листе. Вы можете обращаться к отдельным столбцам с помощью синтаксиса Item(строка) [sic], где строка — это индекс столбца в виде числа или адреса столбца в формате А1. Свойство Item можно пропустить, так как вызов направляется к нему с помощью элемента по умолчанию объекта Range.
Недопустимо указывать второй параметр свойства Item для диапазонов, состоящих из столбцов. Сначала нужно преобразовать их в отдельные ячейки, используя свойство Cells.
В следующем примере удаляются столбцы B, C, E и J первого листа активной книги.
Используйте синтаксис_выражение_.Rows, где выражение возвращает объект Range, чтобы получить диапазон, состоящий из строк первой области диапазона. Вы можете обращаться к отдельным строкам с помощью синтаксиса Item(строка), где строка — это относительный индекс строки от верхнего края первой области диапазона. Свойство Item можно пропустить, так как вызов направляется к нему с помощью элемента по умолчанию объекта Range.
Недопустимо указывать второй параметр свойства Item для диапазонов, состоящих из строк. Сначала нужно преобразовать их в отдельные ячейки, используя свойство Cells.
В следующем примере удаляются диапазоны C8:D8 и C6:D6 первого листа активной книги.
Используйте синтаксис_выражение_.Columns, где выражение возвращает объект Range, чтобы получить диапазон, состоящий из столбцов первой области диапазона. Вы можете обращаться к отдельным столбцам с помощью синтаксиса Item(строка) [sic], где строка — это относительный индекс столбца от левого края первой области диапазона, указанный в виде числа или адреса столбца в формате A1. Свойство Item можно пропустить, так как вызов направляется к нему с помощью элемента по умолчанию объекта Range.
Недопустимо указывать второй параметр свойства Item для диапазонов, состоящих из столбцов. Сначала нужно преобразовать их в отдельные ячейки, используя свойство Cells.
В следующем примере удаляются диапазоны L2:L10, G2:G10, F2:F10 и D2:D10 первого листа активной книги.
Чтобы вернуть диапазон с указанным смещением относительно другого диапазона, используйте синтаксис Offset ( строка, столбец ), где строка и столбец — это смещения строк и столбцов. В следующем примере выделяются ячейки, расположенные на три строки вниз и на один столбец вправо от ячейки в левом верхнем углу текущего выделенного фрагмента. Нельзя выбрать ячейку, которая находится не на активном листе, поэтому сначала необходимо активировать лист.
Используйте синтаксис Union ( диапазон1, диапазон2, . ) для возврата диапазонов из нескольких областей, то есть диапазонов, состоящих из двух или более смежных блоков ячеек. В следующем примере создается объект, определенный как объединение диапазонов A1:B2 и C3:D4, а затем выбирается определенный диапазон.
При работе с выделенными фрагментами, содержащими несколько областей, удобно применять свойство Areas. Оно разделяет выделенный фрагмент с несколькими областями на отдельные объекты Range, а затем возвращает объекты в виде коллекции. Используйте свойство Count в возвращенной коллекции, чтобы убедиться, что выделение содержит более одной области, как показано в следующем примере.
В этом примере используется метод AdvancedFilter объекта Range для создания списка уникальных значений, а также количества появлений этих уникальных значений в диапазоне столбца A.
Методы
Свойства
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
В программировании VBA обращение к строкам также является наиболее важным, и подсчет строк — это одна из вещей, о которых вы должны знать, когда дело доходит до кодирования VBA. Мы можем получить большую пользу, если поймем важность подсчета строк, содержащих данные на листе. В этой статье мы покажем вам, как подсчитывать строки, используя кодирование VBA.
Как считать строки в VBA?
Вы можете скачать этот шаблон Excel для подсчета строк VBA здесь — Шаблон Excel для подсчета строк VBA
Пример №1
К количество строк Количество строк Существует множество способов подсчета строк в Excel с использованием соответствующей формулы, независимо от того, являются ли они строками данных, пустыми строками или строками, содержащими числовые/текстовые значения. В зависимости от обстоятельств вы можете использовать функции COUNTA, COUNT, COUNTBLANK или COUNTIF. читать далее , нам нужно использовать объект RANGE, в этом объекте нам нужно использовать объект ROWS, а в этом нам нужно использовать свойство COUNT.
Например, посмотрите на приведенные ниже данные в Excel.
Из приведенных выше данных нам нужно определить, сколько строк находится в диапазоне от A1 до A8. Поэтому сначала определите переменную как целое число для хранения количества строк.
Код:
Для этой переменной мы будем назначать номера строк, поэтому введите имя переменной и знак равенства.
Код:
Нам нужно указать диапазон ячеек, поэтому откройте ДИАПАЗОН объект ДИАПАЗОН Объект Диапазон — это свойство в VBA, которое помогает указать конкретную ячейку, диапазон ячеек, строку, столбец или трехмерный диапазон. В контексте рабочего листа Excel объект диапазона VBA включает одну или несколько ячеек, распределенных по различным строкам и столбцам. читать далее и укажите диапазон как «A1: A8». Код:
После того, как диапазон предоставлен, нам нужно подсчитать количество строк, поэтому выберите свойство ROWS объекта RANGE.
В свойстве ROWS объекта RANGE мы подсчитываем количество строк, поэтому сейчас выберите свойство «COUNT».
Код:
Теперь запустите код и посмотрите количество строк предоставленного диапазона ячеек.
У нас есть и другие способы подсчета строк, для описанного выше метода нам нужно предоставить диапазон ячеек, и в этих ячейках диапазона он показывает количество выбранных строк.
Но представьте себе сценарий, в котором нам нужно найти последний использованный столбец, например, взять те же данные, что и выше.
Чтобы перейти к последней использованной ячейке из ячейки A1, мы нажимаем кнопку горячая клавиша эксель Клавиша быстрого доступа Excel Ярлык Excel — это способ более быстрого выполнения ручного задания. читать далее «Ctrl + стрелка вниз», поэтому он приведет вас к последней ячейке перед пустой ячейкой.
Сначала укажите ячейку как A1, используя объект RANGE.
Код:
Из этой ячейки нам нужно двигаться вниз, и на листе мы используем Ctrl + стрелка вниз, но в VBA мы используем END свойство КОНЕЦ Свойство End — это оператор VBA, который можно использовать различными способами в приложениях VBA. В любом месте кода можно использовать простой оператор End, чтобы мгновенно завершить выполнение кода. В процедурах оператор end используется для завершения подпроцедуры или любой функции цикла, например «End if». читать далее , выберите это свойство и откройте квадратную скобку, чтобы увидеть параметры.
Посмотрите туда с помощью клавиши END, мы можем увидеть все клавиши со стрелками, такие как «xlDown, xlToLeft, xlToRight и xlUp», так как нам нужно двигаться вниз, используя опцию «xlDown».
Код:
Это приведет вас к последней камере перед любым перерывом, теперь в активная ячейка Активная ячейка Активная ячейка — это выделенная в данный момент ячейка на листе. Активную ячейку в VBA можно использовать в качестве ссылки для перехода к другой ячейке или изменения свойств той же активной ячейки или ссылки на ячейку, полученной из активной ячейки. читать далее нам нужен номер строки, поэтому используйте свойство ROW.
Код:
Готово. Теперь это покажет номер последней строки Номер последней строки Метод End(XLDown) чаще всего используется в VBA для поиска последней строки, но есть и другие методы, например поиск последнего значения в VBA с помощью функции поиска (XLDown). читать далее , и это будет количество строк.
Итак, в строках у нас есть данные.
Пример № 3 — найти последнюю использованную строку
Поиск последней использованной строки настолько важен, чтобы решить, сколько раз должен выполняться цикл, а также в приведенном выше методе последняя строка останавливается, чтобы выбрать, есть ли какая-либо ячейка точки останова, поэтому в этом методе мы можем найти последнюю использованную строку без какие-то проблемы.
Открытым CELL-свойство ЯЧЕЙКА Свойство Ячейки — это ячейки рабочего листа, и в VBA, когда мы ссылаемся на ячейки как на свойство диапазона, мы ссылаемся на одни и те же ячейки. В концепциях VBA ячейки также одинаковы, ничем не отличаются от обычных ячеек Excel. читать далее .
Код:
Теперь нам нужно указать номер строки для начала, проблема здесь в том, что мы не уверены, сколько строк данных у нас есть, поэтому мы можем сразу перейти к последней строке рабочего листа, для этого упомяните ROWS .COUNT свойство.
Код:
Затем нам нужно указать, в каком столбце мы находим последнюю использованную строку, поэтому в этом случае мы находим в первом столбце, поэтому укажите 1.
Код:
В этот момент вы перейдете к последней ячейке первого столбца, оттуда нам нужно двигаться вверх, чтобы перейти к последней использованной ячейке, поэтому используйте свойство End (xlUp).
Код:
Таким образом, вы перейдете к последней использованной ячейке столбца 1, и в этой ячейке нам нужен номер строки, поэтому используйте свойство ROW, чтобы получить номер строки.
Диапазон — это свойство в VBA похоже на свойство рабочего листа, свойство диапазона также имеет множество приложений и применений, когда мы пишем наш код и указываем конкретный диапазон ячеек или конкретную ячейку, это делается методом свойства диапазона, оно используется для ссылки на строки ячеек и столбцы.
Как вы знаете, VBA используется для записи и запуска макросов и автоматизации задач Excel, а также для более быстрого и точного выполнения повторяющихся задач.
В контексте рабочего листа Excel объект диапазона VBA обозначает ячейки, как одиночные, так и множественные. Объект диапазона может включать одну ячейку, всю строку или столбец или несколько ячеек, распределенных по строкам и столбцам.
Чтобы VBA запускал макросы и выполнял задачи, ему необходимо определить ячейки, в которых должны выполняться вызываемые задачи. Именно здесь концепция Range Objects находит свое применение.
Как использовать объект Range?
Чтобы ссылаться на объекты в VBA, мы используем иерархическую технику. Есть 3 иерархии:
- Квалификатор объекта: Он относится к местоположению объекта, например, где он находится, т. Е. К книге или листу, на которые имеется ссылка.
- Два других используются для манипулирования значениями ячеек. Это свойство и методы.
- Свойство: Здесь хранится информация об объекте.
- Метод: Это относится к действию, которое объект будет выполнять.
Например, для Range методом будут такие действия, как сортировка, форматирование, выбор, очистка и т. Д.
Это структура, которой следуют всякий раз, когда упоминается объект VBA. Эти 3 разделены точкой (.)
Application.Workbooks.Worksheets.Range
синтаксис
Application.Workbooks («Booknew.xlsm»). Рабочие листы («Sheet3»). Range («B1»)
Примеры
Пример №1 — Обращение к отдельной ячейке
Предположим, нам нужно выбрать ячейку «B2» в «sheet1» в книге.
Выполните следующие шаги:
- Откройте Excel. Откройте файл с расширением Excel «.xlsm», что означает «Книга с поддержкой макросов Excel». Книга Excel с типами «.xlsx» не позволит вам сохранить макросы, которые вы будете писать сейчас.
- Теперь, когда вы открыли книгу, вам нужно перейти в редактор VBA. Вы можете использовать сочетание клавиш «ALT + F11», чтобы открыть редактор, или воспользуйтесь приведенным ниже методом, как показано на снимке экрана:
Вы увидите экран, похожий на показанный ниже:
Теперь напишите код, как показано на скриншоте ниже.
Смотрите на скриншоте Excel ниже, что в настоящее время активирована ячейка A2. После запуска кода обратите внимание, где находится активированная ячейка.
Запустите код, как показано на скриншоте ниже:
Совет: вы также можете использовать горячую клавишу Excel, например F5, для запуска кода.
Вы увидите, что ячейка «B2» выбрана после выполнения программы.
Здесь вы даете инструкции программе перейти к определенной ячейке на определенном листе конкретной книги и выполнить действие, указанное здесь, для выбора.
Точно так же вы можете использовать синтаксис для выбора широкого спектра ячеек и диапазонов, а также выполнять с ними различные действия.
Например, здесь, чтобы выбрать вторую строку. Запустите приведенный ниже код, чтобы выбрать всю строку
Здесь диапазон («2: 2») означает вторую строку. Вы можете вернуться к своему листу Excel и увидеть результаты, как показано на скриншоте ниже.
Например, здесь, чтобы выбрать весь столбец C. Запустите приведенный ниже код и просмотрите результаты.
После ввода приведенного выше кода вы увидите, что весь столбец выбран на вашем листе Excel. См. Снимок экрана ниже.
Здесь диапазон («C: C») означает столбец C.
Точно так же вы можете выбрать непрерывные ячейки или несмежные ячейки, пересечение диапазонов ячеек и т. Д.
Просто внесите следующие изменения в часть диапазона, показанную в коде.
Пример №4 — Выбор смежных ячеек: диапазон («B2: D6»)
Пример № 5 — Выбор несмежных ячеек: диапазон («B1: C5, G1: G3»)
Пример №6 — Выбор пересечения диапазона: Диапазон («B1: G5 G1: G3»)
[Note the absence of comma here]. Здесь вы увидите, что выбираются от G1 до G3, которые являются общими ячейками в указанном диапазоне.
Теперь следующим примером будет выбор группы ячеек на листе и объединение их в одну ячейку.
Предположим, вы хотите объединить ячейки «B1: C5» в одну. См. Приведенный ниже код и следуйте инструкциям.
Здесь «.merge» — это действие, которое мы выполняем над группой ячеек, заданной в диапазоне.
Предположим, что ячейки «F2: H6» выделены желтым, и мы хотим очистить это форматирование Excel. Другой сценарий, возможно, вы хотите удалить все форматирование либо на всем листе, либо в группе ячеек.
Смотрите скриншоты ниже, чтобы продолжить. Сначала я покажу вам отформатированные ячейки (F2: H6).
Пожалуйста, запустите коды, показанные на снимке экрана ниже, чтобы удалить это форматирование в выбранном диапазоне ячеек.
Синтаксис: ThisWorkbook.Worksheets («Sheet1»). Range («F2: H6»). ClearFormats
Вы можете обратиться к этому снимку экрана, приведенному ниже:
Точно так же вы можете очистить содержимое диапазона ячеек с помощью действия «.ClearContents».
Функция записи макросов Excel используется не столько для создания хорошего кода, сколько для поиска названий необходимых объектов, методов и свойств. Например, при записи операции копирования и вставки можно получить код:
Sub Макрос()
Range( " A1 " ).Select
Selection.Copy
Range( " B1 " ).Select
ActiveSheet.Paste
End Sub
Обратите внимание, что данная программа выделяет ячейки. Однако в VBA для работы с объектом не обязательно его выделять. Данную процедуру можно заменить значительно более простой — применить метод Сору, который использует аргумент, представляющий адрес места вставки копируемого диапазона.
Sub CopyRange()
Range( " А1 " ).Copy Range( " В1 " )
End Sub
Предполагается, что рабочий лист является активным и операция выполняется на активном рабочем листе. Чтобы скопировать диапазон на другой рабочий лист или в другую книгу, необходимо задать ссылку:
Sub CopyRange2()
Workbooks( " File1.xlsx " ).Sheets( " Лист1 " ).Range( " A1 " ).Copy _
Workbooks( " File2.xlsx " ).Sheets( " Лист2 " ).Range( " A1 " )
End Sub
Еще одним подходом к решению этой задачи является использование для представления диапазонов объектных переменных:
Sub CopyRange3()
Dim Rngl As Range, Rng2 As Range
Set Rngl = Workbooks( " File1.xlsx " ).Sheets( " Лист1 " ).Range( " A1 " )
Set Rng2 = Workbooks( " File2.xlsx " ).Sheets( " Лист2 " ).Range( " A1 " )
Rngl.Copy Rng2 End Sub
Можно копировать большой диапазон. Адрес места вставки определяется единственной ячейкой (представляющей верхний левый угол вставляемого диапазона):
Sub CopyRange4 ()
Range( " А1:С800 " ).Copy Range( " D1 " )
End Sub
Для перемещения диапазона ячеек вместо метода Сору используется метод Cut.
Если размер копируемого диапазона не известен используется свойство CurrentRegion, возвращающее объект Range, который соответствует прямоугольнику ячеек вокруг заданной ячейки:
Sub CopyCurrentRegion2()
Range( " A1 " ).CurrentRegion.Copy Sheets( " Лист2 " ).Range( " A1 " )
End Sub
Метод End имеет один аргумент, определяющий направление, в котором увеличивается выделение ячеек. Следующий оператор выделяет диапазон от активной ячейки до последней непустой ячейки внизу:
Range (ActiveCell, ActiveCell.End(xlDown)).Select
Три остальные константы имитируют комбинации клавиш при выделении в других направлениях: xlUp (вверх), xlToLeft (влево) и xlToRight (вправо).
В прилагаемом Excel-файле определено несколько распространенных типов выделения ячеек (см. рис. 1). Код любопытен тем, что является также примером создания контекстного меню.
Запрос значения ячейки
Следующая процедура запрашивает значение у пользователя и вставляет его в ячейку А1:
Sub GetValuel()
Range( " A1 " ).Value = InputBox( " Введите значение " )
End Sub
Однако при выполнении этой процедуры возникает проблема. Если пользователь щелкнет на кнопке Отмена в окне ввода данных, то процедура удалит данные, которые находились в текущей ячейке. Модифицированная версия процедуры адекватно реагирует на щелчок на кнопке Отмена и не выполняет при этом никаких действий:
Sub GetValue2()
Dim UserEntry As Variant
UserEntry = InputBox( " Введите значение " )
If UserEntry <> " " Then Range( " A1 " ).Value = UserEntry
End Sub
Во многих случаях следует проверить правильность данных, введенных пользователем. Например, необходимо обеспечить введение только чисел в диапазоне от 1 до 12 (рис. 2). Это можно сделать при помощи процедуры GetValue3(), код которой приведен в Модуле1 приложенного Excel-файла. Некорректные данные игнорируются, и окно запроса значения отображается снова. Этот цикл будет повторяться, пока пользователь не введет правильное значение или не щелкнет на кнопке Отмена.
Рис. 2. Проверка данных, введенных пользователем
Ввод значения в следующую пустую ячейку
Если требуется ввести значение в следующую пустую ячейку столбца или строки, используйте код (рис. 3):
Sub GetData()
Dim NextRow As Long
Dim Entry1 As String, Entry2 As String
Do
' Определение следующей пустой строки
NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
' Запрос данных
Entry1 = InputBox( " Введите имя " )
If Entry1 = " " Then Exit Sub
Entry2 = InputBox( " Введите сумму " )
If Entry2 = " " Then Exit Sub
' Запись данных
Cells(NextRow, 1) = Entry1
Cells(NextRow, 2) = Entry2
Loop
End Sub
Рис. 3. Макрос вставляет данные в следующую пустую строку рабочего листа
Это бесконечный цикл. Для выхода из него (щелкните на кнопке Cancel) использовались операторы Exit Sub. Обратите внимание строку, в который определяется значение переменной NextRow. Если вам трудно ее понять, проанализируйте содержимое ячейки: перейдите в последнюю ячейку столбца А и нажмите и . После этого будет выделена последняя непустая ячейка в столбце А. Свойство Row возвращает номер этой строки; чтобы получить расположенную под ней строку (следующую пустую строку), к этому номеру прибавляется 1.
Приостановка работы макроса для определения диапазона пользователем
В некоторых ситуациях макрос должен взаимодействовать с пользователем. Например, можно создать макрос, который приостанавливается, когда пользователь указывает диапазон ячеек. Для этого воспользуйтесь функцией Excel InputBox. Не путайте метод Excel InputBox с функцией VBA InputBox. Несмотря на идентичность названий, это далеко не одно и то же.
Процедура, представленная ниже, демонстрирует, как приостановить макрос и разрешить пользователю выбрать ячейку. Затем автоматически формула вставляется в каждую ячейку выделенного диапазона.
Sub GetUserRange()
Dim UserRange As Range
Prompt = " Выберите диапазон для случайных чисел. "
Title = " Выбор диапазона "
' Отображение поля ввода
On Error Resume Next
Set UserRange = Application.InputBox( _
Prompt:=Prompt, _
Title:=Title, _
Default:=ActiveCell.Address, _
Type:=8) ' Выделение диапазона
On Error GoTo 0
' Отменено ли отображение поля ввода?
If UserRange Is Nothing Then
MsgBox " Отменено. "
Else
UserRange.Formula = " =RAND() "
End If
End Sub
Окно ввода данных показано на рис. 4. Важный момент в этой процедуре – определение аргумента Туре равным 8 (в этом случае InputBox вернет диапазон; подробнее см. Application.InputBox Method).
Рис. 4. Использование окна ввода данных с целью приостановки выполнения макроса
Обязательно проверьте, включено ли обновление экрана при использовании метода InputBox для выделения диапазона. Если обновление экрана отключено, вы не сможете выделить рабочий лист. Чтобы проконтролировать обновление экрана, в процессе выполнения макроса используйте свойство ScreenUpdating объекта Application.
Подсчет выделенных ячеек
Если активный лист содержит диапазон data, то следующий оператор присваивает количество ячеек в диапазоне data переменной с названием CellCount:
CellCount = Range( " data " ).Count
Вы можете также определить, сколько строк или столбцов содержится в диапазоне. Следующее выражение вычисляет количество столбцов в выделенном диапазоне:
Следующий оператор пересчитывает количество строк в диапазоне с названием data и присваивает это количество переменной RowCount.
RowCount = Range( " data " ).Rows.Count
Просмотр выделенного диапазона
Вы можете столкнуться с трудностями при создании макроса, который оценивает каждую ячейку в диапазоне и выполняет операцию, определенную заданному критерию. Если выделен целый столбец или строка, то работа макроса может занять много времени. Процедура ColorNegative устанавливает красный цвет для ячеек, которые содержат отрицательные значения. Цвет фона для других ячеек не определяется. Код процедуры можно найти в Модуле4 приложенного Excel-файла.
Усовершенствованная процедура ColorNegative2, создает объектную переменную WorkRange типа Range, которая представляет собой пересечение выделенного диапазона и диапазона рабочего листа (рис. 5). Если выделить столбец F (1048576 ячеек), то его пересечение с рабочим диапазоном В2:I16) даст область F2:F16, которая намного меньше исходного выделенного диапазона. Время, затрачиваемое на обработку 15 ячеек, намного меньше времени, уходящего на обработку миллиона ячеек.
Рис. 5. В результате пересечения используемого диапазона и выделенного диапазона рабочего листа уменьшается количество обрабатываемых ячеек
И всё же процедура ColorNegative2 недостаточно эффективна, поскольку обрабатывает все ячейки в диапазоне. Поэтому предлагается процедура ColorNegative3. В ней используется метод SpecialCells, с помощью которого генерируются два поднабора выделенной области: один поднабор (ConstantCells) включает ячейки, которые содержат исключительно числовые константы; второй поднабор (FormulaCells) включает ячейки, содержащие числовые формулы. Обработка ячеек в этих поднаборах осуществляется с помощью двух конструкций For Each-Next. Благодаря тому, что исключается обработка пустых и нетекстовых ячеек, скорость выполнения макроса существенно увеличивается.
Sub ColorNegative3()
' Окрашивание ячеек с отрицательными значениями в красный цвет
Dim FormulaCells As Range, ConstantCells As Range
Dim cell As Range
If TypeName(Selection) <> " Range " Then Exit Sub
Application.ScreenUpdating = False
' Создание поднаборов исходной выделенной области
On Error Resume Next
Set FormulaCells = Selection.SpecialCells(xlFormulas, xlNumbers)
Set ConstantCells = Selection.SpecialCells(xlConstants, xlNumbers)
On Error GoTo 0
' Обработка ячеек с формулами
If Not FormulaCells Is Nothing Then
For Each cell In FormulaCells
If cell.Value < 0 Then
cell.Interior.Color = RGB(255, 0, 0)
Else
cell.Interior.Color = xlNone
End If
Next cell
End If
' Обработка ячеек с константами
If Not ConstantCells Is Nothing Then
For Each cell In ConstantCells
If cell.Value < 0 Then
cell.Interior.Color = RGB(255, 0, 0)
Else
cell.Interior.Color = xlNone
End If
Next cell
End If
End Sub
Оператор On Error необходим, поскольку метод SpecialCells генерирует ошибку, если не находит в диапазоне ячеек указанного типа.
Удаление всех пустых строк
Следующая процедура удаляет все пустые строки в активном рабочем листе. Она достаточно эффективна, так как не проверяет все без исключения строки, а просматривает только строки в так называемом «используемом диапазоне», определяемом с помощью свойства UsedRange объекта Worksheet.
Sub DeleteEmptyRows()
Dim LastRow As Long
Dim r As Long
Dim Counter As Long
Application.ScreenUpdating = False
LastRow = ActiveSheet.UsedRange.Rows.Count + _
ActiveSheet.UsedRange.Rows(1).Row — 1
For r = LastRow To 1 Step -1
If Application.WorksheetFunction.CountA(Rows(r)) = 0 Then
Rows(r).Delete
Counter = Counter + 1
End If
Next r
Application.ScreenUpdating = True
MsgBox Counter & " Пустые строки удалены. "
End Sub
Первый шаг — определить последнюю используемую строку и присвоить этот номер строки переменной LastRow. Это не так просто, как можно ожидать, поскольку текущий диапазон необязательно начинается со строки 1. Следовательно, значение LastRow вычисляется таким образом: к найденному количеству строк используемого диапазона прибавляется номер первой строки текущего диапазона и вычитается 1.
В процедуре применена функция Excel СЧЁТЗ, определяющая, является ли строка пустой. Если данная функция для конкретной строки возвращает 0, то эта строка пустая. Обратите внимание, что процедура просматривает строки снизу вверх и использует отрицательное значение шага в цикле For-Next. Это необходимо, поскольку при удалении все последующие строки перемещаются «вверх» в рабочем листе. Если бы в цикле просмотр выполнялся сверху вниз, то значение счетчика цикла после удаления строки оказалось бы неправильным.
Дублирование строк
Пример, рассматриваемый в этом разделе, демонстрирует использование возможностей VBA для создания дубликатов строк. На рис. 6 показан пример рабочего листа, используемого организаторами лотереи. В столбце А вводится имя. В столбце В содержится количество лотерейных билетов, приобретенных одним покупателем. В столбце С находится случайное число сгенерированное с помощью функции СЛЧИС. Победитель определяется путем сортировки данных в третьем столбце (выигрыш соответствует наибольшему случайному числу).
Рис. 6. Дублирование строк на основе значений в столбце В
А теперь нужно продублировать строки, в результате чего количество строк для каждого участника лотереи будут соответствовать количеству купленных им билетов. Например, если Барбара приобрела два билета, для нее создаются две строки. Ниже показана процедура, выполняющая вставку новых строк.
Sub DupeRows()
Dim cell As Range
' 1-я ячейка, содержащая сведения о количестве билетов
Set cell = Range( " B2 " )
Do While Not IsEmpty(cell)
If cell > 1 Then
Range(cell.Offset(1, 0), cell.Offset(cell.Value _
— 1,0)).EntireRow.Insert
Range(cell, cell.Offset(cell.Value — 1, — 1)). _
EntireRow.FillDown
End If
Set cell = cell.Offset(cell.Value, 0)
Loop
End Sub
Объектная переменная cell была инициализирована ячейкой В2, первой ячейкой, в которой находится числовая величина. Вставка новых строк осуществляется в цикле, а их копирование происходит с помощью метода FillDown. Значение переменной cell увеличивается на единицу, после чего выбирается следующий участник лотереи, Цикл выполняется до тех пор, пока не встретится пустая ячейка. На рис. 7 показан рабочий лист после выполнения этой процедуры.
Рис. 7. В соответствии со значением в столбце В добавлены новые строки
Определение диапазона, находящегося в другом диапазоне
Функция InRange имеет два аргумента, оба — объекты Range. Функция возвращает значение True (Истина), если первый диапазон содержится во втором.
Function InRange(rng1, rng2) As Boolean
‘ Возвращает True, если rng1 является подмножеством rng2
InRange = False
If rng1.Parent.Parent.Name = rng2.Parent.Parent.Name Then
If rng1.Parent.Name = rng2.Parent.Name Then
If Union(rng1, rng2).Address = rng2.Address Then
InRange = True
End If
End If
End If
End Function
Возможно, функция InRange кажется сложнее, чем того требует ситуация, поскольку в коде должна быть реализована проверка принадлежности двух диапазонов одной и той же книге и рабочему листу. Обратите внимание, что в процедуре используется свойство Parent, которое возвращает объект-контейнер заданного объекта. Например, следующее выражение возвращает название листа для объекта rng1:
Следующее выражение возвращает название рабочей книги rng1:
Функция VBA Union возвращает объект Range, который представляет собой объединение двух объектов типа Range. Объединение содержит все ячейки, относящиеся к исходным диапазонам. Если адрес объединения двух диапазонов совпадает с адресом второго диапазона, первый диапазон входит в состав второго диапазона.
Определение типа данных ячейки
В состав Excel входит ряд встроенных функций, которые могут помочь определить тип данных, содержащихся в ячейке. Это функции ЕНЕТЕКСТ, ЕЛОГИЧ и ЕОШИБКА. Кроме того, VBA поддерживает функции IsEmpty, IsDate и IsNumeric.
Ниже описана функция CellType, которая принимает аргумент-диапазон и возвращает строку, описывающую тип данных левой верхней ячейки этого диапазона (рис. 8). Такую функцию можно использовать в формуле рабочего листа или вызвать из другой процедуры VBA.
Рис. 8. Функция CellType, возвращающая тип данных ячейки
Function CellType(Rng)
' Возвращает тип ячейки, находящейся в левом верхнем углу диапазона
Dim TheCell As Range
Set TheCell = Rng.Range( " A1 " )
Select Case True
Case IsEmpty(TheCell)
CellType = " Пустая "
Case TheCell.NumberFormat = " @ "
CellType = " Текст "
Case Application.IsText(TheCell)
CellType = " Текст "
Case Application.IsLogical(TheCell)
CellType = " Логический "
Case Application.IsErr(TheCell)
CellType = " Ошибка "
Case IsDate(TheCell)
CellType = " Дата "
Case InStr(1, TheCell.Text, " : " ) <> 0
CellType = " Время "
Case IsNumeric(TheCell)
CellType = " Число "
End Select
End Function
Обратите внимание на использование оператора SetTheCell. Функция CellType получает аргумент-диапазон произвольного размера, но этот оператор указывает, что функция оперирует только левой верхней ячейкой диапазона (представленной переменной TheCell).
Читайте также: