Vba excel выделить до конца

Содержание

  1. Выбор диапазонов с помощью Visual Basic для приложений (примеры новичков)
  2. Аннотация
  3. Дополнительная информация
  4. Примеры выбора ячеек вручную
  5. Примеры использования кода Visual Basic для выбора ячеек в диапазоне
  6. Макрос для выборочного выделения ячеек на листе Excel
  7. Выделение несмежных диапазонов с помощью макроса
  8. Макрос для пересчета выделенной области
  9. Работа с диапазонами в VBA
  10. Копирование диапазона
  11. Запрос значения ячейки
  12. Ввод значения в следующую пустую ячейку
  13. Приостановка работы макроса для определения диапазона пользователем
  14. Подсчет выделенных ячеек
  15. Просмотр выделенного диапазона
  16. Дублирование строк
  17. Определение диапазона, находящегося в другом диапазоне
  18. Определение типа данных ячейки

Выбор диапазонов с помощью 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 переменные:

  1. i – счетчик цикла.
  2. znach – значение которое должна содержать ячейка.
  3. diapaz1 – адрес проверяемого диапазона.
  4. diapaz2 – адрес для несмежного диапазона, соответствующий критериям пользователя.

Внимание! Понятие несмежный диапазон ячеек подразумевает то, что этот диапазон состоит из нескольких отдельных областей ячеек. Выделение нескольких диапазонов ячеек можно реализовать вручную с нажатой клавишей CTRL на клавиатуре при выделении мышкой разных областей на листе.

После декларации переменных вызываем окно для ввода критериев поиска необходимого значения и передаем эти же критерии в переменную znach. Сразу в коде описываем инструкцию для проверки на пустые критерии. Если пользователь оставил поле ввода пустым или нажал на кнопку «Отмена», тогда работа макроса будет прервана остановкой с помощью вызова соответствующей инструкции:

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

На следующей строке кода оператором Set создаем ссылку и в переменную diapaz1 присваиваем диапазон ячеек, который состоит из двух частей:

  1. адрес выделенного диапазона ячеек.
  2. адрес используемого диапазона рабочего листа 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 ключа многозначного значения запроса в поиске:

  1. «*» – символ звездочки (любые другие символы).
  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» (для дальнейшего наведения «красоты»). Без применения фильтра (в оригинале есть объеденённые ячейки…). Макрорекордером пробывал, и запнулся на том что не могу выделить диапазон.   Выручите плз.!

Прикрепленные файлы

  • Книга1.xlsx (10.16 КБ)

Изменено: QwertyBoss30.01.2016 14:36:43

 

Z

Пользователь

Сообщений: 6111
Регистрация: 21.12.2012

Win 10, MSO 2013 SP1

?!
Ctrl+F — яблоко — Enter — Esc — CTRL+Shift+End — это не вариант?.. ;)

«Ctrl+S» — достойное завершение ваших гениальных мыслей!.. ;)

 

Catboyun

Пользователь

Сообщений: 1631
Регистрация: 09.05.2015

#3

30.01.2016 08:38:31

Цитата
QwertyBoss написал:до конца таблицы

как это должно выглядеть на данной таблице?
F8:I11 и т.д. или F8:I36

 

Пробывал. Выделяет по одной, хотелось бы сразу все, что б с  группой работать дальше,  

 

QwertyBoss

Пользователь

Сообщений: 347
Регистрация: 21.10.2015

#5

30.01.2016 08:43:45

Цитата
Catboyun написал:
как это должно выглядеть на данной таблице?
F8:I11 и т.д. или F8:I36

ща покажу

Прикрепленные файлы

  • Книга1.xlsx (10.64 КБ)

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#6

30.01.2016 09:15:05

Цитата
QwertyBoss написал:от оригинала отличается, но смысл тот же….в оригинале есть объеденённые ячейки…

QwertyBoss,  у Вас под сотню сообщений, а к рекомендациям правил не прислушиваетесь. Файл-пример желателен в той-же структуре и форматах что и оригинал. В VBA работа с объединенными ячейками отличается от обычных
Вариант для данного примера

