Как выделять строки макросом excel

Координатное выделение

У вас большой монитор, но таблицы, с которыми вы работаете — еще больше. И, пробегая взглядом по экрану в поисках нужной информации, всегда есть шанс «соскользнуть» взглядом на соседнюю строчку и посмотреть не туда. Я даже знаю людей, который для таких случаев постоянно держат недалеко от себя деревянную линейку, чтобы приложить ее к строке на мониторе. Технологии будущего! 

А если при движении активной ячейки по листу будет подсвечиваться текущая строка и столбец? Своего рода координатное выделение примерно такого вида:

coord_selection1.gif

Поудобнее, чем линейка, правда?

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

Способ 1. Очевидный. Макрос, выделяющий текущую строку и столбец

Самый очевидный путь для решения нашей проблемы «в лоб» — нам нужен макрос, который будет отслеживать изменение выделения на листе и выделять целую строку и столбец для текущей ячейки. Также желательно иметь возможность при необходимости включать и отключать эту функцию, чтобы такое крестообразное выделение не мешало нам вводить, например, формулы, а работало только тогда, когда мы просматриваем список в поисках нужной информации. Это приводит нас к трем макросам (выделения, включения и выключения), которые нужно будет добавить в модуль листа.

Откройте лист со таблицей, в которой хотите получить такое координатное выделение. Щелкните правой кнопкой мыши по ярлычку листа и выберите в контекстном меню команду Исходный текст (Source Code). Должно открыться окно редактора Visual Basic. Скопируйте в него этот текст этих трех макросов:

Dim Coord_Selection As Boolean   'глобальная переменная для вкл/выкл выделения

Sub Selection_On()   'макрос включения выделения
    Coord_Selection = True
End Sub

Sub Selection_Off()  'макрос выключения выделения
    Coord_Selection = False
End Sub

'основная процедура, выполняющая выделение
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim WorkRange As Range

    If Target.Cells.Count > 1 Then Exit Sub  'если выделено больше 1 ячейки - выходим
    If Coord_Selection = False Then Exit Sub    'если выделение выключено - выходим

    Application.ScreenUpdating = False
    Set WorkRange = Range("A6:N300")    'адрес рабочего диапазона, в пределах которого видно выделение
    Intersect(WorkRange, Union(Target.EntireColumn, Target.EntireRow)).Select   'формируем крестообразный диапазон и выделяем
    Target.Activate   
End Sub

Измените адрес рабочего диапазона на свой — именно в пределах этого диапазона и будет работать наше выделение. Затем закройте редактор Visual Basic и вернитесь в Excel.

Нажмите сочетание клавиш ALT+F8, чтобы открыть окно со списком доступных макросов. Макрос Selection_On, как нетрудно догадаться, включает координатное выделение на текущем листе, а макрос Selection_Off — выключает его. В этом же окне, нажав кнопку Параметры (Options) можно назначить этим макросам сочетания клавиш для удобного запуска.

Плюсы этого способа:

  • относительная простота реализации
  • выделение — операция безобидная и никак не изменяет содержимое или форматирование ячеек листа, все остается как есть

Минусы этого способа:

  • такое выделение некорректно работает в том случае, если на листе есть объединенные ячейки — выделяются сразу все строки и столбцы, входящие в объединение
  • если случайно нажать клавишу Delete, то очистится не только активная ячейка, а вся выделенная область, т.е. удалятся данные из всей строки и столбца

Способ 2. Оригинальный. Функция ЯЧЕЙКА + Условное форматирование

Этот способ хотя и имеет пару недостатков, мне представляется весьма изящным. Реализовать что-либо, используя только встроенные средства Excel, минимально влезая в программирование на VBA — высший пилотаж ;)

Способ основан на использовании функции ЯЧЕЙКА (CELL), которая может выдавать массу различной информации по заданной ячейке — высоту, ширину, номер строки-столбца, числовой формат и т.д.. Эта функция имеет два аргумента:

  • кодовое слово для параметра, например «столбец» или «строка»
  • адрес ячейки, для которой мы хотим определить значение этого параметра

Хитрость в том, что второй аргумент не является обязательным. Если он не указан, то берется текущая активная ячейка.

