我的工作表基本上是一个指标工作表,它有多个列,这些列依赖于输入到一列中的日期,但是这些后面的每个列然后依次依赖彼此来设置日期和时间段。
我正在尝试找到一种方法来更新第一个值时更改同一行中的某些列;尽可能通过Worksheet_SelectionChange
事件(或者如果结果相同则采用其他方式)。
我想要发生的事情:我在 A栏中输入“开始”日期。我需要excel然后根据 A列中的值更新同一行的 B列。然后我需要 C列(同一行)根据列B 中的新值进行更新;然后我需要 D列根据 C列中的值进行更新;等等。这有意义吗?
答案 0 :(得分:1)
我不明白为什么需要任何VBA。只需在您的单元格中编写公式。真的很简单。
以下是一个示例,其中在A列中输入的日期会更改B列中的值,从而更改C列中的值,依此类推。
第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个相当琐碎的日期,但您可以根据需要自定义。
答案 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调用。