Цель в коде события изменения не дает мне того, что я хочу

В подпрограмме обработки событий Worksheet_Change целевое значение относится не к конкретной ячейке, а к диапазону адресов сводной таблицы, к которой принадлежит эта ячейка.

Приведенный ниже код предназначен для определения того, была ли создана определенная именованная ячейка. Если это не так, то никаких действий не требуется. Но если это так, то значение этой именованной ячейки будет указывать на единицу меньше, чем столбец ячейки, изменение которого я хочу обнаружить, побуждая к определенному действию.

Я ожидаю, что изменение произойдет в значении поля фильтра отчетов сводной таблицы, которое, как я полностью ожидаю, будет в строке 4, но в столбце, который на 1 больше, чем значение динамически созданной именованной ячейки "cLeft" Я проверил наличие.

Я обнаруживаю изменение через событие изменения. Однако вместо того, чтобы указывать адрес одной измененной ячейки, я получаю диапазон адресов всей сводной таблицы. Как я могу получить только адрес ячейки, которая изменилась?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Pos As String
Dim rNW As Long
Dim cNW As Long
Dim rSE As Long
Dim cSE As Long
    On Error Resume Next
    Pos = Range("cLeft").Address
    If Err <> 0 Then
        On Error GoTo 0
    Else
        Call GetCorners(Target, rNW, cNW, rSE, cSE)
        If rNW = 4 And cNW = Range("cLeft") + 1 Then
            .
            .
            <some action>
            .
            .
        End If
    End If
End Sub

Sub GetCorners(Rng As Range, rNW As Long, cNW As Long, rSE As Long, cSE As Long)
' Decode the upper left and lower right of the range into appropriate row and column values.
Dim ArR() As String
Dim ANW() As String
Dim ASE() As String
Dim RngStr As String
    RngStr = Rng.Address(ReferenceStyle:=xlR1C1)
' See if the range is a single cell. If it is, replicate it at the end.
    If InStr(RngStr, ":") = 0 Then RngStr = RngStr & ":" & RngStr
    ArR = Split(RngStr, ":")
    ANW = Split(ArR(0), "R")
    ANW = Split(ANW(1), "C")
    ASE = Split(ArR(1), "R")
    ASE = Split(ASE(1), "C")
    rNW = Val(ANW(0))
    cNW = Val(ANW(1))
    rSE = Val(ASE(0))
    cSE = Val(ASE(1))
End Sub

У меня есть сводная таблица, чей «северо-западный» угол равен всегда в строке 4. Номер ее столбца может варьироваться. В моем примере это столбец 101. В момент создания сводной таблицы я также создаю именованную ячейку с именем «cLeft». Затем я записываю в него номер крайнего левого столбца сводной таблицы — 101.

В сводной таблице есть только один фильтр отчета для поля «Статус». Позиция фильтра всегда в строке 4 и номер столбца равен 1 + значение cLeft. В примере это строка 4, столбец 102.

Я хочу выполнить какое-то дополнительное действие при изменении значения фильтра. Для этого я использую приведенный выше код, но он работает не очень хорошо, потому что значение «target» — это не адрес одной изменяемой ячейки, R4C102, а адрес всей сводной таблицы, R4C101: R29C117. , который также меняется в зависимости от выбора.

Как я могу вытащить адрес R4C102 из подпрограммы? Я не хочу использовать Worksheet_SelectionChange, потому что, хотя это дает мне ответ, который я хочу, мне требует нужно сначала выбрать ячейку, содержащую фильтр, а затем изменить фильтр, двухэтапная последовательность, которую я не могу ожидать от конечных пользователей. не забыть сделать.

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

Variatus 18.01.2019 02:00

Спасибо @Вариатус. Однако я вообще не меняю данные. Все, что я меняю, — это значение фильтра, и я хочу программно определять, когда значение этого фильтра изменяется.

Bruno Repetto 21.01.2019 18:59
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
46
0

Другие вопросы по теме