Вторая составляющая этого способа — условное форматирование. Эта крайне полезная функция Excel позволяет автоматически форматировать ячейки, если они удовлетворяют заданным условиям. Если соединить эти две идеи в одно целое, то получим следующий алгоритм реализации нашего координатного выделения через условное форматирование:

  1. Выделяем нашу таблицу, т.е. те ячейки, в которых в будущем должно отображаться координатное выделение.
  2. В Excel 2003 и более старших версиях открываем меню Формат — Условное форматирование — Формула (Format — Conditional Formatting — Formula). В Excel 2007 и новее — жмем на вкладке Главная (Home) кнопку Условное форматирование — Создать правило (Conditional Formatting — Create Rule) и выбираем тип правила Использовать формулу для определения форматируемых ячеек (Use formula)
  3. Вводим формулу для нашего координатного выделения:

    =ИЛИ(ЯЧЕЙКА(«строка»)=СТРОКА(A2);ЯЧЕЙКА(«столбец»)=СТОЛБЕЦ(A2))

    =OR(CELL(«row»)=ROW(A1),CELL(«column»)=COLUMN(A1))
    coord_selection2.gif
    Эта формула проверяет, не совпадает ли номер столбца каждой ячейки в таблице с номером столбца текущей ячейки. Аналогично со столбцами. Таким образом закрашенными окажутся только те ячейки, у которых либо номер столбца, либо номер строки совпадает с текущей ячейкой. А это и есть крестообразное координатное выделение, которого мы хотим добиться.

  4. Нажмите кнопку Формат (Format) и задайте цвет заливки.

Все почти готово, но остался один нюанс. Дело в том, что Excel не считает изменение выделения изменением данных на листе. И, как следствие, не запускает пересчет формул и перекраску условного форматирования только при изменении положения активной ячейки. Поэтому добавим в модуль листа простой макрос, который будет это делать. Щелкните правой кнопкой мыши по ярлычку листа и выберите в контекстном меню команду Исходный текст (Source Code). Должно открыться окно редактора Visual Basic. Скопируйте в него этот текст этого простого макроса:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveCell.Calculate
End Sub

Теперь при изменении выделения будет запускаться процесс пересчета формулы с функцией ЯЧЕЙКА в условном форматировании и заливаться текущая строка и столбец.

Плюсы этого способа:

  • Условное форматирование не нарушает пользовательское форматирование таблицы
  • Этот вариант выделения корректно работает с объединенными ячейками.
  • Нет риска удалить целую строку и столбец с данными при случайном нажатии Delete.
  • Макросы используются минимально

Минусы этого способа:

  • Формулу для условного форматирования надо вводить вручную.
  • Нет быстрого способа включить-выключить такое форматирование — оно включено всегда, пока не будет удалено правило.

Способ 3. Оптимальный. Условное форматирование + макросы

Золотая середина. Используем механизм отслеживания выделения на листе при помощи макросов из способа-1 и добавим к нему безопасное выделение цветом с помощью условного форматирования из способа-2.

Откройте лист со таблицей, в которой хотите получить такое координатное выделение. Щелкните правой кнопкой мыши по ярлычку листа и выберите в контекстном меню команду Исходный текст (Source Code). Должно открыться окно редактора Visual Basic. Скопируйте в него этот текст этих трех макросов:

Dim Coord_Selection As Boolean

Sub Selection_On()
    Coord_Selection = True
End Sub

Sub Selection_Off()
    Coord_Selection = False
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim WorkRange As Range, CrossRange As Range
    Set WorkRange = Range("A7:N300")    'адрес рабочего диапазона с таблицей
    If Target.Count > 1 Then Exit Sub
    If Coord_Selection = False Then
        WorkRange.FormatConditions.Delete
        Exit Sub
    End If
    Application.ScreenUpdating = False
    If Not Intersect(Target, WorkRange) Is Nothing Then
        Set CrossRange = Intersect(WorkRange, Union(Target.EntireRow, Target.EntireColumn))
        WorkRange.FormatConditions.Delete
        CrossRange.FormatConditions.Add Type:=xlExpression, Formula1:="=1"
        CrossRange.FormatConditions(1).Interior.ColorIndex = 33
        Target.FormatConditions.Delete
    End If
End Sub

Не забудьте изменить адрес рабочего диапазона на адрес своей таблицы. Закройте редактор Visual Basic и вернитесь в Excel. Чтобы использовать добавленные макросы, нажмите сочетание клавиш ALT+F8  и действуйте аналогично способу 1. 

