Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
事件触发VBA宏运行,但不';不执行_Vba_Excel_Execution - Fatal编程技术网

事件触发VBA宏运行,但不';不执行

事件触发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

我有一个数据透视表和计算项目。每次我在pivot主过滤器中更改参数时,文本格式都会返回到默认设置

为了避免每次都对表进行格式化,我创建了一个宏,每当我在单元格D1中输入值时,该宏都应该对透视表进行格式化。C2是样本单元格的格式。宏似乎运行,但不执行

你能帮忙吗

守则:

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
,则如果只查找单个单元格地址,则将忽略更改。)