2014-11-28 2 views
2

VBA начинающий здесь.Worksheet_Change - Ориентация нескольких ячеек одновременно

У меня есть проект, где я указал ячейки ввода для пользователя. Когда одна из этих входных ячеек изменяется, ей необходимо запустить несколько строк кода, которые относятся только к одной ячейке. Если пользователь очищает содержимое ячейки, я хочу, чтобы код заменил пустую ячейку значением «0».

Приведенный ниже код моделирует то, что я пытаюсь достичь. Он написан в том же виде, что и мой проект, но более краткий.

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Column = 1 And Target.Row = 1 Then 
    Range("B1").Value = "Changed 1" 'Just something specific to this cell. Not important 
    If IsEmpty(Sheet1.Range("A1")) Then Sheet1.Range("A1").Value = 0 
End If 

If Target.Column = 1 And Target.Row = 2 Then 
    Range("B2").Value = "Changed 2" 'Just something specific to this cell. Not important 
    If IsEmpty(Sheet1.Range("A2")) Then Sheet1.Range("A2").Value = 0 
End If 

If Target.Column = 1 And Target.Row = 3 Then 
    Range("B3").Value = "Changed 3" 'Just something specific to this cell. Not important 
    If IsEmpty(Sheet1.Range("A3")) Then Sheet1.Range("A3").Value = 0 
End If 

End Sub 

Все вышеизложенное отлично работает, когда изменения выполняются на отдельных ячеек. Если пользователь выбирает все ячейки и нажимает клавишу удаления, он запускает только код для первой ячейки. Я хочу, чтобы он запускался для всех выбранных (удаленных) ячеек.

Любые советы о том, как одновременно запускать Worksheet_Change через несколько ячеек?

Благодаря

ответ

0
Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Application.Intersect(Target, Cells(1, 1)) Is Nothing Then 
     Range("B1").Value = "Changed 1" 'Just something specific to this cell. Not important 
     If IsEmpty(Sheet1.Range("A1")) Then Sheet1.Range("A1").Value = 0 
    End If 

    If Not Application.Intersect(Target, Cells(1, 2)) Is Nothing Then 
     Range("B2").Value = "Changed 2" 'Just something specific to this cell. Not important 
     If IsEmpty(Sheet1.Range("A2")) Then Sheet1.Range("A2").Value = 0 
    End If 

    If Not Application.Intersect(Target, Cells(1, 3)) Then 
     Range("B3").Value = "Changed 3" 'Just something specific to this cell. Not important 
     If IsEmpty(Sheet1.Range("A3")) Then Sheet1.Range("A3").Value = 0 
    End If 

End Sub 
+0

Привет, Тим, с небольшой настройкой (например, добавление «EnableEvents = False»), это решение работало лучше для меня. Очень признателен. – Snotty

4

Если у вас есть событие изменения, которое работает просто отлично на одной клетке, вы можете сделать несколько изменений, чтобы убедиться, что он работает при изменении диапазона ячеек на одном дыхании, как при вставке три ячейки в ячейку A1 до A3

вы можете применить подход, аналогичный этому:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim ws As Worksheet 
Dim cel As Range 
Dim myRow As Long 

Set ws = ThisWorkbook.Sheets("Sheet1") 

If Not Intersect(Target, Range("A1:A3")) Is Nothing Then ' watch all the cells in this range 
    For Each cel In Target ' do the next steps for each cell that was changed 
     myRow = cel.Row 
     Range("B" & myRow).Value = "Changed " & Target.Row 'Just something specific to this cell. Not important 
     Application.EnableEvents = False 
     If IsEmpty(ws.Range("A" & myRow)) Then Sheet1.Range("A" & myRow).Value = 0 
     Application.EnableEvents = True 
    Next cel 
End If 

End Sub 

Объяснение:

If Not Intersect(Target, Range("A1:A3")) Is Nothing Then - действуют только на изменения в клетках A1 до A3

For Each cel In Target - сделать то же самое для всех ячеек, которые были изменены

Range("B" & myRow).Value = "Changed " & Target.Row - введите некоторое значение в столбце В текущей строке

На следующем шаге макроса мы можем ввести некоторые данные в ячейки, которые мы отслеживаем для изменения, то есть от A1 до A3. Изменение этих ячеек вызовет этот макрос. Этот макрос будет записываться в ячейки. Изменение в ячейках вызовет этот макрос ....

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

Application.EnableEvents = False - Теперь любые события, такие как «ячейка была изменена», будут игнорироваться.

Теперь мы можем записать значение в столбец А и это не вызовет повторение макроса. Отлично. Мы делаем все, что нам нужно делать с ячейками A1-A3, а затем снова включаем мониторинг событий.

Application.EnableEvents = True

Тогда мы идем к следующей ячейке (если таковые имеются) в диапазоне, который вызвал этот макрос.

Дайте мне знать, если это поможет или вам нужно немного подробнее. Эти вещи занимают небольшую кривую обучения.

+0

Стоит отметить, что вы можете иметь несколько диапазонов таким образом, например. 'If ​​Not Intersect (Target, Range (« A1: A3 »), Range (« D7 »))« Nothing Nothing » – Dan

+0

Teylyn. Этот метод перехода через каждую целевую ячейку и применение стандартного набора кода не работает для моего проект в этом случае («Измененный 1» и т. д. был только кодом заполнителя). Тем не менее, «Непересечение (Цель) -« Ничто »вместе с« EnableEvents = False »было именно тем, что мне было нужно. Спасибо за вашу помощь. – Snotty

+0

Hi Snotty, не совсем уверен, что я понимаю, что делает или не работает для вас, но с удовольствием прочитал, что у вас есть решение вашей проблемы. «Не пересекаться (цель, диапазон (что-то)) ничто» является очень полезной концепцией, а отключение событий - это ** ДОЛЖЕН **, когда вы пишете в контролируемый диапазон. Оба очень полезны. – teylyn

Смежные вопросы