Способ 4. Красивый. Надстройка FollowCellPointer

Excel MVP Jan Karel Pieterse родом из Нидерландов раздает у себя на сайте бесплатную надстройку FollowCellPointer(36Кб), которая решает ту же задачу, отрисовывая с помощью макросов графические линии-стрелки для подсветки текущей строки и столбца:

coord_selection3.gif

Красивое решение. Не без глюков местами, но попробовать точно стоит. Качаем архив, распаковываем на диск и устанавливаем надстройку:

  • в Excel 2003 и старше — через меню Сервис — Надстройки — Обзор (Tools — Add-Ins — Browse)
  • в Excel 2007 и новее — через Файл — Параметры — Надстройки — Перейти — Обзор (File — Excel Options — Add-Ins — Go to — Browse)

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

  • Что такое макросы, куда вставлять код макроса на Visual Basic

This macro will highlight the row and column of the active cell. This will fill the row of the active cell with a solid background color and remove the color when a different cell is selected within the excel spreadsheet. Anytime you select a different cell, the new column and row will be highlighted. This is a great macro for zeroing in on a specific cell during a presentation or just when working in a really big spreadsheet. Also, if you remove the gridlines from the spreadsheet, it can be hard to determine which row or column a cell is in and this will allow you to figure that out much quicker.

This macro will overwrite any previous color in the selected cell and row. That means that if you have a worksheet with a lot of background colors and you use this macro and start selecting cells, the previous background colors will disappear.

To change the color of the highlight change the number in this line of code .ColorIndex = 6.

Where to install the macro:  Worksheet

Highlight the Row of the Selected Cell

Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Static rr

If rr <> "" Then
 With Rows(rr).Interior
  .ColorIndex = xlNone
 End With
End If r = Selection.Row
rr = r With Rows(r).Interior
 .ColorIndex = 6
 .Pattern = xlSolid
End With End Sub


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Make a UserForm in Excel

Tutorial: Let’s create a working UserForm in Excel.
This is a step-by-step tutorial that shows you e…

Excel VBA MsgBox — Message Box Macro

Tutorial: Create a pop-up message box in Excel using VBA Macros. This allows you to show a message t…

Pass Arguments to a Macro Called from a Button or Sheet in Excel

Tutorial: How to pass arguments and values to macros called from worksheets, buttons, and anything e…

Select Ranges in the Worksheet from a UserForm

Tutorial: Select a range in Excel from a UserForm and have that range input into the form so that yo…

NPER Function — Calculate Number of Periods Needed for a Set of Payments in Excel

Tutorial: How to calculate the number of periods required for an investment in order to get the desi…

Count the Occurrences of the Largest or Smallest Value in a Range

Tutorial:
How to count the occurrence of the largest or smallest value in a range; basically, how m…

How to Install the Macro

  1. Select and copy the text from within the grey box above.
  2. Open the Microsoft Excel file in which you would like the Macro to function.
  3. Press «Alt + F11» — This will open the Visual Basic Editor — Works for all Excel Versions.
     Or For other ways to get there, Click Here.
  4. On the new window that opens up, go to the left side where the vertical pane is located. Locate your Excel file; it will be called VBAProject (YOUR FILE’S NAME HERE) and click this.
  5. If the Macro goes in a Module, Click Here, otherwise continue to Step 8.
  6. If the Macro goes in the Workbook or ThisWorkbook, Click Here, otherwise continue to Step 8.
  7. If the Macro goes in the Worksheet Code, Click Here, otherwise continue to Step 8.
  8. Close the Microsoft Visual Basic Editor window and save the Excel file. When you close the Visual Basic Editor window, the regular Excel window will not close.
  9. You are now ready to run the macro.

Similar Content

Make a UserForm in Excel

Tutorial: Let’s create a working UserForm in Excel.
This is a step-by-step tutorial that shows you e…

Excel VBA MsgBox — Message Box Macro

Tutorial: Create a pop-up message box in Excel using VBA Macros. This allows you to show a message t…

Pass Arguments to a Macro Called from a Button or Sheet in Excel

Tutorial: How to pass arguments and values to macros called from worksheets, buttons, and anything e…

Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons

50+ Hours of Video

200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course


