Как обновить ту же ячейку, в которую вы ввели значение, на основе другой ячейки? - PullRequest
0 голосов
/ 03 апреля 2020

Здесь начинающий VBA - я пытаюсь обновить ячейку, для которой я только что ввел значение, основываясь на другой ячейке и ее изменяющемся значении.

Итак, я ввожу 100 в A1.

Затем, основываясь на возможности ввода 3 слов в ячейку C5, я хочу умножить A1 на определенную сумму.

Если я введу «Normal» в C5, он умножит A1 на 1. Если я введу 'Low' в C5, он умножит A1 на 0,5. Если я введу «Высокий» в C5, он умножит А1 на 2.

Любая помощь или направление будут хороши:)

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Вам нужен обработчик событий рабочего листа, который срабатывает при изменении значения ячейки C5

Поместите этот код в область кода рабочего листа (просто щелкните правой кнопкой мыши на вкладке и выберите «Просмотреть код»)

Dim myValue As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Then Exit Sub
    If Target.Address <> "$A$1" Then myValue = Range("A1").Value ' keep track of any "original value" changes
    If Target.Address <> "$C$5" Then Exit Sub

    If IsEmpty(myValue) Then myValue = Range("A1").Value ' retrieve the "original value" if not already set

    On Error GoTo SafeExit
    Application.EnableEvents = False
    Select Case Target.Value
        Case "Normal"
            ' no need to multiply by 1 ...

        Case "Low"
            Range("A1").Value = myValue * 0.5 ' divide "original value"

        Case "High"
            Range("A1").Value = myValue * 2 'multiply "original value"

    End Select

SafeExit:
    Application.EnableEvents = True       
End Sub
0 голосов
/ 03 апреля 2020

Почему бы вам не отобразить результат в другой ячейке, такой как B1?
Тогда вы можете просто использовать там простую формулу:

=A1*IF($C$5="Low",0.5,IF($C$5="High",2,1))

enter image description here


Альтернативное решение VBA

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim AffectedCells As Range
    Set AffectedCells = Intersect(Target, Me.Range("A1")) 'you can extend the range to more cells like A1:A10

    If Not AffectedCells Is Nothing Then
        On Error GoTo SafeExit

        Dim Factor As Double
        Select Case Me.Range("C5").Value 'note this is case sensitive
            Case "Normal": Exit Sub
            Case "Low":    Factor = 0.5
            Case "High":   Factor = 2
        End Select

        Application.EnableEvents = False
        Dim Cell As Range
        For Each Cell In AffectedCells.Cells
            If IsNumeric(Cell.Value) Then
                Cell.Value = Cell.Value * Factor
            End If
        Next Cell
    End If

SafeExit:
    Application.EnableEvents = True
End Sub
...