Sli*_*eve 6 excel vba dialog refresh excel-vba
在你明白之前:Application.DisplayAlerts = False
还没有解决我的问题.
我编写了一个VBA过程(在Excel 2010中启动),它循环包含不同Excel文件的数组.循环打开文件,刷新数据,保存并关闭数组中每个项目的文件.我写了一个错误catch子例程,所以我记录哪些excel文件无法打开/刷新/保存等,以便用户可以手动检查它们.
有些文件很大,涉及大量数据在网络中传输; 有时我得到一个对话框:Excel正在等待另一个应用程序完成OLE操作.
我可以Application.DisplayAlerts = False
用来禁用消息,但这可能会禁用所有警报,所以我无法捕获错误?
此外,我已经测试了使用该行,它不会停止弹出对话框.如果我按下输入它继续,但几分钟后可能会再次弹出.
有没有办法在没有停止其他警报的情况下专门停止消息?
NB.我的进程有一个Excel控件实例,它运行VBA并打开要在单独实例中刷新的工作簿.
谢谢你的帮助
我的代码的摘录在下面,其中包含刷新元素
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 ' populate 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
Application.DisplayAlerts = 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
Run Code Online (Sandbox Code Playgroud)
小智 1
“等待另一个应用程序完成 OLE 操作”不是一条警报消息,您可以关闭并忘记,有时宏将能够在之后继续,但根据我的经验,如果您收到该错误,这只是一个问题直到问题崩溃/冻结整个宏为止的时间,因此绝对应该对其进行故障排除和纠正。
仅当我使用其他 Microsoft Office 应用程序(运行代码的 Excel 除外)作为对象并且其中一个应用程序出现错误时,才会出现该错误 - 运行代码的 Excel 不知道其中之一发生了错误其他应用程序因此它等待、等待、等待,最终您收到“等待另一个应用程序完成 OLE 操作”消息...
因此,要解决此类问题,您必须查找使用其他 MSO 应用程序的位置...在您的示例中,您有一个额外的 Excel 实例,并且您正在从 Access 中提取数据,因此它很可能是这两个应用程序之一造成问题...
下面是我如何重写这段代码,更加小心代码与其他 MSO 应用程序交互的位置,显式控制它们中发生的事情。我唯一不能做的事情是GetPivotsToRefresh
因为我看不到什么正是您在这里所做的,但在我的代码中,我只是假设它返回一个数组,其中包含您想要更新的 Excel 文件的列表。参见下面的代码:
Sub Refresh_BoardPivots_Standard()
Dim pivotWB As Workbook
Dim fileList() As Variant
Dim fileCounter As Long
Application.DisplayAlerts = False
fileList = GetPivotsToRefresh 'populate array from SQL
For fileCounter = 1 To UBound(fileList, 1)
Set pivotWB = Workbooks.Open(fileList(fileCounter, 1), False, False)
If pivotWB.ReadOnly = False Then
Call refreshPivotTables(pivotWB)
pivotWB.Close (True)
Else
'... Error handler ...
pivotWB.Close (False)
End If
Next
End Sub
Public Sub refreshPivotTables(targetWB As Workbook)
Dim wsCounter As Long
Dim ptCounter As Long
For wsCounter = 1 To targetWB.Sheets.Count
With targetWB.Sheets(wsCounter)
If .PivotTables.Count > 0 Then
For ptCounter = 1 To .PivotTables.Count
.PivotTables(ptCounter).RefreshDataSourceValues
Next
.Calculate
End If
End With
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
所以我创建了自己的“刷新数据透视表”,但您可以将其嵌入到主子中,我只是认为循环和循环计数器此时可能会变得有点混乱......
希望这有帮助,TheSilkCode
归档时间: |
|
查看次数: |
31574 次 |
最近记录: |