Цель в коде события изменения не дает мне то, что я хочу - PullRequest
0 голосов
/ 18 января 2019

В подпрограмме события 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, потому что, хотя это и дает мне нужный мне ответ, требует , чтобы я сначала выделил ячейку, содержащую фильтр, а затем изменил фильтр. не ожидайте, что конечные пользователи не забудут это сделать.

...