事件触发VBA宏运行,但不';不执行
我有一个数据透视表和计算项目。每次我在pivot主过滤器中更改参数时,文本格式都会返回到默认设置 为了避免每次都对表进行格式化,我创建了一个宏,每当我在单元格D1中输入值时,该宏都应该对透视表进行格式化。C2是样本单元格的格式。宏似乎运行,但不执行 你能帮忙吗 守则:事件触发VBA宏运行,但不';不执行,vba,excel,execution,Vba,Excel,Execution,我有一个数据透视表和计算项目。每次我在pivot主过滤器中更改参数时,文本格式都会返回到默认设置 为了避免每次都对表进行格式化,我创建了一个宏,每当我在单元格D1中输入值时,该宏都应该对透视表进行格式化。C2是样本单元格的格式。宏似乎运行,但不执行 你能帮忙吗 守则: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$d$1" Then Application.EnableEvents = Fa
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$d$1" Then
Application.EnableEvents = False
Range("C2").Activate
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ORAZ(JEŻELI($B2=" 'OFERTA/TOTAL RYNEK'";1;0);JEŻELI(C2>1;1;0))"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Font
.Color = -16776961
.TintAndShade = 0
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent6
.TintAndShade = 0.399945066682943
End With
Selection.FormatConditions(1).StopIfTrue = False
Range("C2").Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ORAZ(JEŻELI($B1=""OFERTA/TOTAL RYNEK"";1;0);JEŻELI(C1>1;1;0))"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Font
.Color = -16776961
.TintAndShade = 0
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent6
.TintAndShade = 0.399945066682943
End With
Selection.FormatConditions(1).StopIfTrue = False
Selection.Copy
Columns("C:N").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.EnableEvents = True
End If
End Sub
使用以下命令比较两个字符串,例如
Target.Address
和“$d$1”
:
If Target.Address = "$d$1" Then
If Not Intersect(Target, Range("$D$1")) Is Nothing And Target.Cells.Count = 1 Then
'code here
End If
。。不能等同于TRUE
,就好像Target.Address
引用了第4列第1行,它将保存字符串“$D$1”
。使用=
进行比较基本上使用二进制比较
您需要将其更正为“$D$1”
,或者使用带有StrComp
函数的文本比较方法
单步执行事件,并将鼠标悬停在
目标.Address
上会突出显示这一点。使用以下命令比较两个字符串,例如目标.Address
和“$d$1”
:
If Target.Address = "$d$1" Then
If Not Intersect(Target, Range("$D$1")) Is Nothing And Target.Cells.Count = 1 Then
'code here
End If
。。不能等同于TRUE
,就好像Target.Address
引用了第4列第1行,它将保存字符串“$D$1”
。使用=
进行比较基本上使用二进制比较
您需要将其更正为“$D$1”
,或者使用带有StrComp
函数的文本比较方法
单步执行事件,并将鼠标悬停在
目标.Address
上会突出显示此内容。如另一张海报所述-二进制比较不会将参数计算为True
您可以将地址另存为字符串,如果Target.Address=[Assigned string Name],则将参数更改为然后
但最好将参数更改为以下内容:
If Target.Address = "$d$1" Then
If Not Intersect(Target, Range("$D$1")) Is Nothing And Target.Cells.Count = 1 Then
'code here
End If
这降低了代码行为与预期不符的风险,也降低了只有D1发生变化时才会传递参数的风险,如下面的注释所述,是更合适的代码。如另一张海报所述-二进制比较不会将您的参数计算为
True
您可以将地址另存为字符串,如果Target.address=[分配的字符串名称]则将参数更改为然后
但最好将参数更改为以下内容:
If Target.Address = "$d$1" Then
If Not Intersect(Target, Range("$D$1")) Is Nothing And Target.Cells.Count = 1 Then
'code here
End If
这降低了代码行为不符合预期的风险,也因为只有D1发生变化时,它才会传递参数,并且正如下面的注释所述,是更合适的代码。对于初学者,您需要
如果Target.Address=“$D$1”则
。对于初学者,您需要如果Target.Address=“$D$1”则
。公平地说,OP,过了很长时间,才有人向我指出如何逐步完成事件过程(即通过添加Stop
语句)。也许还有其他方法。@SJR您可以通过单击边距在事件过程中设置断点。@VincentG-您可以,我怎么会不知道呢@SJR好吧,你也可以使用F9键,或者用手使用工具栏按钮(不确定它是否默认显示,你可能需要自定义工具栏)公平地说,有人告诉我如何逐步完成事件过程(通过添加Stop
语句)花了很长时间。也许还有其他方法。@SJR您可以通过单击边距在事件过程中设置断点。@VincentG-您可以,我怎么会不知道呢@SJR好的,您也可以使用F9键,或者用手使用工具栏按钮(不确定默认情况下是否显示,您可能需要自定义工具栏)如果Target=Range($D$1”)
-不,这是错误的,因为它会比较值。使用地址
是一种方法(或相交
)@SJR我接受你的论点,并更新了我的答案,因此我不会使用“更容易”这个词。我会用“更好”这个词。这并不容易(输入的内容更多),但却是一种更好的方法。但是您没有提到为什么,这可能会对OP有所帮助。(为什么-因为如果一次更改了多个单元格-例如,Target.Address=“$D$1:$D$2”
,不使用Intersect
将意味着如果只查找单个单元格地址,更改将被忽略。)如果Target=Range($D$1”)
-否,这是错误的,因为它将比较值。使用地址
是一种方法(或相交
)@SJR我接受你的论点,并更新了我的答案,因此我不会使用“更容易”这个词。我会用“更好”这个词。这并不容易(输入的内容更多),但却是一种更好的方法。但是,您没有提到原因,这可能会对OP有所帮助。(原因-因为如果一次更改多个单元格-例如Target.Address=“$D$1:$D$2”
,如果不使用Intersect
,则如果只查找单个单元格地址,则将忽略更改。)