更改一个单元格后,按顺序更新行中的列

时间:2012-03-20 17:29:36

标签: excel vba excel-vba

我的工作表基本上是一个指标工作表,它有多个列,这些列依赖于输入到一列中的日期,但是这些后面的每个列然后依次依赖彼此来设置日期和时间段。

我正在尝试找到一种方法来更新第一个值时更改同一行中的某些列;尽可能通过Worksheet_SelectionChange事件(或者如果结果相同则采用其他方式)。

我想要发生的事情:我在 A栏中输入“开始”日期。我需要excel然后根据 A列中的值更新同一行的 B列。然后我需要 C列(同一行)根据列B 中的新值进行更新;然后我需要 D列根据 C列中的值进行更新;等等。这有意义吗?

3 个答案:

答案 0 :(得分:1)

我不明白为什么需要任何VBA。只需在您的单元格中编写公式。真的很简单。

以下是一个示例,其中在A列中输入的日期会更改B列中的值,从而更改C列中的值,依此类推。

enter image description here

第2行显示公式的结果,而第4行显示公式本身(对于这些相当长的公式的不良格式化道歉)。

答案 1 :(得分:1)

你似乎真的想要VBA,所以我会发布另一个答案(与我的另一个完全不同)。

我在这里使用Worksheet_Change事件。它调用一个返回包含日期的Variant类型数组的函数。然后可以使用=将此数组写入工作表。

我发现这比在单元格中使用公式稍微复杂一点,但它具有前端更清洁的优点,您似乎想要它。

在工作表模块中:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Target.Offset(0, 1).Resize(1, 3) = RelevantDates(Target.Value)
    End If

End Sub

在代码模块中:

Function RelevantDates(startDate As Date) As Variant
    Dim v As Variant
    ' Adapt to your needs:
    ReDim v(1 To 3)
    v(1) = startDate + 1 ' add one day
    v(2) = DateSerial(Year(v(1)), Month(v(1)), Day(v(1)) + 7) ' add one more week
    v(3) = DateSerial(Year(v(2)), Month(v(2)) + 1, Day(v(2))) ' add one month
    RelevantDates = v
End Function

当然上面只返回3个相当琐碎的日期,但您可以根据需要自定义。

enter image description here

答案 2 :(得分:0)

理想情况下,您以后的列会根据之前的列只包含公式。对于列B2,=A2*100和列C2的=B2+88之类的东西。

如果由于计算困难而不容易,请考虑工作表函数,例如B2列的=ComplicatedFunction(A2)

Function ComplicatedFunction(depended_on As Range)

    If depended_on.Value <> 0 Then
        PAYEES = 1
    Else
        PAYEES = 2
    End If
End Function

如果那是不可能的,那么你是对的 - 工作表改变了事件可能有所帮助,可能是这样的:

Public Sub Worksheet_Change(ByVal Target As Range)

    If Target.Column = 1 Then
        Debug.Print "change to column A encountered"
        Range(2,Target.Row).Value = Target.Value + 2
    ElseIf Target.Column = 2 Then
        Debug.Print "change to column B encountered"
        Range(3,Target.Row).Value = Target.Value + 99
    ElseIf Target.Column = 3 Then
        Debug.Print "change to column C encountered"
        Range(4,Target.Row).Value = Target.Value * 7
    End If

End Sub

我相信在您更新子资源中的值后,将会级联Worksheet_Change调用。