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

时间:2017-09-20 08:23:02

标签: vba excel-vba execution excel

我有一个带有计算项目的数据透视表。每当我更改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

2 个答案:

答案 0 :(得分:0)

使用以下内容比较两个字符串,例如Target.Address"$d$1"

If Target.Address = "$d$1" Then

..永远不能等同于TRUE,就好像Target.Address确实引用第4列第1行一样,它会保留字符串"$D$1"。使用=进行比较主要使用二进制比较

您需要将其更正为"$D$1",或使用文本比较方法与StrComp函数。

逐步完成活动,将鼠标悬停在Target.Address上会突出显示此内容。

答案 1 :(得分:0)

正如另一张海报所提到的 - 二进制比较永远不会评估你对True的参数你可以将地址保存为字符串并将参数更改为If Target.Address = [Assigned String Name] Then但是改变它会更好以下论点:

If Not Intersect(Target, Range("$D$1")) Is Nothing And Target.Cells.Count = 1 Then

    'code here

End If

这样可以降低代码行为不符合您预期的风险,并且只有在只更改D1时才会传递参数,并且正如下面的注释所说,是更合适的代码。