VBA代码将使用SQL Server源而不是Excel源刷新枢轴

时间:2014-09-05 10:52:51

标签: sql-server vba excel-vba refresh pivot

我编写了VBA代码,它接受一组excel文件,然后打开它们,刷新枢轴,保存和关闭文件。它适用于任何只有连接到SQL服务器以刷新数据的枢轴的工作簿。如果工作簿还包含一个基于工作簿本身保存的数据的数据透视表,则该过程将失败并显示错误:

无法打开数据透视表源文件:'" \ nch \ dfs \ SharedArea \ Private \ BIS \ Groups \ KPI-Group \ Pivots \ [Hand-Hygiene-Audits.xls&#34 ] QPS'

正如我所说,数据透视表源与枢轴位于同一张表内。如果我在工作簿中手动刷新全部没有问题。 (QPS是此示例中手动数据和相关枢轴的选项卡)

(请注意,我必须在路径和文件名之间添加一个空格,因为Stackoverflow代码格式化会在\ Pivots出于某种原因后删除反斜杠)

值得注意的是,方括号通常不会在文件名周围显示,它们似乎只出现在此错误消息中。我在网上搜索过,大多数谈过方括号问题的人都说从IE下载文件的位置。就我而言,所有三个受影响的文件都是从内部开始生成的。

我的代码处理刷新元素的摘录如下。如果你想看到我的其他代码让我知道,我会发布它。

有没有人知道发生了什么?

Sub Refresh_BoardPivots_Standard()
'    On Error GoTo Errorhandler

Dim i
Dim errorText As String
Dim x
Dim objXL As Excel.Application
Set objXL = CreateObject("Excel.Application")

GetPivotsToRefresh ' populates array from SQL
For Each i In StandardBoardPiv
DoEvents
'If File_Exists(i) Then
    If isFileOpen(i) = True Then
    errorText = i
    Failed(failedIndex) = errorText
    failedIndex = failedIndex + 1
    Else
    objXL.Visible = True 'False
     objXL.Workbooks.Open FileName:=i
        If objXL.ActiveWorkbook.ReadOnly = False Then
        BackgroundQuery = False
        objXL.ActiveWorkbook.RefreshAll
        objXL.Application.CalculateFull
        objXL.Application.DisplayAlerts = False
        objXL.ActiveWorkbook.Save
        objXL.Application.DisplayAlerts = True
        objXL.Quit
        Else
        errorText = i
        Failed(failedIndex) = errorText
        failedIndex = failedIndex + 1
        objXL.Application.DisplayAlerts = False
        objXL.Quit
        Application.DisplayAlerts = True
        End If
    End If
'        Else
'        errorText = i
'        Failed(failedIndex) = errorText
'        failedIndex = failedIndex + 1
'    End If
DoEvents
If Ref = False Then
Exit For
End If

Next i

Exit Sub

'Errorhandler:
'
'errorText = i
'Failed(failedIndex) = errorText
'failedIndex = failedIndex + 1

'Resume Next
End Sub

1 个答案:

答案 0 :(得分:0)

看起来我可以回答我自己的问题,但我不明白为什么我的第一种方法适用于85%的文件。

我之前使用此方法的项目使用了硬编码文件名,在填充数组时需要用双引号括起来。我的最新方法将文件名存储在sql表中,并将它们加载到vba sub中。不幸的是,我没有注意到双引号仍然存在,不再需要。该过程仍然打开并刷新了85%的文件,但在其中一些文件上抛出了这个奇怪的错误。

从文件名和进程中删除的引号执行正常。