You can use the following methods in VBA to highlight rows:

Method 1: Highlight Active Row

Sub HighlightActiveRow()
ActiveCell.EntireRow.Interior.Color = vbYellow
End Sub

This particular macro will highlight the currently active row.

Method 2: Highlight Specific Row

Sub HighlightSpecificRow()
Rows("4:4").Interior.Color = vbYellow
End Sub

This particular macro will highlight row 4 in the current sheet.

Method 3: Highlight Several Specific Rows

Sub HighlightSpecificRows()
Range("2:2,4:4,6:6,8:8").Interior.Color = vbYellow
End Sub

This particular macro will highlight rows 2, 4, 6, and 8 in the current sheet.

Note: To highlight all rows between 2 and 8, you can type Range(“2:8”) instead.

The following examples show how to use each method in practice.

Example 1: Highlight Active Row

Suppose we currently have cell B3 selected.

We can create the following macro to highlight each cell in the currently active row

Sub HighlightActiveRow()
ActiveCell.EntireRow.Interior.Color = vbYellow
End Sub

When we run this macro, we receive the following output:

Notice that each cell in row three is highlighted and all other rows are simply left untouched.

Example 2: Highlight Specific Row

Suppose we would like to highlight row four only.

We can create the following macro to do so:

Sub HighlightSpecificRow()
Rows("4:4").Interior.Color = vbYellow
End Sub

When we run this macro, we receive the following output:

Notice that each cell in row four is highlighted and all other rows are simply left untouched.

Example 3: Highlight Several Specific Rows

Suppose we would like to highlight rows 2, 4, 6, and 8 in the current sheet.

We can create the following macro to do so:

Sub HighlightSpecificRows()
Range("2:2,4:4,6:6,8:8").Interior.Color = vbYellow
End Sub

When we run this macro, we receive the following output:

VBA highlight several specific rows

Notice that rows 2, 4, 6, and 8 are all highlighted and all other rows are left untouched.

Note: In each example we chose to use yellow (vbYellow) as the highlight color, but you can choose a different color such as vbRed, vbGreen, vbBlue, etc.

Additional Resources

The following tutorials explain how to perform other common tasks in VBA:

VBA: How to Highlight Cells
VBA: How to Apply Conditional Formatting to Cells
VBA: How to Apply Conditional Formatting to Duplicate Values

Исходные коды макросов для выделения, удаления, скрытия и добавления пустых строк в таблицу Excel по условию пользователя.

Как выделить все пустые строки макросом

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

Таблица бюджета.

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

Откройте редактор Visual Basic (ALT+F11):

редактор Visual Basic.

И воздайте в нем новый модуль для текущей книги «Insert»-«Module», а потом запишите в него следующий VBA-код макроса:

Sub SelectLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.Select
End If
End Sub

VBA-код макроса.

Теперь если нам нужно автоматически выделить все пустые строки в таблице бюджета перед тем как их удалить, выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«SelectLine»-«Выполнить». В результате выделяться все пустые ячейки только для пустых строк внутри исходной таблицы.

Пример работы первого VBA-кода:

Выделить пустые строки.

Пустые строки, которые находиться под последними заполненными ячейками не будут выделены. Теперь для удаления выделенных строк пользователю осталось только выбрать инструмент: «ГЛАВНАЯ»-«Ячейки»-«Удалить»-«Удалить строки с листа». Или нажать комбинацию горячих клавиш CTRL+=. А после в появившемся окне «Удаление ячеек» выбрать опцию «строку» и нажать ОК.

Вначале кода присваиваем для переменной diapaz1 диапазон ячеек в границах между A1 и последней используемой ячейкой на рабочем листе Excel.

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

Далее в цикле проверяются все строки в этом диапазоне, каждая по отдельности, на количество непустых ячеек. В том случаи если метод CountA возвращает значение 0, то адреса этих ячеек дополняют несмежный диапазон в переменной diapaz2 еще на одну пустую строку.

В конце макроса выделяются все пустые строки, находящиеся внутри диапазона определенным переменной diapaz2. Если же таблица не сдержит ни одной пустой строки, тогда выводиться соответственное сообщение.



Макрос для удаления пустых строк

Как удалить строку макросом? Если нужно сделать так чтобы макрос автоматически не только выделял, но и сам удалял пустые целые и смежные диапазоны ячеек без использования других инструментов, тогда в конце кода для переменной diapaz2.Select следует изменить метод на [Delete]:

