Содержание
- Выбор диапазонов с помощью Visual Basic для приложений (примеры новичков)
- Аннотация
- Дополнительная информация
- Примеры выбора ячеек вручную
- Примеры использования кода Visual Basic для выбора ячеек в диапазоне
- Макрос для выборочного выделения ячеек на листе Excel
- Выделение несмежных диапазонов с помощью макроса
- Макрос для пересчета выделенной области
- Работа с диапазонами в VBA
- Копирование диапазона
- Запрос значения ячейки
- Ввод значения в следующую пустую ячейку
- Приостановка работы макроса для определения диапазона пользователем
- Подсчет выделенных ячеек
- Просмотр выделенного диапазона
- Дублирование строк
- Определение диапазона, находящегося в другом диапазоне
- Определение типа данных ячейки
Выбор диапазонов с помощью Visual Basic для приложений (примеры новичков)
Аннотация
В Microsoft Excel можно выбирать ячейки в диапазоне вручную или с помощью простого кода Microsoft Visual Basic для приложений. В этой статье приводится ряд примеров, которые можно использовать для выбора диапазона ячеек.
Дополнительная информация
Примеры выбора ячеек вручную
Чтобы вручную выбрать все данные в столбце, выберите первую ячейку и нажмите клавиши CTRL+SHIFT+СТРЕЛКА ВНИЗ.
Точно так же, чтобы вручную выбрать строку и все вложенные в нее столбцы, нажмите клавиши CTRL+SHIFT+СТРЕЛКА ВНИЗ+СТРЕЛКА ВПРАВО. Однако все данные должны быть неумными (т. е. пустые строки или столбцы не могут быть). Кроме того, вы можете выбрать текущую область данных (несколько строк или столбцов без пустых строк и столбцов).
В меню Правка выберите пункт Перейти.
В диалоговом окне Перейти нажмите кнопку Специальный.
В диалоговом окне Перейти к специальным выберите текущую область и нажмите кнопку
ОК.
Вы также можете выбрать этот диапазон с помощью простого Visual Basic для приложений кода.
Примечание. Если попытаться записать эту процедуру с помощью записи макроса, результаты будут не одинаковыми.
Примеры использования кода Visual Basic для выбора ячеек в диапазоне
Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации без гарантии, выраженной или подразумеваемой. В частности, это подразумевает подразумеваемые гарантии пригодности для купли-связи или пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который демонстрируется, и средствами, используемыми для создания и от debug procedures. Специалисты службы поддержки Майкрософт могут объяснить функциональные возможности конкретной процедуры, но не будут изменять эти примеры, чтобы предоставить дополнительные функции или процедуры по построению с учетом ваших конкретных требований. В примерах Visual Basic ниже покажите, как выбрать разные диапазоны.
Если вы знаете следующую ячейку (в данном примере — ячейка C1) и хотите выбрать ее до последней ячейки (в том же столбце), которая имеет данные, но не знает этот адрес, используйте следующий код:
Примечание. Макрос SelectRangeDown предполагает, что данные не должны быть соединимы. В противном случае, если в выбранном столбце данных есть пустые ячейки, этот макрос может не выбрать все ячейки в этом столбце.
Если данные начинаются с ячейки C1, но не являются неровными в этом столбце, используйте следующий макрос в Microsoft Office Excel 2003 и более ранних версиях Excel:
Так как Microsoft Office Excel 2007 поддерживает 1 048 576 строк, используйте следующий макрос в Excel 2007:
Если вы хотите выбрать активную ячейку вниз и все столбцы справа (предполагается, что данные есть во всех строках и столбцах), используйте следующий код:
Если вы знаете следующую следующую ячейку (в этом примере — ячейка D1) и хотите выбрать ее вниз и справа, используйте следующий код:
Чтобы выбрать все данные в текущем регионе, используйте следующий код:
В примерах, которые содержатся в этой статье, покажите, как выбрать различные диапазоны на активном компьютере текущей книги.
Чтобы получить дополнительные сведения о том, как выбрать диапазоны с помощью Visual Basic для приложений (и для более сложных примеров), щелкните номер следующей статьи, чтобы просмотреть статью в базе знаний Майкрософт:
291308 Выбор ячеек и диапазонов с Visual Basic в Excel
Источник
Макрос для выборочного выделения ячеек на листе Excel
В данном примере мы VBA код который позволяет найти и выделить ячейку макросом. Выделение ячеек с учетом нестандартных условий может оказаться весьма непростой задачей в Excel. В этом примере описано как легко решается данный тип задач с использованием макроса.
Выделение несмежных диапазонов с помощью макроса
У нас иметься таблица уровней расходов отделов по отношению к расходам труда, произведенного в отдельных отделах за первое полугодие. Часть ячеек, для которых неопределенны показатели содержат значение «нд».
Нам необходимо экспонировать ячейки, которые содержат значение «нд» выделив их серым цветом заливки фона. В таблице на десятки тысяч строк сложно искать все эти ячейки. А если редактировать каждую ячейку вручную, тогда потребуется много сил и времени. Без условно можно воспользоваться инструментом «Условное форматирование». Но иногда для автоматизированного решения данной задачи лучше написать свой собственный макрос. Дело в том, что несмотря на широкие возможности условного форматирования – макрос является более гибким инструментом. Его потом можно применять разным способом. Ведь в основе его принципа действия лежит выделение ячеек с определенным значением. После того как ознакомившись с нашей версией макроса вы сможете его легко изменять, придавая ему все новые функциональные возможности. В результате чего вас будет ограничивать только высота полета вашей фантазии.
Откройте редактор: «РАЗРАБОТЧИК»-«Код»-«Visual Basic» (ALT+F11):
В редакторе создайте новый модуль выбрав инструмент: «Insert»-«Module» и введите в него следующий VBA-код макроса:
Sub PoiskZnach()
Dim i As Long
Dim znach As Variant
Dim diapaz1 As Range
Dim diapaz2 As Range
znach = InputBox( «Введите исходное значение» )
If znach = «» Then Exit Sub
If IsNumeric(znach) Then znach = znach * 1
Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
If diapaz1 Is Nothing Then
MsgBox «Сначала выделите диапазон!»
Exit Sub
Else
For i = 1 To diapaz1.Count
If diapaz1(i) = znach Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1(i)
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next
End If
If diapaz2 Is Nothing Then
Else
diapaz2. Select
End If
End Sub
Теперь если мы хотим выделить все ячейки которые содержать значение «нд» в таблице отчета уровня расходов по отделам и присвоить им серый фон, тогда выделите диапазон B2:F12 выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«PoiskZnach»-«Выполнить».
В результате скачала появиться диалоговое окно, в котором следует ввести исходное значение для поиска «нд» и нажать ОК:
После чего макрос выполнит все инструкции, описанные в его коде на языке программирования VBA. Он автоматически и самостоятельно выделит все ячейки в выделенном диапазоне, которые содержат значение «нд»:
Результат автоматического выделения макросом группы ячеек соответствующие критерию поиска.
В начале кода объявлены 4 переменные:
- i – счетчик цикла.
- znach – значение которое должна содержать ячейка.
- diapaz1 – адрес проверяемого диапазона.
- diapaz2 – адрес для несмежного диапазона, соответствующий критериям пользователя.
Внимание! Понятие несмежный диапазон ячеек подразумевает то, что этот диапазон состоит из нескольких отдельных областей ячеек. Выделение нескольких диапазонов ячеек можно реализовать вручную с нажатой клавишей CTRL на клавиатуре при выделении мышкой разных областей на листе.
После декларации переменных вызываем окно для ввода критериев поиска необходимого значения и передаем эти же критерии в переменную znach. Сразу в коде описываем инструкцию для проверки на пустые критерии. Если пользователь оставил поле ввода пустым или нажал на кнопку «Отмена», тогда работа макроса будет прервана остановкой с помощью вызова соответствующей инструкции:
Также проверяется: если пользователь ввел текст похожий на числовое значение, тогда преобразовываем критерий поиска в числовые значения с помощью умножения его на число 1.
На следующей строке кода оператором Set создаем ссылку и в переменную diapaz1 присваиваем диапазон ячеек, который состоит из двух частей:
- адрес выделенного диапазона ячеек.
- адрес используемого диапазона рабочего листа Excel.
Внимание! Используемый диапазон рабочего листа получаем с помощью свойства UsedRange. Это адрес диапазона, который охватывает все ячейки с любыми значениями или измененные форматом на текущем рабочем листе Excel:
Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
Поэтому если предварительно не был выделен диапазон ячеек в области используемого диапазона рабочего листа Excel, тогда объект для переменной diapaz1 будет пустым (без ссылки). И дальнейшая работа макроса – не возможна. Поэтому следует проверить не является ли пустым объект в переменной diapaz1:
If diapaz1 Is Nothing Then ‘проверяем пустой ли объект Range в переменной diapaz1
Если перед выполнением макроса не был выделен диапазон в используемой области листа – объект пустой, тогда выводиться соответствующее сообщение с помощью функции:
MsgBox «Сначала выделите диапазон!»
И выполнение кода снова прерывается функцией Exit Sub. Если же пользователь сделал все верно, тогда дальше беспрепятственно выполняется следующая строка в коде макроса.
В следующей части VBA-макроса создан цикл, внутри которого по очереди все ячейки в диапазоне определенным переменной diapaz1 проверяются на наличие искомого значения:
For i = 1 To diapaz1.Count
If diapaz1(i) = znach Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1(i)
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next
Если диапазон переменной diapaz1 содержит ячейку с таким же значением, как и в переменной znach, тогда несмежный диапазон ячеек в переменной diapaz2 увеличивается на один адрес для включения этой ячейки. Таким образом несмежный диапазон в переменной diapaz2 включая в себя все адреса найденных ячеек. Реализовывается увеличение несмежного диапазона в переменной diapaz2 с помощью свойства Union, оно позволяет создавать несмежные диапазоны.
В конце макроса выполняется одно из двух условий: или выделяются все найденные ячейки, или же выводиться сообщение:
MsgBox «Не найдено исходное значение»
Макрос для пересчета выделенной области
Теперь вы самостоятельно можете модифицировать макрос. гибко настраивая его под самые привередливые потребности. Например, добавим новую возможность. Макрос будет сообщать нам о количестве найденных ячеек, соответствующих критерию поиска. Для этого в конце макроса после строки diapaz2.Select следует добавить новую строчку кода:
MsgBox «Найдено: » & diapaz2.Count & » ячеек!»
После выполнения макроса и выделения ним ячеек мы будем получать сообщение о их количестве:
Чтобы макрос умел работать с ключами поиска для многозначных значений (например, звездочка «*» – для всех символов), тогда следует изменить соответствующий оператор в коде. Перейдите на строку макроса №15 где указана инструкция для проверки соответствия значений просматриваемых ячеек в диапазоне со значением переменной znach. Затем измените оператор сравнение на оператор Like:
If diapaz1(i) Like znach Then
Теперь после такой модификации кода макроса в критерии поиска можно использовать ключ звездочку «*» (для всех символов). Например, если мы в поле ввода введем значение «н*» макрос будет учитывать все ячейки, значение которых начинается с символа буквы «н».
В Excel можно использовать только 2 ключа многозначного значения запроса в поиске:
- «*» – символ звездочки (любые другие символы).
- «?» – вопросительный знак (отдельный символ) например, так:
Если нужно сделать так, чтобы макрос не был чувствителен к регистру вводимых текстовых символов? Если макрос должен одинаково находит значения не зависимо большая или маленькая буква в критерии поиска и выдавать один и тот же результат? Тогда в строке №15 , где проверяется значение ячейки используйте функцию LCase следующим образом:
If LCase(diapaz1(i)) Like LCase(znach) Then
Задача функции LCase замена всех символов в тексте на нижний регистр (маленькие буквы):
Полная новая версия кода модифицированного макроса для выделения ячеек выглядит так:
Sub PoiskZnach()
Dim i As Long
Dim znach As Variant
Dim diapaz1 As Range
Dim diapaz2 As Range
znach = InputBox( «Введите исходное значение» )
If znach = «» Then Exit Sub
If IsNumeric(znach) Then znach = znach * 1
Set diapaz1 = Application.Intersect(Selection, ActiveSheet.UsedRange)
If diapaz1 Is Nothing Then
MsgBox «Сначала выделите диапазон!»
Exit Sub
Else
For i = 1 To diapaz1.Count
If LCase(diapaz1(i)) Like LCase(znach) Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1(i)
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1(i))
End If
End If
Next
End If
If diapaz2 Is Nothing Then
MsgBox «Не найдено исходное значение»
Else
diapaz2. Select
MsgBox «Найдено: » & diapaz2.Count & » ячеек!»
End If
End Sub
Изучая возможности языка программирования VBA, вы можете самостоятельно совершенствовать свой макрос подобным способом как приведено в данном примере.
Источник
Работа с диапазонами в VBA
Настоящая заметка продолжает знакомство с VBA, в ней описана работа с диапазонами в VBA.[1]
Рис. 1. Пример, демонстрирующий, как выделять диапазоны различной формы в VBA$ чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке
Скачать заметку в формате Word или pdf, примеры в архиве (политика безопасности провайдера не позволяет загружать файлы Excel с поддержкой макросов)
Копирование диапазона
Функция записи макросов 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. Использование окна ввода данных с целью приостановки выполнения макроса
Оператор On Error Resume Next игнорирует ошибку, если пользователь не выберет диапазон, а щелкает Отмена. В таком случае объектная переменная UserRange не получает значения. В этом случае отобразится окно сообщения с текстом «Отменено». Если же пользователь щелкнет на кнопке OK, то макрос продолжит выполняться. Строка On Error Go То указывает на переход к стандартной обработке ошибки. Проверка корректного выделения диапазона необязательна. Excel позаботится об этом вместо вас.
Обязательно проверьте, включено ли обновление экрана при использовании метода InputBox для выделения диапазона. Если обновление экрана отключено, вы не сможете выделить рабочий лист. Чтобы проконтролировать обновление экрана, в процессе выполнения макроса используйте свойство ScreenUpdating объекта Application.
Подсчет выделенных ячеек
Работая с макросом, который обрабатывает выделенный диапазон ячеек, можно использовать свойство Count, чтобы определить, сколько ячеек содержится в выделенном (или любом другом) диапазоне. Например, оператор MsgBox Selection.Count демонстрирует окно сообщения, которое отображает количество ячеек в текущем выделенном диапазоне. Свойство Count использует тип данных Long, поэтому наибольшее значение, которое может храниться в нем, равно 2 147 483 647. Если выделить лист целиком, то ячеек будет больше, и свойство Count сгенерирует ошибку. Используйте свойство CountLarge, которое не имеет таких ограничений.
Если активный лист содержит диапазон 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 ‘ Обработка ячеек с константами
If Not ConstantCells Is Nothing Then
For Each cell In ConstantCells
If cell.Value » Пустые строки удалены. »
End Sub
Первый шаг — определить последнюю используемую строку и присвоить этот номер строки переменной LastRow. Это не так просто, как можно ожидать, поскольку текущий диапазон необязательно начинается со строки 1. Следовательно, значение LastRow вычисляется таким образом: к найденному количеству строк используемого диапазона прибавляется номер первой строки текущего диапазона и вычитается 1.
В процедуре применена функция Excel СЧЁТЗ, определяющая, является ли строка пустой. Если данная функция для конкретной строки возвращает 0, то эта строка пустая. Обратите внимание, что процедура просматривает строки снизу вверх и использует отрицательное значение шага в цикле For-Next. Это необходимо, поскольку при удалении все последующие строки перемещаются «вверх» в рабочем листе. Если бы в цикле просмотр выполнялся сверху вниз, то значение счетчика цикла после удаления строки оказалось бы неправильным.
В макросе используется еще одна переменная, Counter, с помощью которой подсчитывается количество удаленных строк. Эта величина отображается в окне сообщения по завершении процедуры.
Дублирование строк
Пример, рассматриваемый в этом разделе, демонстрирует использование возможностей 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).
Источник
Доброе утро, люди добрые. Запутался совсем. Есть таблица-аналог (от оригинала отличается, но смысл тот же), в ней надо найти слова «яблоко» и выделить диапазон до конца таблицы , т.е. «F:I» (для дальнейшего наведения «красоты»). Без применения фильтра (в оригинале есть объеденённые ячейки…). Макрорекордером пробывал, и запнулся на том что не могу выделить диапазон. Выручите плз.! Прикрепленные файлы
Изменено: QwertyBoss — 30.01.2016 14:36:43 |
|
Z Пользователь Сообщений: 6111 Win 10, MSO 2013 SP1 |
?! «Ctrl+S» — достойное завершение ваших гениальных мыслей!.. |
Catboyun Пользователь Сообщений: 1631 |
#3 30.01.2016 08:38:31
как это должно выглядеть на данной таблице? |
||
Пробывал. Выделяет по одной, хотелось бы сразу все, что б с группой работать дальше, |
|
QwertyBoss Пользователь Сообщений: 347 |
#5 30.01.2016 08:43:45
ща покажу Прикрепленные файлы
|
||
Sanja Пользователь Сообщений: 14838 |
#6 30.01.2016 09:15:05
QwertyBoss, у Вас под сотню сообщений, а к рекомендациям правил не прислушиваетесь. Файл-пример желателен в той-же структуре и форматах что и оригинал. В VBA работа с объединенными ячейками отличается от обычных
Только не понятно зачем ВЫДЕЛЯТЬ диапазон? В VBA можно производить с диапазоном нужные действия (копировать, очищать, и т.п.) не выделяя его Прикрепленные файлы
Изменено: Sanja — 30.01.2016 09:38:20 Согласие есть продукт при полном непротивлении сторон. |
||||
QwertyBoss Пользователь Сообщений: 347 |
#7 30.01.2016 09:40:56
Ув. Sanja я бы и рад приложить пример-оригинал, но он более 100 кб. ..
изв. я ещё до этого наверное не дорос =) спс. огромное. Всё работает. Буду интегрировать в пример-оригинал… Изменено: QwertyBoss — 30.01.2016 09:49:54 |
||||
Sanja Пользователь Сообщений: 14838 |
Да зачем нам Ваш оригинал!? Почитайте правила внимательнее. Файл-пример в той-же СТРУКТУРЕ и ФОРМАТАХ. Замените гранаты/минометы на бананы/апельсины, оставьте из сотен тысяч строк пару-тройку десятков и уложитесь в рекомендуемый объем. Это нужно для уменьшения кол-ва уточняющих вопросов и проблем, типа «а в моем файле так не получается» Согласие есть продукт при полном непротивлении сторон. |
QwertyBoss Пользователь Сообщений: 347 |
#9 30.01.2016 09:52:09
Такого не будет. я в любом случае шлифовать до победного буду. А насчет гранат/бананов, я и так заменил =). Ищё раз спасибо! Внедрил. И работает как часы, даже с объеденнёными ячейками =). Спс. за решение… Изменено: QwertyBoss — 30.01.2016 10:07:06 |
||
greatsky Пользователь Сообщений: 73 |
Доброго времени суток, как выделить диапазон заполненных ячеек с С3 до последней заполненной в столбце D, через макрос, чтобы потом можно было форматировать |
Sanja Пользователь Сообщений: 14838 |
#11 08.08.2016 20:45:34 greatsky, зачем ВЫДЕЛЯТЬ? Применяйте нужное форматирование к нужному диапазону без предварительного выделения. Напрямую
Согласие есть продукт при полном непротивлении сторон. |
||
greatsky Пользователь Сообщений: 73 |
Sanja,хочу на указанный диапазон сразу запускать сводную таблицу, а сколько не просматривал форумов, не нашел сводную таблицу с пропуском пустых ячеек из определенного диапазона |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
greatsky, Вы уходите в сторону от своего же вопроса: причём тут пропуски пустых ячеек и построение сводной, если Вам изначально было нужно только отформатировать диапазон? |
greatsky Пользователь Сообщений: 73 |
Ну я как бы давал наводку. чтобы было инфы больше реально — есть таблица. она формируется макросом, шапка постоянна, внизу строки то 100 заполненных то 50 то 10, макросом нужен чтобы отсеивал пустые и выводил сводную таблицу — а если пустые сами знает что не получается |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
СВОДНАЯ тут причём? Спрашивали про форматирование — ответ получили. Нужно построить сводную с условиями — создаём новую тему. |
greatsky Пользователь Сообщений: 73 |
Ну я привык что за новые темы на форумах жестоко карают) |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
|
greatsky Пользователь Сообщений: 73 |
Главный вопрос стоял у меня как выделить диапазон, а форматирование написал в виде примера |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#19 08.08.2016 22:12:34 Ответ Вы получили. |
Капитан Экселя 5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
||||
1 |
||||
29.07.2015, 13:39. Показов 41636. Ответов 23 Метки нет (Все метки)
Я Вас уже, наверное, достал, но мне нужна Ваша помощь.
и подобие, но не пойму как указать начальную ячейку B4 и как указать поиск последней для столбца (вместо ActiveSheet.UsedRange.Columns.Count как указать номер столбца)?
0 |
Vlad999 3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
||||||||
29.07.2015, 14:05 |
2 |
|||||||
Решение
Добавлено через 6 минут
1 |
Капитан Экселя 5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
||||||
29.07.2015, 14:21 [ТС] |
3 |
|||||
Vlad999,
(начальная часть кода сортировки). Нужно в строке ActiveWorkbook.Worksheets(«Лист2»).Sort.SortFields .Add Key:=Range(«B4:B300») _ вместо Range(«B4:B300») _ прописать Range(«B4:последняя заполненная ячейка столбца B») _ . Прописываю как Вы сказали ( Вложения
0 |
Vlad999 3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
||||
29.07.2015, 14:41 |
4 |
|||
для сортировки в
Select не нужен.
0 |
5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
|
29.07.2015, 14:50 [ТС] |
5 |
Vlad999, Добавлено через 1 минуту
Код Visual BasicВыделить код Не сортирует так. Если указать конкретный столбец (Range(«B4:B300»)) — сортирует. а так — не хочет.
0 |
3827 / 2254 / 751 Регистрация: 02.11.2012 Сообщений: 5,930 |
|
29.07.2015, 15:10 |
6 |
приложите файл с кодом. Добавлено через 3 минуты
(начальная часть кода сортировки) в продолжении тоже должен встречаться такой же диапазон, его тоже нужно прописывать динамическим.
0 |
Капитан Экселя 5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
||||||||||
29.07.2015, 15:18 [ТС] |
7 |
|||||||||
Vlad999,
работает, а так:
нет. И как в приложенном файле в макросе выделить «зелёный» диапазон до последней заполненной в нём ячейки (как видите правее тоже есть столбцы с числами — их не трогаем)? Вложения
0 |
skol13 369 / 78 / 6 Регистрация: 23.05.2012 Сообщений: 232 |
||||
29.07.2015, 16:28 |
8 |
|||
А по первому вопросу? «1. В приложенном файле нужно в макросе прописать выделение только закрашенного зелёным диапазона. Но конечная строка диапазона меняется. Нужно, чтобы он находил последнюю заполненную ячейку (могут в последней строке не во всех столбцах, закрашенных зелёным (ну в диапазоне «зелёном») быть заполненные ячейки).? Ниже зеленого диапазона могут быть строки? Добавлено через 16 минут
Так работает, а так — нет. А вы запятую забыли поставить вот здесь перед переносом:
0 |
5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
|
29.07.2015, 16:36 [ТС] |
9 |
Ниже зеленого диапазона могут быть строки? Нет не могут. Но нижняя строка зелёного диапазона может сдвигаться.
вот так работает: Вау, спасибо. А у меня красным выделяло. Оказывается я Энтер лишний нажал.
0 |
skol13 369 / 78 / 6 Регистрация: 23.05.2012 Сообщений: 232 |
||||
29.07.2015, 16:51 |
10 |
|||
Нет не могут. Но нижняя строка зелёного диапазона может сдвигаться. Ну так используйте решение, которое вам камрад Vlad999, в первом ответе показал.
нужную цифру последнего столбца диапазона и вперед Добавлено через 3 минуты
Ставьте нужную цифру последнего столбца диапазона и вперед А, не, стоп…
0 |
5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
|
29.07.2015, 16:51 [ТС] |
11 |
skol13,
0 |
369 / 78 / 6 Регистрация: 23.05.2012 Сообщений: 232 |
|
29.07.2015, 16:52 |
12 |
Почему один столбец?
0 |
5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
|
29.07.2015, 16:52 [ТС] |
13 |
1 Так выделит только один столбец. Не? А как тогда выделить один столбец?
0 |
skol13 369 / 78 / 6 Регистрация: 23.05.2012 Сообщений: 232 |
||||
29.07.2015, 17:06 |
14 |
|||
Решение
Так выделит только один столбец. Не? А как тогда выделить один столбец? Один, да.
«5» — это номер последнего столбца для выделения. Меняя эту цифру можно выделить необходимое кол-во столбцов, от 1 до «сколько нужно» Добавлено через 6 минут
1 |
Капитан Экселя 5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
||||||
29.07.2015, 17:08 [ТС] |
15 |
|||||
В примере работает, а в оригинальном файле — нет. Вот файл и код (что написано в комментариях никому не говорить). Столбцы от B до E. Стиль ссылок у меня R1C1.
Вложения
0 |
15 / 15 / 5 Регистрация: 01.12.2014 Сообщений: 117 |
|
29.07.2015, 17:14 |
16 |
Я не особо вчитывался в тему, не смотрел ответы, и не качал пример.
приложите файл с кодом.
Вложения
0 |
5 / 5 / 1 Регистрация: 27.07.2015 Сообщений: 88 |
|
29.07.2015, 17:15 [ТС] |
17 |
Блин разобрался. Добавлено через 30 секунд Неа. Макрос у меня в Персонале лежит.
0 |
15 / 15 / 5 Регистрация: 01.12.2014 Сообщений: 117 |
|
29.07.2015, 17:19 |
18 |
Неа. Макрос у меня в Персонале лежит. Ваш язык мне не понятен, ради интереса — скачал, поставил, запустил. Всё сработало. Отсортировало по дате.
0 |
369 / 78 / 6 Регистрация: 23.05.2012 Сообщений: 232 |
|
29.07.2015, 17:19 |
19 |
что написано в комментариях никому не говорить Хорошо, никому не скажу
Но помоему это как-то связано. Не, не связано, но формат файла у ТС какой то странный, с двойным расширением. После xlsx идет обычный xls
Блин разобрался. Вопрос решен значит?
0 |
5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
|
29.07.2015, 17:20 |
20 |
Непонятны метания между листами «Лист1» и «Лист2».
0 |
Выделить диапазон с выделенной ячейки до последней заполнен. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Выделения относительно активной ячейки
Выделить вниз до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Down)
Sub CtrlShiftDown()
Range(ActiveCell, ActiveCell.End(xlDown)).Select
End Sub
Выделить вверх до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Up)
Sub CtrlShiftUp()
Range(ActiveCell, ActiveCell.End(xlUp)).Select
End Sub
Выделить вправо до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Right)
Sub CtrlShiftRight()
Range(ActiveCell, ActiveCell.End(xlToRight)).Select
End Sub
Выделить влево до первой или последней заполненной ячейки (равносильно нажатию Ctrl+Shift+Left)
Sub CtrlShiftLeft()
Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
End Sub
Выделить текущую область (выделяется диапазон неразрывно заполненных ячеек — равносильно нажатию кнопок Ctrl+Shift+*)
Sub CtrlShiftUmn()
ActiveCell.CurrentRegion.Select
End Sub
Выделить активную область (происходит выделение всего заполненного диапазона Ctrl+Shift+Home, End, Home)
Sub CtrlShiftHome()
Range(Range("A1"), ActiveCell.SpecialCells(xlLastCell)).Select
End Sub
Выделить смежные (заполненные прилегающие к активной ячейке) ячейки в столбце с активной ячейкой
Sub SelectActiveColumn()
Dim TopCell As Range
Dim BottomCell As Range
If IsEmpty(ActiveCell) Then Exit Sub
On Error Resume Next
If IsEmpty(ActiveCell.Offset(-1, 0)) Then Set TopCell = _
ActiveCell Else Set TopCell = ActiveCell.End(xlUp)
If IsEmpty(ActiveCell.Offset(1, 0)) Then Set BottomCell = _
ActiveCell Else Set BottomCell = ActiveCell.End(xlDown)
Range(TopCell, BottomCell).Select
End Sub
Выделить смежные ячейки в строке с активной ячейкой
Sub SelectActiveRow()
Dim LeftCell As Range
Dim RightCell As Range
If IsEmpty(ActiveCell) Then Exit Sub
On Error Resume Next
If IsEmpty(ActiveCell.Offset(0, -1)) Then Set LeftCell = _
ActiveCell Else Set LeftCell = ActiveCell.End(xlToLeft)
If IsEmpty(ActiveCell.Offset(0, 1)) Then Set RightCell = _
ActiveCell Else Set RightCell = ActiveCell.End(xlToRight)
Range(LeftCell, RightCell).Select
End Sub
Выделить весь активный столбец
Sub SelectionEntireColumn()
Selection.EntireColumn.Select
End Sub
Выделить всю активную строку
Sub SelectEntireRow()
Selection.EntireRow.Select
End Sub
Выделить рабочий лист
Sub SelectEntireSheet()
Cells.Select
End Sub
Выделить следующую пустую ячейку снизу
Sub CellNextDown()
ActiveCell.Offset(1, 0).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Выделить следующую пустую ячейку справа
Sub CellNextRight()
ActiveCell.Offset(0, 1).Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(0, 1).Select
Loop
End Sub
Выделение от первой непустой до последней непустой ячеек в строке
Sub SelectFirstToLastInRow()
Dim LeftCell As Range
Dim RightCell As Range
Set LeftCell = Cells(ActiveCell.Row, 1)
Set RightCell = Cells(ActiveCell.Row, 256)
If IsEmpty(LeftCell) Then Set LeftCell = LeftCell.End(xlToRight)
If IsEmpty(RightCell) Then Set RightCell = RightCell.End(xlToLeft)
If LeftCell.Column = 256 And RightCell.Column = 1 Then ActiveCell. _
Select Else Range(LeftCell, RightCell).Select
End Sub
Выделение от первой непустой до последней непустой ячеек в столбце
Sub SelectFirstToLastInColumn()
Dim TopCell As Range
Dim BottomCell As Range
Set TopCell = Cells(1, ActiveCell.Column)
Set BottomCell = Cells(16384, ActiveCell.Column)
If IsEmpty(TopCell) Then Set TopCell = TopCell.End(xlDown)
If IsEmpty(BottomCell) Then Set BottomCell = BottomCell.End(xlUp)
If TopCell.Row = 16384 And BottomCell.Row = 1 Then ActiveCell. _
Select Else Range(TopCell, BottomCell).Select
End Sub