我有一些Excel公式可以更改E&列中的数据G基于输入C& C列的信息D.列F需要是一个静态时间戳,所以我必须使用一个简单的VBA脚本。公式有点长而且不实用,其他人在工作簿上工作,所以我尝试编写脚本E& G通过VBA来降低公式搞砸的风险。
对于VBA而言,我并不是最好的,经过多次尝试失败之后,我最终还是以最终崩溃的Excel结束了。
以下是我最近的尝试;
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
Cells(Target.Row, 6).Value = Now
End If
If Target.Column = 4 And Cells(Target.Row, 4).Value = "Daily" Then
Cells(Target.Row, 5).Value = [INDIRECT("C" & ROW())+28]
ElseIf Target.Column = 4 And Cells(Target.Row, 4).Value = "Weekly" Then
Cells(Target.Row, 5).Value = [INDIRECT("C" & ROW())+49]
Else: Cells(Target.Row, 5).Value = "---"
End If
End Sub
我也有以下因为其他部分崩溃我没有尝试过;
If Target.Column = 4 And (Cells(Target.Row, 4).Value = "Daily" OR Cells(Target.Row, 4).Value = "Weekly") Then
Cells(Target.Row, 7).Value = [WORKDAY(INDIRECT(""E"" & ROW()),-1]
Else Cells(Target.Row, 7).Value = "---"
End If
Excel公式;
=IF(INDIRECT("D" & ROW())<>"",CHOOSE(IF(INDIRECT("D" & ROW())="Daily",1,IF(INDIRECT("D" & ROW())="Weekly",2,3)),INDIRECT("C" & ROW())+28,INDIRECT("C" & ROW())+49,"---"),"")
=IF(INDIRECT("D" & ROW())<>"",CHOOSE(IF(OR(INDIRECT("D" & ROW())="Daily",INDIRECT("D" & ROW())="Weekly"),1,2),WORKDAY(INDIRECT("E" & ROW()),-1),"---"),"")
我尝试录制公式的宏并将代码从那里复制到VBA代码中,但这也没有用。
我在标题中说过,但忘了在身上提一下; D列是下拉列表,C列是用户输入的日期。
答案 0 :(得分:0)
您的逻辑并不错,但事件宏的结构需要改进。对于这种事件,我们需要:
Private Sub Worksheet_Change(ByVal Target As Range)
'if Target is NOT of interest, then exit
Application.EnableEvents = False
'perform your logic
Application.EnableEvents = True
End Sub
这可以防止宏踩到它自己的尾部。
这是一个更好的架构(未经测试)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Column <> 4 Then Exit Sub
Dim v As String
v = Target.Value
Application.EnableEvents = False
Target.Offset(0, 2).Value = Now
Target.Offset(0, 1).Value = "'----"
If v = "Daily" Then
'insert formula
End If
If v = "Weekly" Then
'insert formula
End If
Application.EnableEvents = True
End Sub
另一个问题是让 VBA 插入公式。这里的架构如下:
Cells(3,7).Formula="=1+2"
可能还有其他问题。