多个特定单元格的工作表更改

时间:2018-09-05 23:53:24

标签: excel vba excel-vba

我将开始说,我花了很多时间进行搜索和测试,但没有任何事情能按预期工作。

我实际上是在创建一个任务列表,该任务列表将导出为CSV以便导入。棘手的部分是任务列表由两个用户选择的变量确定。

第一个(“ C2”)确定导入是否包括“ Beta任务”。这是一个简单的是/否,并使用一个简单的公式填充“包含”列。

第二个(“ D2”)根据列表大小确定要包括的任务。

目前可以正常使用。这是我遇到麻烦的地方。首先是wokbook_change正在监视工作表上的所有更改,因此我无法手动选择包含/排除任务。我如何才能让工作表仅观察该单元格的变化?

此外,理想情况下,如果我手动更改为排除,我希望beta版本遵循主要任务。例如,将“ C2”设置为“是”,将“ D2”设置为“中”。如果我选择手动排除“任务4”,则相应的Beta也应排除在外。我在工作簿中将此代码作为简单的If语句,但无法使其与workbook_change一起使用。

Private Sub Worksheet_Change(ByVal Target As Range)
Static IsActive As Boolean
If IsActive Then Exit Sub
IsActive = True

If Range("D2").Value = "Small" Then
    Range("A7").Value = "Yes"
    Range("A8").Value = "No"
    Range("A9").Value = "No"
    Range("A10").Value = ""
    Range("A11").Value = ""
    Range("A12").Value = ""
    Range("A15").Value = "Yes"
    Range("A17").Value = "No"
    Range("A19").Value = "No"
    Range("A21").Value = "No"

ElseIf Range("D2").Value = "Medium" Then
    Range("A7").Value = "Yes"
    Range("A8").Value = "Yes"
    Range("A9").Value = "No"
    Range("A15").Value = "Yes"
    Range("A17").Value = "Yes"
    Range("A19").Value = "No"
    Range("A21").Value = "No"

ElseIf Range("D2").Value = "Large" Then
    Range("A7").Value = "Yes"
    Range("A8").Value = "Yes"
    Range("A9").Value = "Yes"
    Range("A15").Value = "Yes"
    Range("A17").Value = "Yes"
    Range("A19").Value = "Yes"
    Range("A21").Value = "No"


ElseIf Range("D2").Value = "X-Large" Then
    Range("A7").Value = "Yes"
    Range("A8").Value = "Yes"
    Range("A9").Value = "Yes"
    Range("A15").Value = "Yes"
    Range("A17").Value = "Yes"
    Range("A19").Value = "Yes"
    Range("A21").Value = "Yes"

ElseIf Range("D2").Value = "<Select>" Then
    Range("A7").Value = "Yes"
    Range("A8").Value = "Yes"
    Range("A9").Value = "Yes"
    Range("A15").Value = "Yes"
    Range("A17").Value = "Yes"
    Range("A19").Value = "Yes"
    Range("A21").Value = "Yes"

End If

If Range("A15").Value = "No" Then
    Range("A16").Value = "No"
End If

If Range("A17").Value = "No" Then
    Range("A18").Value = "No"
End If

If Range("A19").Value = "No" Then
    Range("A20").Value = "No"
End If

If Range("A21").Value = "No" Then
    Range("A22").Value = "No"
End If

IsActive = False

End Sub

提前感谢您的帮助。另外,我毫不怀疑我不会以最有效的方式进行此操作,因此,对此方面的任何建议也将不胜感激。

1 个答案:

答案 0 :(得分:0)

代替这些东西

Static IsActive As Boolean
If IsActive Then Exit Sub
IsActive = True

您可以只使用Application.EnableEvents = False来阻止此事件重新触发。

您可以使用Application.Intersect Method测试已更改的单元格是否在特定范围内。

我也建议使用Select Case而不是多个ElseIf,最后您可以像下面显示的那样缩短范围:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False

    If Not Intersect(Target, Range("D2,D5")) Is Nothing Then
        'this will only run if cells D2 or D5 was changed

        Select Case Range("D2").Value
            Case "Small":
                Range("A7,A15").Value = "Yes"
                Range("A8,A9,A17,A19,A21").Value = "No"
                Range("A10,A11,A12").Value = ""

            Case "Medium":
                'todo 
            Case "Large":
                'todo
            Case "X-Large":
                'todo
            Case "<Select>":
                'todo
            Case Else:
                'what happens if no case it true
        End Select

    End If

    Application.EnableEvents = True
End Sub