【问题标题】:VBA - works in debug but sometimes get runtime errorVBA - 在调试中工作,但有时会出现运行时错误
【发布时间】:2021-02-10 23:19:42
【问题描述】:

我有一个数据透视表,我正在为同事“打样”它。我创建了 7 个按钮,一个用于一周中的每一天。我已将宏附加到它们,以便数据透视表更改布局以显示单击按钮当天的数据。它有时有效,但我经常收到“运行时错误'1004':无法设置 PivotField 类的方向属性”错误。我选择调试并在 VBA 中运行它,它工作正常。我关闭 VBA,然后宏工作......有时。然后重复整个过程。

这是某一天的代码(除了设置可见字段时,它们都相同,我使用特定日期):

   Sub Sun()
'Sunday Macro

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
    ActiveSheet.PivotTables("PivotTable1").PivotFields("1 Sun").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("2 Mon").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("3 Tue").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("4 Wed").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("5 Thu").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("6 Fri").Orientation = _
        xlHidden
    ActiveSheet.PivotTables("PivotTable1").PivotFields("7 Sat").Orientation = _
        xlHidden
    With ActiveSheet.PivotTables("PivotTable1").PivotFields("1 Sun")
        .Orientation = xlRowField
        .Position = 8
    End With
    ActiveWorkbook.SlicerCaches("Slicer_1_Sun").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_2_Mon").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_3_Tue").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_4_Wed").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_5_Thu").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_6_Fri").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_7_Sat").ClearManualFilter
    With ActiveWorkbook.SlicerCaches("Slicer_1_Sun")
        .SlicerItems("6am").Selected = True
        .SlicerItems("x").Selected = True
        .SlicerItems("off").Selected = False
        .SlicerItems("(blank)").Selected = False
        .SlicerItems("5th").Selected = True
        .SlicerItems("6th").Selected = True
        .SlicerItems("PTO").Selected = True
    End With
End Sub

当我打开调试时,第一个 activesheet 命令突出显示,提示我应该从这里开始修复。

运行宏的按钮在它需要运行的工作表上,因此没有理由指定工作表,但我已经尝试了两种方式,但仍然存在同样的问题。

想法?

更新后的代码仍然出现同样的错误。

这里是指定工作表的更新版本:

    Sub Tue()
'Tuesday Macro

Sheets("CrewSheets").PivotTables("PivotTable1").PivotCache.Refresh
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("1 Sun").Orientation = _
        xlHidden
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("2 Mon").Orientation = _
        xlHidden
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("3 Tue").Orientation = _
        xlHidden
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("4 Wed").Orientation = _
        xlHidden
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("5 Thu").Orientation = _
        xlHidden
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("6 Fri").Orientation = _
        xlHidden
    Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("7 Sat").Orientation = _
        xlHidden
    With Sheets("CrewSheets").PivotTables("PivotTable1").PivotFields("3 Tue")
        .Orientation = xlRowField
        .Position = 8
    End With
    ActiveWorkbook.SlicerCaches("Slicer_1_Sun").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_2_Mon").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_3_Tue").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_4_Wed").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_5_Thu").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_6_Fri").ClearManualFilter
    ActiveWorkbook.SlicerCaches("Slicer_7_Sat").ClearManualFilter
    With ActiveWorkbook.SlicerCaches("Slicer_3_Tue")
        .SlicerItems("off").Selected = False
        .SlicerItems("x").Selected = True
        .SlicerItems("(blank)").Selected = False
        .SlicerItems("5th").Selected = True
        .SlicerItems("6th").Selected = True
        .SlicerItems("PTO").Selected = True
    End With

End Sub

【问题讨论】:

  • 指定工作表:Worksheet("Sheet1") 而不是使用ActiveSheet
  • 通过一些测试,我了解到,当我第一次打开工作簿时,我第一次点击一天,代码可以工作,但第二次点击另一天(哪一天似乎不相关)。如果我已经在星期日以外的任何其他日子被选中,当我点击星期日时,它允许我在第二次尝试时点击星期一。似乎只适用于先选择星期天然后星期一。除了第一次尝试之外,似乎没有其他日期组合允许我选择其他日期。
  • 我已经尝试过使用之前指定的工作表,但按照您的建议进行了操作。再次执行了多次测试,同样的错误。
  • 错误信息是什么?
  • “运行时错误‘1004’:无法设置 PivotField 类的 Orientation 属性”

标签: excel vba


【解决方案1】:

强烈不建议在宏中使用ActiveSheet,尤其是当您的工作簿的工作表看起来不同时(这里很可能就是这种情况)。