Код
Sub Apple()
Dim cl As Range
Dim rngApple As Range
On Error Resume Next
With Worksheets("Лист1")
    lRow = .Cells(.Rows.Count, "F").End(xlUp).Row
    For Each cl In .Range("F8:F" & lRow).Cells
        If cl.Value = "Яблоко" Then
            If Not rngApple Is Nothing Then
                Set rngApple = Union(rngApple, Range(cl, cl.Offset(, 3)))
            Else
                Set rngApple = Range(cl, cl.Offset(, 3))
            End If
        End If
    Next
rngApple.Select
End With
End Sub

Только не понятно зачем ВЫДЕЛЯТЬ диапазон? В VBA можно производить с диапазоном нужные действия (копировать, очищать, и т.п.) не выделяя его

Прикрепленные файлы

  • Apple.xlsm (18.88 КБ)

Изменено: Sanja30.01.2016 09:38:20

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

 

QwertyBoss

Пользователь

Сообщений: 347
Регистрация: 21.10.2015

#7

30.01.2016 09:40:56

Цитата
Sanja написал:
Файл-пример желателен в той-же структуре и форматах что и оригинал.

Ув.

Sanja

я бы и рад приложить пример-оригинал, но он более 100 кб. ..

Цитата
Sanja написал:
Только не понятно зачем ВЫДЕЛЯТЬ диапазон? В VBA можно производить с диапазоном нужные действия (копировать, очищать, и т.п.) не выделяя его

изв. я ещё до этого наверное не дорос =)

спс. огромное. Всё работает. Буду интегрировать в пример-оригинал…

Изменено: QwertyBoss30.01.2016 09:49:54

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Да зачем нам Ваш оригинал!? Почитайте правила внимательнее. Файл-пример в той-же СТРУКТУРЕ и ФОРМАТАХ. Замените гранаты/минометы на бананы/апельсины, оставьте из сотен тысяч строк пару-тройку десятков и уложитесь в рекомендуемый объем. Это нужно для уменьшения кол-ва уточняющих вопросов и проблем, типа «а в моем файле так не получается»

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

 

QwertyBoss

Пользователь

Сообщений: 347
Регистрация: 21.10.2015

#9

30.01.2016 09:52:09

Цитата
Sanja написал:
типа «а в моем файле так не получается»

Такого не будет. я в любом случае шлифовать до победного буду. А насчет гранат/бананов, я и так заменил =). Ищё раз спасибо!

Внедрил. И работает как часы, даже с объеденнёными ячейками =). Спс. за решение…

Изменено: QwertyBoss30.01.2016 10:07:06

 

greatsky

Пользователь

Сообщений: 73
Регистрация: 04.08.2016

Доброго времени суток, как выделить диапазон заполненных ячеек с С3 до последней заполненной в столбце D, через макрос, чтобы потом можно было форматировать  

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#11

08.08.2016 20:45:34

greatsky, зачем ВЫДЕЛЯТЬ? Применяйте нужное форматирование к нужному диапазону без предварительного выделения. Напрямую
Например

Код
With ActiveSheet
    .Range("C3:D" & .Cells(.Rows.Count, 4).End(xlUp).Row).NumberFormat = "m/d/yyyy"
End With

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

 

greatsky

Пользователь

Сообщений: 73
Регистрация: 04.08.2016

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

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

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

 

greatsky

Пользователь

Сообщений: 73
Регистрация: 04.08.2016

Ну я как бы давал наводку. чтобы было инфы больше реально — есть таблица. она формируется макросом, шапка постоянна, внизу строки то 100 заполненных то 50 то 10, макросом нужен чтобы отсеивал пустые и выводил сводную таблицу — а если пустые сами знает что не получается  

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

СВОДНАЯ тут причём? Спрашивали про форматирование — ответ получили. Нужно построить сводную с условиями — создаём  новую тему.

 

greatsky

Пользователь

Сообщений: 73
Регистрация: 04.08.2016

Ну я привык что за новые темы на форумах жестоко карают)  

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

greatsky

Пользователь

Сообщений: 73
Регистрация: 04.08.2016

Главный вопрос стоял у меня как выделить диапазон, а форматирование написал в виде примера  

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#19

