如何访问我已打开的特定工作簿,而不使用其名称?

我正在录制这个在几个不同的文档之间传输数据的macros。 其中一本工作手册“转移模板”保持不变。 但另一个会改变。 这是我正在使用的代码。 (我知道这很慢,很多都不相关,但我只需要使它工作)。

我假设我必须用ActiveWorkbook或类似的东西replaceWindows(“RFQ_14446.xlsm”)。

Sub Initial_Transfer_Macro() ' ' Initial_Transfer_Macro Macro ' ' Windows("RFQ_14446.xlsm").Activate Range("J51").Select Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B1").Select ActiveSheet.Paste Windows("RFQ_14446.xlsm").Activate Range("D27").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B2").Select ActiveSheet.Paste Windows("RFQ_14446.xlsm").Activate Range("D5").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B3").Select ActiveSheet.Paste Windows("RFQ_14446.xlsm").Activate Range("F2").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B4").Select ActiveSheet.Paste Windows("RFQ_14446.xlsm").Activate Range("D7").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B5").Select ActiveSheet.Paste Windows("RFQ_14446.xlsm").Activate Range("D18").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B6").Select ActiveSheet.Paste Windows("RFQ_14446.xlsm").Activate Range("K6").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("D12").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B8").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("D22").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B9").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("D11").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B10").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("K18").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B11").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("K3").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B12").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("I13").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B14").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("I26").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("C14").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("I27").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B17").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("I5").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "36" Range("I5").Select Selection.Copy Windows("Transfer Template.xlsm").Activate Range("B20").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("RFQ_14446.xlsm").Activate Range("I26").Select Application.CutCopyMode = False Selection.Copy Windows("Transfer Template.xlsm").Activate Range("C20").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A1").Select Cells.Replace What:=" Rev. ", Replacement:="-", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Cells.Replace What:="RFQ ", Replacement:="", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub 

最简单的方法是在代码的开头为每个工作簿设置引用:

 Sub SO() Dim thisWorkbook As Excel.Workbook Dim otherWorkbook As Excel.Workbook Set thisWorkbook = ActiveWorkbook Set otherWorkbook = Workbooks("Transfer Template.xlsm") '// ... Rest of code here End Sub 

一旦完成,您可以引用该variables,例如:

 Debug.Print thisWorkbook.Sheets.Count 

要么

 otherWorkbook.Sheets(1).Range("A1").Value = thisWorkbook.Sheets(2).Range("B1").Value 

只是简单的例子,但应该给你的逻辑基础…


另一个值得注意的事情是,如果代码是从工作簿中运行的,那么只需使用ThisWorkbook即可:

 Sub Example() Workbooks("Transfer Template.xlsm").Activate MsgBox ActiveWorkbook.Name MsgBox ThisWorkbook.Name End Sub 

如果您不知道工作簿名称,但它是唯一同时打开的另一个(在Excel的相同实例中),则可以像这样循环它们:

 Sub TransferTemplate() Dim wbTemplate As Workbook: Set wbTemplate = ActiveWorkbook Dim wbDestination As Workbook Dim wb As Workbook For Each wb In Workbooks If wb.Name <> wbTemplate.Name Then Set wbDestination = wb End If Next wb 'Example copy wbTemplate.Worksheets(1).Range("B1").Value = wbDestination.Worksheets(1).Range("J51").Value End Sub