2017-02-21 140 views
6

前缀:我的代码打开一个外部工作簿,其中包含一些对整个组织不可见的信息。我可以打开外部工作簿,并成功从PivotTable中检索所有数据。防止屏幕在打开第二个工作簿时闪烁(同一实例)

问题:当我的代码运行时,屏幕闪烁约0.5秒以显示其他工作簿。

目标:在工作簿之间切换时,屏幕上不会有任何闪烁。

我的代码(相关部分):

Option Explicit 

Public Sub GetBudgetData_fromPivotTable(Budget_ShtName As String, Budget_PvtName As String) 

Dim BudgetWB       As Workbook 
Dim PvtTbl        As PivotTable 
Dim pvtFld        As PivotField 
Dim strPvtFld       As String 
Dim prjName        As String 

' ****** This is the Section I am trying to prevent from the screen to flicker ****** 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

' read budget file parameters 
Set BudgetWB = Workbooks.Open(BudgetFile_Folder & BudgetFile_wbName) 

BudgetWB.Windows(1).Visible = False 
OriginalWB.Activate ' <-- this is the original workbook that is calling the routine 

Set PvtTbl = BudgetWB.Worksheets(Budget_ShtName).PivotTables(Budget_PvtName) 

' a lot of un-relevant code line 

BudgetWB.Close (False) ' close budget file 
OriginalWB.Activate 

' restore settings 
Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

End Sub 
+0

只是一个解决方法的想法 - 如何激活一个大型的非模态用户表单?然后闪烁会留在后台。 – Vityata

+0

或另一个想法 - 设置整个Excel应用程序不可见,同时打开BudgetWB - 'application.Visible = false',然后将其设置回来。 – Vityata

+0

@Vityata我宁愿不打开第二个Excel实例 –

回答

3

为了最大限度地减少屏幕闪烁,我认为以下应工作;它添加了隐藏ActiveWindow的一个步骤,一旦关闭ScreenUpdating以允许在重置可见性级别之前打开和隐藏工作簿。当我尝试它时,功能区似乎停用并激活,但电子表格保持无闪烁。不知道这是否足以对您有所改进...

Public Sub GetBudgetData_fromPivotTable(Budget_ShtName As String, Budget_PvtName As String) 

    Dim BudgetWB       As Workbook 
    Dim PvtTbl        As PivotTable 
    Dim pvtFld        As PivotField 
    Dim strPvtFld       As String 
    Dim prjName        As String 

    ' ****** This is the Section I am trying to prevent from the screen to flicker ****** 
    Dim wbWindow As Window: Set wbWindow = ActiveWindow 
    ' Freeze current screen 
    Application.ScreenUpdating = False 
    wbWindow.Visible = False 

    ' read budget file parameters 
    Set BudgetWB = Workbooks.Open(BudgetFile_Folder & BudgetFile_wbName) 
    BudgetWB.Windows(1).Visible = False 

    ' Reset current screen 
    wbWindow.Visible = True 
    Application.ScreenUpdating = True 

    OriginalWB.Activate ' <-- this is the original workbook that is calling the routine 

    Set PvtTbl = BudgetWB.Worksheets(Budget_ShtName).PivotTables(Budget_PvtName) 

    ' a lot of un-relevant code line 

    BudgetWB.Close (False) ' close budget file 
    OriginalWB.Activate 

    ' restore settings 
    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 

End Sub 
+0

这是一个改进,仍然filcker,但它减少。任何想法如何完全消除闪烁? –

+0

我不确定这可能来自我所做的试验和研究。我发现在打开文件之前禁用事件往往会缩短闪烁时间; (并优先使用这个设置活动窗口为隐藏给了我最好的结果) – Tragamor

+0

谢谢:)它并没有消除所有的闪烁,但它已经减少了很多“悬挂”屏幕! –

0

另一个解决方法是,如果你喜欢它,那将起作用。这个想法是,您将工作簿中的透视表复制到工作表中,然后从那里开始工作。将工作表隐藏起来,一旦准备好工作 - 删除它。

Option Explicit 

Sub ImportSheet() 

    Dim wbBk   As Workbook 
    Dim wsSht   As Worksheet 
    Dim sImportFile  As String 
    Dim sFile   As String 
    Dim sThisBk   As Workbook 
    Dim vfilename  As Variant 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 

    Set sThisBk = ActiveWorkbook 
    sImportFile = Application.GetOpenFilename(_ 
    FileFilter:="Microsoft Excel Workbooks, *.xls; *.xlsx", Title:="Open Workbook") 

    vfilename = Split(sImportFile, "\") 
    sFile = vfilename(UBound(vfilename)) 
    Application.Workbooks.Open Filename:=sImportFile 

    Set wbBk = Workbooks(sFile) 
    If SheetExists("MyPivotData") Then 
     Set wsSht = wbBk.Sheets("MyPivotData") 
     wsSht.Copy 
     ThisWorkbook.Sheets("MyPivotData").Visible = xlSheetVeryHidden 
    End If 

    'do your work 
    'then delete the added sheet 

    wbBk.Close SaveChanges:=False 

    Application.ScreenUpdating = True 
    Application.DisplayAlerts = True 

End Sub 

Private Function SheetExists(sWSName As String) As Boolean 

    Dim ws As Worksheet 
    On Error Resume Next 
    Set ws = Worksheets(sWSName) 
    If Not ws Is Nothing Then SheetExists = True 

End Function