08.08.2016 22:12:34

Ответ Вы получили.

Капитан Экселя

5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

1

29.07.2015, 13:39. Показов 41636. Ответов 23

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Я Вас уже, наверное, достал, но мне нужна Ваша помощь.
В общем мне нужно в макросе прописать выделение диапазона ячеек, начиная с B4 и кончая последней заполненной. Напишите, пожалуйста, как это будет выглядеть для столбца и как для диапазона столбцов и строк.
Поиском нашёл такое:

Visual Basic
1
Range(Selection, Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)).Select

и подобие, но не пойму как указать начальную ячейку B4 и как указать поиск последней для столбца (вместо ActiveSheet.UsedRange.Columns.Count как указать номер столбца)?



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

29.07.2015, 14:05

2

Лучший ответ Сообщение было отмечено Капитан Экселя как решение

Решение

Visual Basic
1
Range("B4",Cells(Rows.Count,2).End(xlUp)).Select

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

Visual Basic
1
ActiveSheet.Range("B4").CurrentRegion.Select



1



Капитан Экселя

5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 14:21

 [ТС]

3

Vlad999,
Видимо не совсем корректно поставил задачу.
1. В приложенном файле нужно в макросе прописать выделение только закрашенного зелёным диапазона. Но конечная строка диапазона меняется. Нужно, чтобы он находил последнюю заполненную ячейку (могут в последней строке не во всех столбцах, закрашенных зелёным (ну в диапазоне «зелёном») быть заполненные ячейки).
2. Далее в коде делаю сортировку:

Visual Basic
1
2
3
4
ActiveWorkbook.Worksheets("Лист2").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист2").Sort.SortFields.Add Key:=Range("B4:B300") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortTextAsNumbers

(начальная часть кода сортировки). Нужно в строке ActiveWorkbook.Worksheets(«Лист2»).Sort.SortFields .Add Key:=Range(«B4:B300») _ вместо Range(«B4:B300») _ прописать Range(«B4:последняя заполненная ячейка столбца B») _ . Прописываю как Вы сказали (
Range(«B4»,Cells(Rows.Count,2).End(xlUp)).Select), но почему-то не сортирует. Но если укажу конкретно Range(«B4:B300») — всё нормально сортирует.

Вложения

Тип файла: xlsx Выделение ячеек.xlsx (9.3 Кб, 51 просмотров)



0



Vlad999

3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

29.07.2015, 14:41

4

для сортировки в

Visual Basic
1
Range("B4",Cells(Rows.Count,2).End(xlUp)).Select)

Select не нужен.



0



5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 14:50

 [ТС]

5

Vlad999,
А по первому вопросу? «1. В приложенном файле нужно в макросе прописать выделение только закрашенного зелёным диапазона. Но конечная строка диапазона меняется. Нужно, чтобы он находил последнюю заполненную ячейку (могут в последней строке не во всех столбцах, закрашенных зелёным (ну в диапазоне «зелёном») быть заполненные ячейки).?

Добавлено через 1 минуту

Цитата
Сообщение от Vlad999
Посмотреть сообщение

Код Visual BasicВыделить код
1
Range(«B4»,Cells(Rows.Count,2).End(xlUp)).Select)

Не сортирует так. Если указать конкретный столбец (Range(«B4:B300»)) — сортирует. а так — не хочет.



0



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

29.07.2015, 15:10

6

приложите файл с кодом.
П.С. напоминаю в xlsx макросы не жевут.

Добавлено через 3 минуты

Цитата
Сообщение от Капитан Экселя
Посмотреть сообщение

(начальная часть кода сортировки)

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



0



Капитан Экселя

5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 15:18

 [ТС]

7

Vlad999,
В приложенном файле (диапазон выделен зелёным).
Так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Макрос18()
'
' Макрос18 Макрос
'
 
