使用VBA根据其他单元格值设置Excel单元格值

xpcnnkqh  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(229)

我有下面的电子表格。当单元格B中有一个x时,我需要使用一个公式填充同一行中的d和e单元格。如果单元格B中没有x,我需要手动输入值到单元格d和e中。

如何使代码不特定于行?

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
rggaifut

rggaifut1#

我不确定我是否理解正确,但如果你有一个参数:row = 3,您可以使用范围(“E”& row)代替范围(“E3”)。
在您要修改的行的“row”处放置一个循环。
希望能有所帮助!

c3frrgcw

c3frrgcw2#

您已经围绕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
c2e8gylq

c2e8gylq3#

请尝试下面的代码。它会遍历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

相关问题