我正在从一个文件复制到另一个文件,我可以看到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
答案 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