Worksheet_Change обрабатывает различные действия для разных столбцов таблицы, которые не выполняются правильно - PullRequest
1 голос
/ 30 января 2020

В следующем макросе рабочего листа я пытаюсь выполнить различные действия в зависимости от выбранного столбца. В 2 случаях выполняемое действие зависит от выбранного столбца и значения столбца.

Например, если имя вводится в столбце A, дата автоматически вводится в столбце B.

Когда в столбце L вводится раскрывающееся значение, дата вводится в столбце M Если данные в столбце L = «Полученные платежи» или «Номер политики выданы», данные копируются на другой лист, а дата вводится в столбец m.

Все отдельные компоненты работают. Однако не всегда.

Мне нужен макрос, чтобы идентифицировать столбец и выполнить правильное действие, чтобы я мог перемещаться из столбца в столбец и макрос постоянно работать в фоновом режиме и работать правильно для всех выбранных столбцов.

Я очень расстроен и исчерпал все онлайн-ресурсы, но мне просто нужен кто-то хороший в VBA, чтобы помочь мне. Помогите с благодарностью

Private Sub Worksheet_Change(ByVal Target As Range)

'Dim C As Range, V
Dim answer As Integer
Dim LRowCompleted As Integer

Application.EnableEvents = False

MsgBox "Target Column is " & Target.Column
MsgBox "Target Value is " & Target.Value


    If Target.Column = 1 Then
        GoTo AddEntryDate
    End If

    If Target.Column = 12 Then
        GoTo AddWorkStatusDate
    End If

    If (Target.Column = 12 And Target.Value = "Fees Received") Then
        GoTo FeesReceived
    End If

    If (Target.Column = 12 And Target.Value = "Policy No. Issued") Then
        GoTo PolicyNoIssued
    End If



Exit Sub
AddEntryDate:
    'Update on 11/11/2019 -If data changes in column L Activity , insert
    'today's date into column M - Date of Activity

        Dim WorkRng As Range
        Dim rng As Range
        Dim xOffsetColumn As Integer

        Set WorkRng = Intersect(Application.ActiveSheet.Range("A:A"), Target)
        xOffsetColumn = 1

        If Not WorkRng Is Nothing Then
            Application.EnableEvents = False
            For Each rng In WorkRng
                If Not VBA.IsEmpty(rng.Value) Then
                    rng.Offset(0, xOffsetColumn).Value = Now
                    rng.Offset(0, xOffsetColumn).NumberFormat = "dd/mm/yyyy"
                    rng.Offset(3, xOffsetColumn).Select
                    With Selection.Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
                    End With
                Else
                    rng.Offset(0, xOffsetColumn).ClearContents
                End If
            Next
            Application.EnableEvents = True
        End If

Exit Sub
AddWorkStatusDate:
    'Update on 11/11/2019 -If data changes in column L Activity , insert
    'today's date into column M - Date of Activity

        Dim WorkRng2 As Range
        Dim rng2 As Range
        Dim yOffsetColumn As Integer
        Set WorkRng2 = Intersect(Application.ActiveSheet.Range("L:L"), Target)
        yOffsetColumn = 1
        If Not WorkRng2 Is Nothing Then
            Application.EnableEvents = False
            For Each rng2 In WorkRng2
                If Not VBA.IsEmpty(rng2.Value) Then
                    rng2.Offset(0, yOffsetColumn).Value = Now
                    rng2.Offset(0, yOffsetColumn).NumberFormat = "dd/mm/yyyy"
                Else
                    rng2.Offset(0, yOffsetColumn).ClearContents
                End If
            Next
            Application.EnableEvents = True
        End If

Exit Sub
PolicyNoIssued:
        Sheets("Income").Select
        LRowCompleted = Sheets("Income").Cells(Rows.Count, "A").End(xlUp).Row '

        'Request confirmation from the user, in form of yes or no
        answer = MsgBox("Do you want to copy this client to the Income Worksheet?", vbQuestion + vbYesNo)

        If answer = vbYes Then
            Range("A" & Target.Row & ":A" & Target.Row).Copy
            Sheets("Income").Range("A" & Rows.Count).End(xlUp).Offset(1).Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            Application.EnableEvents = True
        Else
            MsgBox "This client will not be copied to the Income Worksheet"
            Application.EnableEvents = True
        End If


Exit Sub
FeesReceived:
        'Define last row on Income worksheet to know where to place the row of data
        Sheets("Income").Select
        LRowCompleted = Sheets("Income").Cells(Rows.Count, "A").End(xlUp).Row

        'Request confirmation from the user, in form of yes or no
        answer = MsgBox("Do you want to copy this client to the Income Worksheet?", vbQuestion + vbYesNo)

        If answer = vbYes Then
            Range("A" & Target.Row & ":A" & Target.Row).Copy
            Sheets("Income").Range("A" & Rows.Count).End(xlUp).Offset(1).Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            Application.EnableEvents = True
        Else
            MsgBox "This client will not be copied to the Income Worksheet"
            Application.EnableEvents = True
        End If



    Application.EnableEvents = True
End Sub

1 Ответ

0 голосов
/ 30 января 2020

Из того, что я вижу, нужно отслеживать только 2 столбца. Остальные ваши требования - это только подмножества этих требований.

Ваш код может быть переписан, как показано ниже ( UNTESTED ). Дайте мне знать, если у вас возникла ошибка? Кроме того, поскольку вы работаете с Worksheet_Change, вы можете захотеть увидеть ЭТО .

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim aCell As Range
    Dim wsInc As Worksheet
    Dim lRow As Long
    Dim ans As Variant

    On Error GoTo Whoa

    Application.EnableEvents = False

    '~~> Check if the change happened in Col A
    If Not Intersect(Target, Columns(1)) Is Nothing Then
        For Each aCell In Target.Cells
            With aCell
                If Len(Trim(.Value)) = 0 Then
                    .Offset(, 1).ClearContents
                Else
                    .Offset(, 1).NumberFormat = "dd/mm/yyyy"
                    .Offset(, 1).Value = Now
                    With .Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
                    End With
                End If
            End With
        Next
    '~~> Check if the change happened in Col L
    ElseIf Not Intersect(Target, Columns(12)) Is Nothing Then
        Set wsInc = Sheets("Income")
        lRow = wsInc.Range("A" & wsInc.Rows.Count).End(xlUp).Row + 1

        For Each aCell In Target.Cells
            With aCell
                If Len(Trim(.Value)) = 0 Then
                    .Offset(, 1).ClearContents
                Else
                    .Offset(, 1).NumberFormat = "dd/mm/yyyy"
                    .Offset(, 1).Value = Now
                    With .Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
                    End With

                    '~~> Check of the value is Fees Received, Policy No. Issued
                    If .Value = "Fees Received" Or .Value = "Policy No. Issued" Then
                        ans = MsgBox("Do you want to copy this client to the Income Worksheet?", vbQuestion + vbYesNo)

                        If ans = False Then Exit For

                        wsInc.Range("A" & lRow).Value = Range("A" & aCell.Row).Value
                    End If
                End If
            End With
        Next
    End If

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub
...