如何防止Excel VBA中的窗口闪烁/切换

我知道我的“问题”看起来很奇怪,但我希望我能解释我的意思,我希望你们能帮助我。 我得到了一个没有任何错误的Excel VBA代码。 我从一个文件复制到另一个文件。 我遇到的问题是我可以看到Excel如何在源文件和目标文件之间切换(如闪烁)。 我希望macros从源文件复制粘贴到目标文件之间切换(我不想闪烁)

所以在这里我得到了我的Excel VBA代码。 我设置了一个Button来运行2个macros。 第一个macros是一个openfiledialog,我可以select要打开的文件。 这是必需的,因为所需的文件总是有不同的名称,并在不同的path。 我没有向你展示macros,因为它与我想要问的不相关。

打开文件后,我的第二个macros开始(CopyPasteValues),我在下面发布。 起初,我设定我的源和目标工作簿/工作表,并创build一个16个帐号的数组。 然后我使用find方法在每个文件(源和目标)中search帐号。 find方法的结果用于在src文件中创build偏移量,并将其复制到目标文件中的偏移量。

如前所述。 macros运行平稳无误。 我只是不想切换(闪烁效果)。 我尝试了很多东西,似乎我找不到解决scheme。

这就是为什么我想:互联网做你的事情。 我真的希望你们能帮助我。

Sub CopyPasteValues() Dim srcWb As Workbook 'source Wb Dim srcWs As Worksheet 'source Ws Dim trgWb As Workbook 'target Wb Dim trgWs As Worksheet 'target Ws Set trgWb = ActiveWorkbook Set trgWs = trgWb.Sheets("Entry Sheet 20004100") Set srcWb = Workbooks.Open(Filename:=openedFile, UpdateLinks:=False, ReadOnly:=True, Editable:=False) Set srcWs = srcWb.Sheets("20004100") Dim GLAccountField 'Array of 16 Account numbers GLAccountField = Array(430000, 446030, 477030, 474210, 446075, 472700, 472710, 476000, 476100, 476610, 452200, 454700, 471300, 473110, 490000, 490710) Dim srcFinder As Range, trgFinder As Range Dim searchGL As Long Dim srcRng As Range, trgRng As Range Dim i As Integer For i = LBound(GLAccountField) To UBound(GLAccountField) 'The range where GL Accounts will be searched Set srcRng = srcWs.Range("A1:A100") 'source file Set trgRng = trgWs.Range("B10:B900") 'target file 'search for the account number(i) in source and target sheets searchGL = GLAccountField(i) Set srcFinder = srcRng.Find(searchGL, Lookat:=xlWhole, LookIn:=xlValues, MatchCase:=True) Set trgFinder = trgRng.Find(searchGL, Lookat:=xlWhole, LookIn:=xlValues, MatchCase:=True) 'If finder value equals searched Account Number, then paste to target If srcFinder Is Nothing Then MsgBox "GL Account: " & searchGL & " NOT found in 'Accounting Input' file" Else 'copy from source srcFinder.Offset(0, 15).Resize(1, 12).Copy 'paste to target from source trgFinder.Offset(1, 4).Resize(1, 12).PasteSpecial xlPasteValues End If Next i srcWb.Close End Sub 

(Andy G在评论中回答):

在子文件开始处使用Application.ScreenUpdating = False 。 请记住在最后将它设置为True (在error handling程序中执行此操作也是一个很好的做法,因此即使在发生错误时也会重置):

 Sub foo() On Error Goto errHandler Application.ScreenUpdating = False 'Your code here Application.ScreenUpdating = True errHandler: Application.ScreenUpdating = True End Sub