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

时间:2014-06-04 17:38:21

标签: excel vba excel-vba

我正在从一个文件复制到另一个文件,我可以看到Excel在源文件和目标文件之间切换(如闪烁)。我希望宏从源代码复制并粘贴到目标文件,不要在文件之间切换(我不想闪烁)。

所以这里我得到了我的Excel VBA代码。我设置了一个Button来运行2个宏。第一个宏是openfiledialog,我可以选择要打开的文件。这是必需的,因为所需的文件总是有不同的名称,并且位于不同的路径中。

打开文件后,我的第二个宏开始(CopyPasteValues),我在下面发布的那个。首先,我设置我的源和目标工作簿/工作表,并创建一个包含16个帐号的数组。

然后我使用find方法搜索每个文件(源和目标)中的帐号。 find方法的结果用于在src文件中创建偏移量并将其复制到目标文件中的偏移量。

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

1 个答案:

答案 0 :(得分:8)

(安迪G的评论中回答):

在子开头使用Application.ScreenUpdating = False。请记住最后将其设置回True(这也是在错误处理程序中执行此操作的好方法,因此即使出现错误也会重置):

Sub foo()
  On Error Goto errHandler
  Application.ScreenUpdating = False

  'Your code here

  Application.ScreenUpdating = True
errHandler:
  Application.ScreenUpdating = True
End Sub