代码之家  ›  专栏  ›  技术社区  ›  Iron Man

在现有工作表更改代码中添加第二个更改事件

  •  0
  • Iron Man  · 技术社区  · 1 年前

    我把下面的代码放在一起,它按预期工作。我目前在Q列的第2:28行中运行一个公式,但我想将其转换为第二个更改事件。我研究并发现了“If Not Intersect”代码,但不知道如何将其正确集成到我的代码中并使其正常工作。请帮忙。

    这是原始代码(下面是我试图集成到更改事件中的公式):

        Private Sub Worksheet_Change(ByVal Target As Range)
        
        Dim DestWH As String
        Dim DWHRowNum As Long
        Dim dt As Date
        
        DWHRowNum = 2
        dt = Format(Date, "mm/dd/yyyy")
        
        Application.EnableEvents = False
        
        Do Until Cells(DWHRowNum, 2).Value = ""
            Select Case Cells(DWHRowNum, 6).Value
                Case Is = "ABQ1"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "BFI4"
                    Cells(DWHRowNum, 7).Value = dt + 1
                    Cells(DWHRowNum, 8).Value = "04:30"
                Case Is = "CLE2"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "DEN3"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "DEN4"
                    Cells(DWHRowNum, 7).Value = dt + 1
                    Cells(DWHRowNum, 8).Value = "04:30"
                Case Is = "GEG1"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "LIT1"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "ORD5"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "ORF3"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "PAE2"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "PCW1"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
                Case Is = "PDX9"
                    Cells(DWHRowNum, 7).Value = dt + 1
                    Cells(DWHRowNum, 8).Value = "04:30"
                Case Is = "SLC1"
                    Cells(DWHRowNum, 7).Value = dt
                    Cells(DWHRowNum, 8).Value = "17:00"
               Case Is = "SMF1"
                    Cells(DWHRowNum, 7).Value = dt + 1
                    Cells(DWHRowNum, 8).Value = "04:30"
            End Select
            DWHRowNum = DWHRowNum + 1
        Loop
        
        Application.EnableEvents = True
        
        End Sub
    

    公式(该公式位于Q2:Q28列):

    =IF(G2="","",IF(AND(M2="",N2>G2),"Future","Current"))
    

    G列和N列是日期

    0 回复  |  直到 1 年前
        1
  •  2
  •   taller    1 年前

    问题:当用户在N2:N28列的某个单元格中输入日期时,Q列中的公式会自动运行

    • 简化 Case 代码中的子句。
    • 添加第二部分,在Q2:Q28上应用公式
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim DestWH As String
        Dim DWHRowNum As Long
        Dim toDay As String, nextDay As String
        DWHRowNum = 2
        toDay = Format(Date, "mm/dd/yyyy")
        nextDay = Format(Date + 1, "mm/dd/yyyy")
        Application.EnableEvents = False
        Do Until Cells(DWHRowNum, 2).Value = ""
            Select Case Cells(DWHRowNum, 6).Value
            Case "ABQ1", "CLE2", "DEN3", "GEG1", "LIT1", "ORD5", "ORF3", "PAE2", "PCW1", "SLC1"
                Cells(DWHRowNum, 7).Value = toDay
                Cells(DWHRowNum, 8).Value = "17:00"
            Case "BFI4", "DEN4", "PDX9", "SMF1"
                Cells(DWHRowNum, 7).Value = nextDay
                Cells(DWHRowNum, 8).Value = "04:30"
            End Select
            DWHRowNum = DWHRowNum + 1
        Loop
        ' ** Update
        With Target
            If .CountLarge = 1 Then
                If Not Application.Intersect(Target, Me.Range("N2:N28")) Is Nothing Then
                    If Len(.Value) > 0 And IsDate(.Value) Then
                        If Not Me.Range("Q2").HasFormula Then
                            Me.Range("Q2:Q28").Formula = "=IF(G2="""","""",IF(AND(M2="""",N2>G2),""Future"",""Current""))"
                        End If
                    End If
                End If
            End If
        End With
        Application.EnableEvents = True
    End Sub
    
    
        2
  •  0
  •   Tim Williams    1 年前

    试试这个:

    Private Sub Worksheet_Change(ByVal Target As Range)
        
        Dim rw As Range, dt, tm, vn, vm, vg
        
        On Error GoTo haveError 'so not to leave events turned off...
        Application.EnableEvents = False
        
        Set rw = Me.Rows(2) 'start with row2
        Do While Len(rw.Columns("B").Value) > 0
            Debug.Print rw.Row
            Select Case rw.Columns("F").Value
                'you can list multiple values in the same `Case`
                Case "ABQ1", "CLE2", "DEN3", "GEG1", "LIT1", _
                             "ORF3", "PAE2", "PCW1", "SLC1"
                    dt = Date
                    tm = "17:00"
                Case "BFI4", "DEN4", "PDX9", "SMF1"
                    dt = dt + 1
                    tm = "04:30"
                Case Else
                    dt = Empty 'no match: clear variables
                    tm = Empty
            End Select
            
            'now figure out what to do with Cols G, H and Q
            If Len(tm) > 0 Then 'any match above?
                rw.Columns("G").NumberFormat = "mm/dd/yyyy"
                rw.Columns("G").Value = dt
                rw.Columns("H").Value = tm
                
                vm = rw.Columns("M").Value
                vn = rw.Columns("N").Value
                vg = rw.Columns("G").Value
                rw.Columns("Q").Value = IIf(Len(vm) = 0 And vn > vg, "Future", "Current")
            Else
                'clear G, H and Q
                'note range is *relative* to `rw`
                rw.Range("G1,H1,Q1").ClearContents
            End If
            
            Set rw = rw.Offset(1) 'next row down
        Loop
    haveError:
        If Err.Number > 0 Then Debug.Print Err.Description
        Application.EnableEvents = True
        
    End Sub