如果您的代码与不同的工作表相关,那么您可以使用以下内容开始您的宏:

if ActiveSheet.Name <> "This is the correct one"
then Exit sub
else ... (here you have the rest of your original macro)
end if

祝你好运

由于问题似乎与工作表本身无关,因此我一直在寻找其他解决方案,并找到了this URL

这能回答你的问题吗?

【讨论】:

  • 我已经使用活动工作表和指定工作表运行它,并且都给了我同样的错误。尽管如此,我已经指定了工作表以避免将来可能出现的任何错误。
  • @Jason:我一直在查看该网站,发现一个带有类似错误消息的问题。你能看看这个吗?
  • 我试图通读那个讨论,我认为有一个解决方案,但我不确定如何让它与我的代码一起工作。我尝试了一个已发布的更新解决方案(带有 pivotitems.visible=false 但如果它是实际解决方案则没有反馈的解决方案),但我也无法让该解决方案为我工作。
【解决方案2】:

不要一遍又一遍地重复相同的代码。而是使用带有如下所示参数的过程和函数。

Sub Sun()Sub Mon() 等仅在您想将它们链接到按钮或其他东西时才需要。否则,您可以省略它们并在需要时直接运行PreparePivot "1 Sun" 形成其他程序。

Option Explicit

Public Sub Sun()
    PreparePivot "1 Sun"
End Sub

Public Sub Mon()
    PreparePivot "2 Mon"
End Sub

'and so on for other days

Private Sub PreparePivot(ByVal DayName As String)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("SheetThatHasYourPivot") 'adjust
    
    With ws
        .PivotTables("PivotTable1").PivotCache.Refresh
        .PivotTables("PivotTable1").PivotFields("1 Sun").Orientation = xlHidden
        .PivotTables("PivotTable1").PivotFields("2 Mon").Orientation = xlHidden
        .PivotTables("PivotTable1").PivotFields("3 Tue").Orientation = xlHidden
        .PivotTables("PivotTable1").PivotFields("4 Wed").Orientation = xlHidden
        .PivotTables("PivotTable1").PivotFields("5 Thu").Orientation = xlHidden
        .PivotTables("PivotTable1").PivotFields("6 Fri").Orientation = xlHidden
        .PivotTables("PivotTable1").PivotFields("7 Sat").Orientation = xlHidden
        
        With .PivotTables("PivotTable1").PivotFields(DayName) 'here it uses the parameter DayName that was submitted
            .Orientation = xlRowField
            .Position = 8
        End With
    End With
    
    With ThisWorkbook
        .SlicerCaches("Slicer_1_Sun").ClearManualFilter
        .SlicerCaches("Slicer_2_Mon").ClearManualFilter
        .SlicerCaches("Slicer_3_Tue").ClearManualFilter
        .SlicerCaches("Slicer_4_Wed").ClearManualFilter
        .SlicerCaches("Slicer_5_Thu").ClearManualFilter
        .SlicerCaches("Slicer_6_Fri").ClearManualFilter
        .SlicerCaches("Slicer_7_Sat").ClearManualFilter
        
        With .SlicerCaches("Slicer_" & Replace$(DayName, " ", "_")) 'here it replaces the space in the parameter eg "1 Sun" with an underscore "1_Sun"
            .SlicerItems("6am").Selected = True
            .SlicerItems("x").Selected = True
            .SlicerItems("off").Selected = False
            .SlicerItems("(blank)").Selected = False
            .SlicerItems("5th").Selected = True
            .SlicerItems("6th").Selected = True
            .SlicerItems("PTO").Selected = True
        End With
    End With
End Sub

这样长代码只写一次,你只需要短代码将它们链接到一个按钮。这样代码更容易维护,也更容易在所有日子里保持一致。

【讨论】:

  • 到目前为止,我使用 VBA 的经验是对录制的宏进行更改,这是有限的。我试过你的方法,效果很好! ……除了我仍然得到同样的错误。运行时错误“1004”:无法设置 PivotField 类的方向属性。我还需要指出,它通常只发生在我第二次点击一天(周日到周一除外)时。单击一天后,如果我想再次更改日期,我必须将其关闭,重新打开,然后才能单击其他日期。
  • 不确定VBA是否可以做到这一点,但我在想如果VBA可以检查哪个字段位于位置8(例如),然后将该字段插入x1Hidden命令,它会减少出错的可能性。我认为错误正在发生,因为我要求代码隐藏已经隐藏的字段......也许?
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 2020-02-25
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多