Excelmacros:设置工作簿位置的variables?

我需要编写一个macros脚本,将从一个xml工作簿中复制数据,并将值粘贴到另一个工作簿。 我已经写了下面的macros,工作正常,但我需要每周运行这个几个不同的文件,所以这意味着我必须replace每个运行的文档名称。

这是我到目前为止:

Sub copying() ''''''Section 1'''''' Workbooks("Results_2561").Activate 'workbook i'm copying from Range("B27:B41").Select Selection.Copy Workbooks("Overall_Results").Activate 'workbook i'm pasting to Range("G2").PasteSpecial ''''''Section 2'''''' Workbooks("Results_2561").Activate Range("C27:C41").Select Selection.Copy Workbooks("Overall_Results").Activate Range("C2").PasteSpecial ''''''Section 3'''''' Workbooks("Results_2561").Activate Range("I28:I40").Select Selection.Copy Workbooks("Overall_Results").Activate Range("G17").PasteSpecial ''''''Section 4'''''' Workbooks("Results_2561").Activate Range("J28:J40").Select Selection.Copy Workbooks("Overall_Results").Activate Range("C17").PasteSpecial End Sub 

…这只是脚本的一半。 有没有办法,我可以在开始声明一个variables,并将其设置为工作簿文件path,所以我可以打电话,而不是键入和重新键入它一遍又一遍? 最好不要使用类似的东西

 Dim book1 as Workbook Set book1 = Workbooks.Open("C://Results_2561.xlsm") 

..当我运行脚本时,这不断打开和closures文档。

谢谢

因为你只是在复制值感兴趣,你可以使用这个帮手Sub

 Sub CopyValues(rngToCopyFrom As Range, rngToCopyTo As Range) With rngToCopyFrom rngToCopyTo.Resize(.Rows.COUNT, .Columns.COUNT).Value = .Value End With End Sub 

在你的主代码中被利用如下:

 Sub main() Dim wsTo As Worksheet Set wsTo = Workbooks("Overall_Results").ActiveSheet '<--| set the worksheet to paste values to With Workbooks("Results_2561").ActiveSheet '<--| reference the worksheet to copy values from CopyValues .Range("B27:B41"), wsTo.Range("G2") CopyValues .Range("C27:C41"), wsTo.Range("C2") CopyValues .Range("I28:I40"), wsTo.Range("G17") CopyValues .Range("J28:J40"), wsTo.Range("C17") End With End Sub 

如果您的相关工作簿有多个表单,那么就replace

 ActiveSheet 

 Worksheets("myRelevantShetName") '<--|change "myRelevantShetName" to the actual name of the relevant worksheet in each workbook 

首先,你不必每次都要激活工作簿,当你想复制/粘贴的东西。 只需在Range()属性中声明它,例如:

 ''''''Section 1'''''' Workbooks("Results_2561").Sheets(1).Range("B27:B41").Copy Workbooks("Overall_Results").Sheets(1).Range("G2").PasteSpecial 

您可以将Workbook设置为如下的variables:

 Sub copying() Dim wb1 As Workbook, wb2 As Workbook Set wb1 = Workbooks("Results_2561") Set wb2 = Workbooks("Overall_Results") ''''''Section 1'''''' wb1.Sheets(1).Range("B27:B41").Copy wb2.Sheets(1).Range("G2").PasteSpecial End Sub 

最后,如@ASHbuild议的那样,您可以添加一个文件对话框,指出要使用的文件。 我已经把它放在了一些函数中(不要忘记把它和你的copyingmacros放在同一个项目中):

 Function strPath() As String Dim intResult As Integer Application.FileDialog(msoFileDialogFilePicker).Title = "Select file" intResult = Application.FileDialog(msoFileDialogFilePicker).Show If intResult <> 0 Then strPath = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) End If End Function 

所以你的第一部分的最终代码如下所示:

 Sub copying() Dim wb1 As Workbook, wb2 As Workbook MsgBox "Show file to copy form." Set wb1 = Workbooks.Open(strPath()) MsgBox "Show file to paste in." Set wb2 = Workbooks.Open(strPath()) ''''''Section 1'''''' wb1.Sheets(1).Range("B27:B41").Copy wb2.Sheets(1).Range("G2").PasteSpecial End Sub