diapaz2.[Delete]

Удалить:

Sub DelLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.[Delete]
End If
End Sub

Пример второго VBA-кода:

Пример второго VBA-кода удалить.

Макрос для скрытия пустых строк

Как скрыть пустые строки макросом? Но если вам нужно не удалить, а только скрыть (например, при подготовке документа на печать), тогда эту строку кода следует модифицировать несколько иначе:

diapaz2.EntireRow.Hidden = True

Скрыть:

Sub HidLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.EntireRow.Hidden = True
End If
End Sub

Пример третьего VBA-кода:

Пример третьего VBA-кода скрыть.

Добавление строк макросом

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

diapaz2.[Insert]

Добавить:

Sub AddLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.[Insert]
End If
End Sub

Пример четвертого VBA-кода:

Пример четвертого VBA-кода добавить.

Если же вы хотите, чтобы макрос работал исключительно только для пустых строк предварительно выделенного определенного диапазона листа перед запуском макроса, то в начале макроса следует изменить строку создания экземпляра объекта для переменной diapaz1, на:

Set diapaz1 = Selection

Читайте также: Как выделить столбцы в Excel макросом.

Внимание! Следует помнить о том, что если таким образом создавать экземпляр объекта для переменной diapaz1, то тогда нельзя перед запуском макроса выделять все ячейки листа или все ячейки любого столбца. Иначе это затормозит программу Excel, так как один лист содержит аж 1 048 576 строк и тогда они все будут обрабатываться макросом, а пользователь будет ждать.

0 / 0 / 0

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

Сообщений: 2

1

Выделение всей строки по условию

26.06.2016, 14:20. Показов 14018. Ответов 9


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

Доброго времени суток.
Может кто-нибудь написать макрос для заливки целой строки по условию?
Имеем таблицу, к примеру из 40 тысяч строк. Необходимо выполнить поиск по слову «недвижимость». Залить красным цветом все строки, где встретиться искомое слово. Заранее спасибо. Либо, может это можно как-то с помощью УФ выполнить. Выручите, пожалуйста.



0



Burk

1813 / 1135 / 346

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

Сообщений: 4,002

26.06.2016, 15:49

2

eQyes, вы это тоже можете, включив запись макроса в меню СЕРВИС (2003) или Разработчик(2007). Затем делаете вручную, нужные вам действия. Затем ОСТАНОВИТЬ ЗАПИСЬ и в макросах смотрите, сформированный экселем макрос. Пользуйтесь этим почаще быстрее научитесь делать такие простые вещи самостоятельно. А пока получите макрос. Считаем, что «недвижимость» в первом столбце.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub RedBull()
 
' Макрос1 Макрос'
' Макрос записан 26.06.2016 (Burk)'
 
 
Dim I As Long
I = 1
Do While Cells(I, 1) <> ""
  If InStr(LCase(Cells(I, 1)), "недвижимость") > 0 Then Rows(I).Interior.ColorIndex = 3
  I = I + 1
Loop
End Sub



0



МВТ

45 / 45 / 15

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

Сообщений: 128

26.06.2016, 17:05

3

Burk, на значительных объемах применение массивов даст существенную прибавку в скорости

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub tt()
    Dim arr(), i As Long, s As String, LRow
    LRow = Cells(Rows.Count, "A").End(xlUp).Row
    If LRow = 1 Then If IsEmpty(Range("A1")) Then Exit Sub
    arr = Range("A1:A" & LRow).Value
    For i = 1 To UBound(arr)
        If StrComp(arr(i, 1), "íåäâèæèìîñòü", vbTextCompare) = 0 Then
            If Len(s) = 0 Then s = "A" & i Else s = s & ",A" & i
        End If
    Next
    If Len(s) > 0 Then Range(s).EntireRow.Interior.Color = vbRed
End Sub



0



4131 / 2235 / 940

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

Сообщений: 4,624

26.06.2016, 17:55

4

МВТ, На значительном количестве ячеек, содержащих искомый текст, такой подход приведёт к возникновению ошибки, ибо Len(s) не должна превышать 255 символов.



0



45 / 45 / 15

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

Сообщений: 128

26.06.2016, 18:22

