在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列。
当过滤器的值更改时,我想执行一些其他操作。为此,我使用了上面的代码,但是它不能很好地工作,因为“目标”的值不是更改的一个单元格的地址R4C102,而是整个数据透视表的地址R4C101:R29C117 ,它也会根据选择而变化。
如何从例程中哄骗地址R4C102?我不想使用Worksheet_SelectionChange,因为尽管这给了我想要的答案,但它要求首先选择保存过滤器的单元格,然后更改过滤器,这是一个2步序列不能指望最终用户记得做。