2016-09-13 2 views
0

Я написал макрос, чтобы проверить входное значение некоторых ячеек. Если вход выше 8, избыток записывается в другую ячейку, а вход изменяется на 8, а если вход меньше 8, то недостающая сумма записывается в третью ячейку. Это код, который я написалМакро для изменения значения ячейки

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
TA = Target.Address: R = Target.Row: C = Target.Column 
If C = 2 Or C = 7 Then 
    If (R < 19 And R > 11) Or (R < 33 And R > 25) Then 
    Hours = Cells(R, C).Value 
    If Hours <> 0 Then 
     If Hours > 8 Then 
     Cells(R, C) = 8 
     Cells(R, C + 1) = Hours - 8 
     End If 
     If Hours < 8 Then 
     Cells(R, C + 2) = 8 - Hours 
     End If 
    End If 
    End If 
End If 
End Sub 

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

ответ

1

Во-первых изменить событие триггера от Worksheet_SelectionChange в Worksheet_Change.

Во-вторых, вы можете оптимизировать код, так как вы можете прочитать Column и свойство Target, вы можете сохранить несколько строк в коде.

В-третьих, я изменил ваше тестовое условие для проверки строки, переключившись на Select Case, теперь вы можете легко добавить в это условие дополнительные строки.

Используйте Target.offset, чтобы вставить результат в соседние ячейки.

Я добавил Exit Sub, поэтому он не будет запускать дополнительное время после изменения значений здесь.

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

Вы можете просто использовать If Target.Value <> 0 Then и т.д.)

Private Sub Worksheet_Change(ByVal Target As Range) 

' check if target is in Column B or Column G 
If Target.Column = 2 Or Target.Column = 7 Then 

    Select Case Target.Row 
     Case 12 To 18, 26 To 32 ' check if target row is 12 to 18 (including) ir between 26 to 32 (including) 

      Hours = Target.Value 
      If Hours <> 0 Then 
       If Hours > 8 Then 
        Target.Value = 8 
        Target.Offset(0, 1).Value = Hours - 8 
        Exit Sub 
       Else 
        If Hours < 8 Then 
         Target.Offset(0, 2).Value = 8 - Hours 
        End If 
        Exit Sub 
       End If 
      End If 
    End Select 
End If 

End Sub 
1

Ваша функция Worksheet_SelectionChange срабатывает только при изменении выбранной ячейки. Вместо этого вы должны использовать Worksheet_Change. Вы можете увидеть это automatically execute an Excel macro on a cell change для более подробной информации.

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