'
    Range ("B4:E91").Select
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("C4:C91"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Лист1").Sort
        .SetRange Range("B3:E91")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

работает, а так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Макрос18()
'
' Макрос18 Макрос
'
 
'
    Range ("B4:E91").Select
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("C4", Cells(Rows.Count, 3).End(xlUp)) _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Лист1").Sort
        .SetRange Range("B3:E91")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

нет. И как в приложенном файле в макросе выделить «зелёный» диапазон до последней заполненной в нём ячейки (как видите правее тоже есть столбцы с числами — их не трогаем)?

Вложения

Тип файла: xlsx Выделение ячеек.xlsx (11.7 Кб, 18 просмотров)



0



skol13

369 / 78 / 6

Регистрация: 23.05.2012

Сообщений: 232

29.07.2015, 16:28

8

Цитата
Сообщение от Капитан Экселя
Посмотреть сообщение

А по первому вопросу? «1. В приложенном файле нужно в макросе прописать выделение только закрашенного зелёным диапазона. Но конечная строка диапазона меняется. Нужно, чтобы он находил последнюю заполненную ячейку (могут в последней строке не во всех столбцах, закрашенных зелёным (ну в диапазоне «зелёном») быть заполненные ячейки).?

Ниже зеленого диапазона могут быть строки?

Добавлено через 16 минут

Цитата
Сообщение от Капитан Экселя
Посмотреть сообщение

Так работает, а так — нет.

А вы запятую забыли поставить вот здесь перед переносом:
вот так работает:

Visual Basic
1
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("C4", Cells(Rows.Count, 3).End(xlUp)), _



0



5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 16:36

 [ТС]

9

Цитата
Сообщение от skol13
Посмотреть сообщение

Ниже зеленого диапазона могут быть строки?

Нет не могут. Но нижняя строка зелёного диапазона может сдвигаться.

Цитата
Сообщение от skol13
Посмотреть сообщение

вот так работает:

Вау, спасибо. А у меня красным выделяло. Оказывается я Энтер лишний нажал.



0



skol13

369 / 78 / 6

Регистрация: 23.05.2012

Сообщений: 232

29.07.2015, 16:51

10

Цитата
Сообщение от Капитан Экселя
Посмотреть сообщение

Нет не могут. Но нижняя строка зелёного диапазона может сдвигаться.

Ну так используйте решение, которое вам камрад Vlad999, в первом ответе показал.
Тем более, если количество столбцов в «зеленом диапазоне» не изменяется и оно известно.
Ставьте в

Visual Basic
1
Range("B4",Cells(Rows.Count,2).End(xlUp)).Select

нужную цифру последнего столбца диапазона и вперед

Добавлено через 3 минуты

Цитата
Сообщение от skol13
Посмотреть сообщение

Ставьте нужную цифру последнего столбца диапазона и вперед

А, не, стоп…
Столбец с комментариями не заполнен — выделяет фигню какую то



0



5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 16:51

 [ТС]

11

skol13,
Так а чем тогда этот код будет отличаться, если мой диапазон — 1 столбец?



0



369 / 78 / 6

Регистрация: 23.05.2012

Сообщений: 232

29.07.2015, 16:52

12

Почему один столбец?
Там вроде зеленым столбцов 5 закрашено…



0



5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 16:52

 [ТС]

13

Цитата
Сообщение от skol13
Посмотреть сообщение

1
Range(«B4»,Cells(Rows.Count,2).End(xlUp)).Select

Так выделит только один столбец. Не? А как тогда выделить один столбец?
У меня в оригинальном файле нет заливки цветом. Это я в примере подсветил для наглядности.



0



skol13

369 / 78 / 6

Регистрация: 23.05.2012

Сообщений: 232

29.07.2015, 17:06

14

Лучший ответ Сообщение было отмечено Капитан Экселя как решение

Решение

Цитата
Сообщение от Капитан Экселя
Посмотреть сообщение

Так выделит только один столбец. Не? А как тогда выделить один столбец?

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

Visual Basic
1
    Range("B4", Cells(ActiveCell.SpecialCells(xlLastCell).Row, 5)).Select

«5» — это номер последнего столбца для выделения. Меняя эту цифру можно выделить необходимое кол-во столбцов, от 1 до «сколько нужно»
Если «сколько нужно» — понятие переменное — тут надо смотреть уже дальше

Добавлено через 6 минут
И в личку можно не дублировать сообщения
Оповещение работает нормально



1



Капитан Экселя

5 / 5 / 1

Регистрация: 27.07.2015

Сообщений: 88

29.07.2015, 17:08

 [ТС]

15

В примере работает, а в оригинальном файле — нет. Вот файл и код (что написано в комментариях никому не говорить). Столбцы от B до E. Стиль ссылок у меня R1C1.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Макрос12()
'
' Макрос12 Макрос
'
 
'
    Range("B4", Cells(ActiveCell.SpecialCells(xlLastCell).Row, 5)).Select
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("C4", Cells(Rows.Count, 3).End(xlUp)), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Лист2").Sort
        .SetRange Range("B3:E554")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Вложения

Тип файла: xlsx Сравнение ПЕРЕМЕЩЕНИЙ.xlsx (37.5 Кб, 36 просмотров)



0



15 / 15 / 5

Регистрация: 01.12.2014

Сообщений: 117

29.07.2015, 17:14

16

Я не особо вчитывался в тему, не смотрел ответы, и не качал пример.
Но помоему это как-то связано.

Цитата
Сообщение от Vlad999
Посмотреть сообщение

приложите файл с кодом.
П.С. напоминаю в xlsx макросы не жевут.

Цитата
Сообщение от Капитан Экселя
Посмотреть сообщение

Вложения
Сравнение ПЕРЕМЕЩЕНИЙ.xlsx (37.5 Кб, 0 просмотров)



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».
Зачем работаем с «Лист2» , ведь он пустой?



0



Выделить диапазон с выделенной ячейки до последней заполнен.

Nikolay28

Дата: Четверг, 22.01.2015, 14:23 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Добрый день.

Подскажите, пожалуйста, код чтобы выделялся диапазон с текущей ячейки до последней заполненной в колонках и столбцах.

И если можно тут же еще вопрос, как этот макрос добавить в контекстное меню потом?

Спасибо.

 

Ответить

DJ_Marker_MC

Дата: Четверг, 22.01.2015, 14:26 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 991


Репутация:

213

±

Замечаний:
0% ±


Excel 2019

Добрый день.
[vba]

Код

ActiveSheet.UsedRange.Select

[/vba]

 

Ответить

Pelena

Дата: Четверг, 22.01.2015, 14:29 |
Сообщение № 3

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

А горячие клавиши не подойдут? Ctrl+Shift+End


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Nikolay28

Дата: Четверг, 22.01.2015, 14:46 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

нет, cntr+shift+end выбирают диапазон и пустых ячеек, но которые были редактированы.

 

Ответить

Nikolay28

Дата: Четверг, 22.01.2015, 14:48 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

по поводу этого «ActiveSheet.UsedRange.Select»
Мне нужно выделять диапазон с выбранной мною ячейки, далее нажимать макрос, чтобы он уже от этой ячейки выбирал все, именно, заполненные ячейки. Вот как-то так!

 

Ответить

Rioran

Дата: Четверг, 22.01.2015, 14:49 |
Сообщение № 6

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

Замечаний:
0% ±


Excel 2013

Nikolay28, здравствуйте!

Попробуйте так, где Selection — уже выделенная Вами ячейка.

[vba]

Код

Range(Selection, Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)).Select

[/vba]
Этот механизм надёжен до тех пор, пока Вы ничего не пишете «для заметок» за пределами таблицы. Совсем идеальный вариант — первый цикл проходит по строке заголовков до первой пустой ячейки, второй цикл перебирает найденные столбцы и в каждом ищет последнюю заполненную ячейку с помощью прыжка. Каждые числа столбцов сравниваются и выбирается максимальное. Так точно можно быть застрахованным от строк с частично отсутствующими данными и от особенности UsedRange, который будет выделять даже те диапазоны, которые были очищены от значений «вручную».


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279

Сообщение отредактировал RioranЧетверг, 22.01.2015, 14:53

 

Ответить

Nikolay28

Дата: Четверг, 22.01.2015, 14:53 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Rioran, спасибо! То что надо!)

 

Ответить

Выделения относительно активной ячейки

Выделить вниз до первой или последней заполненной ячейки (равносильно нажатию 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

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