Обнаружение изменений рабочего листа ПОСЛЕ события Ado .CopyFromRecordSet - PullRequest
0 голосов
/ 12 июня 2019

У меня есть рабочий лист, который подключается к базе данных SQL с помощью Ado и загружает содержимое базы данных в лист Excel. У меня эта часть работает хорошо. Теперь я хочу проверить, изменяется ли ячейка после вставки данных. Вот мой код в Worksheeet_Change до сих пор.

Private Sub Worksheet_Change(ByVal Target As range)
Dim KeyCells As range
Set KeyCells = range("Table:Environment")
If Not Application.Intersect(KeyCells, range(Target.Address)) _
       Is Nothing Then
    range("CleanHeaders").ClearContents
    range("CleanDates").ClearContents
    Call SQL_Connect.connect
    Call Data_Download.header_download
    Call Data_Download.download_data
    Call SQL_Connect.close_connection
End If
Dim DataRng As range, roww As Long
Dim rng As range
Set DataRng = Intersect(range("DataStart:Z10000"), Target)
If Not DataRng Is Nothing Then
    For Each rng In DataRng
        roww = rng.Row
        If Not rng.Value = " " Then
        Cells(roww, "AA").Value = "1"
        Else
        Cells(roww, "AA").Value = "0"
        End If
        Next
    End If
On Error GoTo 0
End Sub

Чтобы дать вам быстрое объяснение, вот что происходит в коде. Первая часть посвящена конкретному блоку на листе. Когда он изменяется, он вызывает соединение, загружает заголовки и данные, а затем закрывает соединение. Как я уже сказал, эта часть работает нормально, и у меня нет проблем с этим. Следующая часть - моя попытка проверить наличие изменений в этих ячейках. Проблема в том, что каждый раз, когда я очищаю таблицу или загружаю в нее новые данные, она думает, что это изменение, и ставит единицы во все строки. Я хочу обнаружить эти изменения ПОСЛЕ того, как данные были загружены на лист. Как мне исправить это, чтобы правильно добиться этого? Заранее спасибо!

1 Ответ

1 голос
/ 12 июня 2019

Любое событие, которое происходит с изменениями, рискует сам активироваться. Чтобы этого не происходило, отключите события во время работы саба, используя EnableEvents

Private Sub Worksheet_Change(ByVal Target As range)
Application.EnableEvents = False
Dim KeyCells As range
Set KeyCells = range("Table:Environment")
If Not Application.Intersect(KeyCells, range(Target.Address)) _
       Is Nothing Then
    range("CleanHeaders").ClearContents
    range("CleanDates").ClearContents
    Call SQL_Connect.connect
    Call Data_Download.header_download
    Call Data_Download.download_data
    Call SQL_Connect.close_connection
End If
Dim DataRng As range, roww As Long
Dim rng As range
Set DataRng = Intersect(range("DataStart:Z10000"), Target)
If Not DataRng Is Nothing Then
    For Each rng In DataRng
        roww = rng.Row
        If Not rng.Value = " " Then
        Cells(roww, "AA").Value = "1"
        Else
        Cells(roww, "AA").Value = "0"
        End If
        Next
    End If
On Error GoTo 0
Application.EnableEvents = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...