5

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



0



pashulka

4131 / 2235 / 940

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

Сообщений: 4,624

26.06.2016, 18:40

6

Если из 40000 — 10000 ячеек будут с недвижимостью, то тут Union не самый лучший вариант, а если 100, то можно его и помучить

P.S. Кстати, при переборе

ячеек

не лишним будет использовать :

Visual Basic
1
2
3
Application.ScreenUpdating = False
 
Application.ScreenUpdating = True



1



МВТ

45 / 45 / 15

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

Сообщений: 128

26.06.2016, 20:04

7

pashulka, пардон, код не прикрепил

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub tt()
    Dim arr(), i As Long, s As String, LRow As Long, Col As New Collection
    Application.ScreenUpdating = False
    LRow = Cells(Rows.Count, "A").End(xlUp).Row
    If LRow = 1 Then If IsEmpty(Range("A1")) Then Exit Sub
    arr = Range("A1:A" & LRow).Value
    For i = 1 To UBound(arr)
        If StrComp(arr(i, 1), "выбор", vbTextCompare) = 0 Then
            If Len(s) = 0 Then s = "A" & i Else s = s & ",A" & i
            If Len(s) > 47 Then
                Col.Add (s)
                s = ""
            End If
            If Len(s) > 0 Then Col.Add (s)
        End If
    Next
    If Col.Count = 0 Then Exit Sub
    For i = 1 To Col.Count
        Range(Col(i)).EntireRow.Interior.Color = vbRed
    Next
    Application.ScreenUpdating = False
End Sub

Добавлено через 1 час 21 минуту
Благодаря замечаниям уважаемого pashulka были выявлены несколько досадных неточностей в коде. Прикладываю исправленный вариант

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub tt()
    Dim arr(), i As Long, s As String, LRow As Long, Col As New Collection
    LRow = Cells(Rows.Count, "A").End(xlUp).Row
    If LRow = 1 Then
        If StrComp(Range("A1"), "выбор", vbTextCompare) = 0 Then Range("A1").EntireRow.Interior.Color = vbRed
        Exit Sub
    End If
    arr = Range("A1:A" & LRow).Value
    For i = 1 To UBound(arr)
        If StrComp(arr(i, 1), "выбор", vbTextCompare) = 0 Then
            If Len(s) = 0 Then s = "A" & i Else s = s & ",A" & i
            If Len(s) > 47 Then
                Col.Add (s)
                s = ""
            End If
            If Len(s) > 0 Then Col.Add (s)
        End If
    Next
    If Col.Count = 0 Then Exit Sub
    Application.ScreenUpdating = False
    For i = 1 To Col.Count
        Range(Col(i)).EntireRow.Interior.Color = vbRed
    Next
    Application.ScreenUpdating = True
End Sub



0



snipe

4038 / 1423 / 394

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

Сообщений: 3,541

27.06.2016, 03:40

8

а просто макрос записать макрорекордером не пробовали

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Макрос1()
    Rows("1:40000").Select
    Selection.AutoFilter
    ActiveSheet.Range("A1:A40000").AutoFilter Field:=1, Criteria1:="=*недвижимость*", _
        Operator:=xlAnd
    Rows("2:40000").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    ActiveSheet.Range("A1:A40000").AutoFilter Field:=1
End Sub



0



1813 / 1135 / 346

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

Сообщений: 4,002

27.06.2016, 07:30

9

Господа, вы рассуждаете о такой пустяковой задаче, как о проблеме века. Судя по всему, автор темы мало чего знает о VBA и, когда я пишу ответы на вопрос, то стараюсь наметить возможные пути (далеко не все) для решения задачи и достаточно простые, надеясь, что это станет толчком к самостоятельным действиям автора. Я думаю, что сейчас он оценивает ваши алгоритмы с точки зрения «работает-не работает». А у вас этот «пустячок» как зеркало, чтобы полюбоваться на себя. Алгоритмы мне понравились, надеюсь, что и автор темы в них разберётся. С наилучшими пожеланиями. Burk
P.S. Вскоре создам новую, более серьёзную тему, если вам известно её решение В НУЖНОМ МНЕ АСПЕКТЕ буду признателен.



0



6875 / 2807 / 533

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

Сообщений: 8,562

27.06.2016, 08:38

10

del, уже реализовано



0



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