错误 1004 - 使用变量而不是硬代码时无法在 OLAP 多维数据集中找到项目

Error 1004 - item could not be found in OLAP cube when using variables instead of hard codes

我需要从链接到外部数据源的 Excel 文件中的数据透视表 table 复制数据。难点在于 select 主元字段中的句点。

宏应该以一个输入框开始,供用户输入日期,这样宏就可以select月份进行进一步处理。

YearMonth = InputBox("Input Year & Month of the report, e.g. 202007", "Input Year & Month")
yr = Left(YearMonth, 4)
mth = Right(YearMonth, 2)

      If mth = "01" Then longmth = "JAN"
      If mth = "02" Then longmth = "FEB"
      If mth = "03" Then longmth = "MAR"
      If mth = "04" Then longmth = "APR"
      If mth = "05" Then longmth = "MAY"
      If mth = "06" Then longmth = "JUN"
      If mth = "07" Then longmth = "JUL"
      If mth = "08" Then longmth = "AUG"
      If mth = "09" Then longmth = "SEP"
      If mth = "10" Then longmth = "OCT"
      If mth = "11" Then longmth = "NOV"
      If mth = "12" Then longmth = "DEC"

数据透视字段的名称是“年”。此过滤器适用于 select 年份,分为季度,然后分为月份(如下图所示)

由于我不确定如何将其编码为 select 正确的月份,因此我尝试通过 select 仅记录“2020 年 8 月”来记录宏以供参考。下面是记录的代码:

    ActiveSheet.PivotTables("PivotTable1").PivotFields("[Time].[Time].[Year]"). _
        VisibleItemsList = Array("")
    ActiveSheet.PivotTables("PivotTable1").PivotFields("[Time].[Time].[Quarter]"). _
        VisibleItemsList = Array("")
    ActiveSheet.PivotTables("PivotTable1").PivotFields("[Time].[Time].[Month]"). _
        VisibleItemsList = Array("[Time].[Time].[Month].&[2020 AUG]")

我想我可以创建一个变量(下面的 ExactDate),以便 selection 标准基于 InputBox 中的条目(例如 202008 --> 转换为“2020 AUG” , 依此类推)

'Select the relevant month and year on the pivot table
    ExactDate = yr + " " + longmth
    
With ActiveSheet.PivotTables("PivotTable1")
    .PivotFields("[Time].[Time].[Year]").VisibleItemsList = Array("")
    .PivotFields("[Time].[Time].[Quarter]").VisibleItemsList = Array("")
    .PivotFields("[Time].[Time].[Month]").VisibleItemsList = Array("[Time].[Time].[Month].&[ExactDate]")

它抛出

"Run-time error '1004':
The item could not be found in the OLAP Cube."

在调试中,这段代码高亮显示

.PivotFields("[Time].[Time].[Month]").VisibleItemsList = Array("[Time].[Time].[Month].&[ExactDate]")

我用硬代码替换了变量ExactDate(任何年份和月份,如下所示):

.PivotFields("[Time].[Time].[Month]").VisibleItemsList = Array("[Time].[Time].[Month].&[2019 SEP]")

而且有效。

正文相同;唯一的区别是固定值与分配变量。

为了回答为什么需要双引号和符号的问题,这里是我的完整答案:

在 VBA 中,您使用 Dim 语句声明变量(至少是推荐的方式)。

因此,在您的情况下,此行应该作为 良好做法:

Dim ExactDate as String

然后,文字字符串应该用双引号括起来。

在你的情况下,像这样:

"[Time].[Time].[Month].&["

为了连接两个字符串或一个字符串和一个变量,您可以使用符号 &

因此,完成代码中的示例后,要过滤 VisibleItemsList 的字符串将是:

Array("[Time].[Time].[Month].&[" & ExactDate & "]"

由于 ExactDate 表示一个字符串,因此连接将起作用。

希望解释清楚。