使用VBA根据另一个单元格值设置Excel单元格值

时间:2018-12-11 15:37:20

标签: excel vba excel-vba

我有以下电子表格。每当单元格B中有x时,我需要使用我拥有的方程式填充同一行中的d和e单元格。 如果b单元格中没有x,我需要在d&e单元格中手动输入值。

enter image description here

如何使我的代码不特定行?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim val As String
    val = Range("B3").Value
    If val = "x" Then
        Range("E3").Value = Range("d2").Value * Range("G2").Value
        Range("D3").Value = Range("D2").Value
    End If
End Sub

3 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但是如果您有一个参数:row = 3,则可以使用Range(“ E”&row)代替Range(“ E3”)。

在要修改的行的“行”变化周围放置一个循环。

希望有帮助!

答案 1 :(得分:0)

您已经围绕Worksheet_SelectionChange事件创建了一个子过程。实际上,您需要Worksheet_Change并且需要,

  • 禁用事件处理,因此您可以在工作表上写入新的值/公式,而无需在其自身之上运行Worksheet_Change。
  • 循环遍历Target中的每个匹配单元以补偿Target可以超过单个单元的情况,
  • 添加错误控制。

重写:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False
        Dim t As Range
        For Each t In Intersect(Target, Range("B:B"))
            If LCase(t.Value) = "x" Then
                'I've made these formulas relative to each target
                'you may want to make some absolute references
                t.Offset(0, 3) = t.Offset(-1, 2) * t.Offset(-1, 5)
                t.Offset(0, 2) = t.Offset(-1, 2)
            Else
                t.Offset(0, 2).resize(1, 2) = vbnullstring
            End If
        Next t
    End If

safe_exit:
    Application.EnableEvents = True

End Sub

答案 2 :(得分:0)

请尝试以下代码。 它遍历B列中的所有非空行,并检查是否存在值:x 如果是这样,它将填充您的公式。

Sub new_sub()
 ' get last_row of data
last_row = ActiveSheet.UsedRange.Rows.Count

' loop through all rows with data and check if in column B any cell contains value: x
For i = 1 To last_row
    ' if there is any cell with value: x
    ' then add below formulas
    If Cells(i, 2).Value = "x" Then
        ' for column E: take value from row above for col D and G and multiple
        Range("E" & i).Value = Range("d" & i - 1).Value * Range("G" & i - 1).Value
        ' for column D: take value from row above
        Range("D" & i).Value = Range("D" & i - 1).Value
    End If
Next i

End Sub