Выделить активную строку/столбец в Excel без использования VBA?
Чего я хочу добиться, так это выделить активную строку или столбец. Я использовал решения VBA, но каждый раз, когда используется событие Selection_change
я теряю шанс отменить любые изменения в моей рабочей таблице.
Есть ли способ как-нибудь выделить активную строку/столбец без использования VBA?
Ответы
Ответ 1
Я не думаю, что это можно сделать без использования VBA, но это можно сделать, не теряя историю отмены:
В VBA добавьте следующее к своему рабочему объекту:
Public SelectedRow as Integer
Public SelectedCol as Integer
Private Sub Worksheet_SelectionChange(ByVal Target as Range)
SelectedRow = Target.Row
SelectedCol = Target.Column
Application.CalculateFull ''// this forces all formulas to update
End Sub
Создайте новый модуль VBA и добавьте следующее:
Public function HighlightSelection(ByVal Target as Range) as Boolean
HighlightSelection = (Target.Row = Sheet1.SelectedRow) Or _
(Target.Column = Sheet1.SelectedCol)
End Function
Наконец, используйте условное форматирование, чтобы выделить ячейки на основе формулы "HighlightSelection":
![screen capture of conditional formatting rules]()
Ответ 2
Лучшее, что вы можете получить, это использование условного форматирования.
Создайте два правила, основанные на формуле:
-
=ROW()=CELL("row")
-
=COLUMN()=CELL("col")
Как показано на рисунке:
![enter image description here]()
Единственный недостаток заключается в том, что каждый раз, когда вы выбираете ячейку, вам нужно пересчитать ваш лист. (Вы можете нажать "F9" )
Ответ 3
Вы можете временно выделить текущую строку (без изменения выделения), нажав Shift+Space
. Текущий столбец с Ctrl+Space
.
Кажется, работает в Excel, Google Sheets, OpenOffice Calc и Gnumeric (все программы, в которых я пробовал). (Спасибо https://productforums.google.com/forum/#!topic/docs/gJh1rLU9IRA за указание на это)
К сожалению, это не так хорошо, как формулы и решения на основе макросов (которые помогли мне, кстати), потому что подсветка исчезает при перемещении курсора, но это также не требует хлопот, связанных с ее настройкой каждый раз или созданием шаблон с ним (который я не мог заставить работать).
Кроме того, я обнаружил, что вы можете упростить формулу условного форматирования (для Excel) из других решений в единую формулу для одного правила следующим образом:
=OR(CELL("col")=COLUMN(),CELL("row")=ROW())
Компромисс заключается в том, что, если бы вы сделали это таким образом, выделенный столбец и строка должны были бы использовать одинаковое форматирование, но это, вероятно, более чем достаточно для большинства случаев и является менее трудоемким. (спасибо https://trumpexcel.com/highlight-active-row-column-excel/ за сокращенную формулу)
Ответ 4
Прежде всего, спасибо! Я только что создал решение с подсветкой ячеек, используя Selection_Change и изменив содержимое ячеек. Я не знал, что это отключит Undo.
Я нашел способ сделать это, используя комбинирование условного форматирования, Cell() и событие Selection_Change. Вот как я это сделал.
- В ячейке A1 я ставлю формулу = ячейка ( "строка" )
- Строка 2 полностью пуста
- Строка 3 содержит заголовки
- Строка 4 и вниз - это данные
- Чтобы обновить формулу в A1, лист необходимо пересчитать. Я могу сделать это с помощью F9, но я создал событие Selection_Change с единственным кодом, который будет выполнен,
Range("A1").Calculate
. Таким образом, это делается каждый раз, когда пользователь перемещается, и поскольку Selection_Change НЕ меняет никаких значений/форматов и т.д. На листе, Undo не отключается.
- Теперь просто введите условное форматирование, чтобы выделить ячейки, которые имеют ту же строку, что и ячейка A1.
- Выберите весь столбец B
- Условное форматирование, управление правилами, новое правило, использование формулы для определения, какие ячейки следует форматировать
- Введите эту формулу: = строка (B1) = $A $1
- Нажмите "Формат" и выберите способ выделения.
- Готов. Нажмите ОК во всплывающих окнах.
Это работает для меня.
Ответ 5
Альтернативой Range.Calculate
является использование ActiveWindow.SmallScroll
. Единственным недостатком является то, что экран мигает в течение доли секунды после нового выбора. При прокрутке вручную необходимо убедиться, что новый выбор полностью выходит за пределы экрана (окна), чтобы он работал. Вот почему в приведенном ниже коде нам нужно прокрутить достаточно, чтобы вывести все видимые строки из вида экрана, а затем прокрутить обратно в ту же позицию -to, чтобы принудительно обновить экран для условного форматирования.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ScreenUpdating = False
ActiveWindow.SmallScroll Down:=150 'change these values to total rows displayed on screen
ActiveWindow.SmallScroll Down:=-150 'change these values to total rows displayed on screen
'DoEvents 'unable to use this to remove the screen flicker
ScreenUpdating = True
End Sub
Кредиты: Рори Арчибальд https://www.experts-exchange.com/questions/28275889/When-is-excel-conditional-formatting-refreshed.html
Ответ 6
Используя условное форматирование, вместо выделения всей строки и столбца можно выделить строку слева от ячейки и столбец над ячейкой с помощью кода ниже:
=OR(AND(CELL("col")=COLUMN();(CELL("row")-1)>=ROW());AND(CELL("col")>=COLUMN();(CELL("row")-1)=ROW()))
Ответ 7
На листе события Selection_change вызывают следующее:
Function highlight_Row(rngTarget As Range)
Dim strRangeRow As String
strRangeRow = rngTarget.Row
strRangeRow = strRangeRow & ":" & strRangeRow
Rows(strRangeRow).Select
rngTarget.Activate
End Function
Это длинный формат для ясности!