Как остановить ComboBox1_Click Запустить Worksheet_Change несколько раз и испортить целевой адрес? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть лист «заполнения формы» с макросом VBA для автоматического перемещения данных в другой лист «базы данных».Затем есть ComboBox для поиска и извлечения данных из базы данных.

Механизм ComboBox_Click скопирует его текстовое значение в Target.Address, который вызовет Worksheet_Change и, наконец, данные будут извлечены и отображены.

Проблема в том, что ComboBox_Click запускает Worksheet_Change несколько раз (примерно 3 раза) и портит указанный адрес Target.Address.Если я отредактирую значение ячейки вне указанного Target.Adress, Worksheet_Change сработает, каждая ячейка теперь будет выступать в качестве Target.Address. EDIT: целевой адрес НЕ испорчен

Как я могу это остановить?


Это код VBA на листе для заполнения форм, упрощенный, а не мой код. Я отредактировал его из кода, полученного с веб-сайта..

Option Explicit
----------------------------------------------------
Private Sub ComboBox1_Click()

    Me.Range("myTargetAddress").Value = Me.Range("myComboBoxValue").Value
    'myComboBoxValue is ComboBox LinkedCell property

End Sub
----------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim wForm as Worksheet
    Dim wDatabase as Worksheet
    Dim lRowNextEmpty As Long
    Dim lRowLastFilled As Long
    Dim lRowMyDataPosition As Long
    Dim lRowMyDataPostionExact As Long
    Dim rMyDataToFill As Range

    Set rMyDataToFill = wForm.Cells("C3:C12")

    ... 'collapsed to concise

    Application.EnableEvents = False

    Select Case Target.Address
        Case Me.Range("myTargetAddress").Address

        Case Else
        GoTo WaitAndSee
    End Select

    With wDatabase
        lRowNextEmpty = .Cells(.Rows.Count, "B").End(xlUp).Offset(1, 0).Row - 1
        lRowLastFilled = lRowNextEmpty - 1
    End With

    With wDatabase
        lRowMyDataPostion = wForm.Range("A1").Value 'A1 contain formula to match lookup
        If  lRowMyDataPostition > 0 And lRowMyDataPosition <= lRowLastFilled
            lRowMyDataPositionExact = lRowMyDataPosition + 1 '+ 1 to overcome column header
            .Range(.Cells(.lRowMyDataPositionExact, 1), .Cells(lRowMyDataPositionExact, 10).copy
            'this will copy, for excample, A1:J1 from database 'J is the 10th column
            rMyDataToFill.Cells(1,1).PasteSpecial Paste:=xlPasteValues, Transpose:=True
        End If
    End With


WaitAndSee:

    Application.EnableEvents = True
    Exit Sub

End Sub

1 Ответ

0 голосов
/ 08 марта 2019

Если вы не хотите запускать Worksheet_Change () внутри ComboBox1_Click (), вы можете отключить события приложения через Application.EnableEvents (обязательно включите его позже).Если вы хотите вызвать код, но только один раз , вы можете отключить события и явно вызвать процедуру:

Private Sub ComboBox1_Click()
    Application.EnableEvents = False

        Me.Range("myTargetAddress").Value = Me.Range("myComboBoxValue").Value
        'myComboBoxValue is ComboBox LinkedCell property

        '''  if you want to call Worksheet_Change() (once), uncomment the next line
        ' Call Worksheet_Change(Target:=Me.Range("myTargetAddress"))

    Application.EnableEvents = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...