【问题标题】:Excel VBA change based on pull down list基于下拉列表的 Excel VBA 更改
【发布时间】:2015-02-01 11:08:06
【问题描述】:

我有一些 Excel 公式可以根据输入到列 C 和 D 中的信息更改列 E 和 G 中的数据。列 F 需要是静态时间戳,因此我必须使用一个简单的 VBA 脚本。公式有点长而且笨拙,其他人在工作簿上工作,所以我尝试通过 VBA 编写 E&G 脚本,以降低公式混乱的风险。

在 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 列是用户输入的日期。

【问题讨论】:

    标签: vba excel excel-formula


    【解决方案1】:

    你的逻辑还不错,但是事件宏的结构需要改进。对于这种事件,我们需要:

    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"
    

    可能还有其他问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多