基于下拉列表的Excel VBA更改

时间:2015-02-01 11:08:06

标签: excel vba excel-vba excel-formula

我有一些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列是用户输入的日期。

1 个答案:

答案 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"

可能还有其他问题。