Vba 在工作簿之间复制和粘贴,而不激活任何工作簿

Vba 在工作簿之间复制和粘贴,而不激活任何工作簿,vba,excel,Vba,Excel,以下代码在不同工作簿之间复制和粘贴。我不知道为什么没有“Source.Activate”和“Master.Activate”行它就不能工作?换句话说,尽管工作簿在开始时已声明和设置,但为什么仍需要激活它们 Dim Source As Worksheet Set Source = Workbooks("Source.xlsx").Worksheets("Settlements") Dim Master As Worksheet Set Master = Workbooks("Master.xlsm

以下代码在不同工作簿之间复制和粘贴。我不知道为什么没有“Source.Activate”和“Master.Activate”行它就不能工作?换句话说,尽管工作簿在开始时已声明和设置,但为什么仍需要激活它们

Dim Source As Worksheet
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements")
Dim Master As Worksheet
Set Master = Workbooks("Master.xlsm").Worksheets(Sheets.Count)

Source.Activate '???

For Each cell In Source.Columns("M").Cells
    If cell <> "" Then
        Master.Activate '???
            For Each cell2 In Master.Columns("J").Cells
                If cell2 <> "" Then
                    If cell = cell2 Then
                        cell2.Offset(0, 9).Value = cell.Offset(0, -2).Value
                        cell2.Offset(0, 8).Value = cell.Offset(0, -8).Value
                    End If
                End If
            Next cell2
     End If
Next cell
Dim源代码为工作表
设置源=工作簿(“Source.xlsx”)。工作表(“结算”)
将主控形状设置为工作表
Set Master=工作簿(“Master.xlsm”)。工作表(Sheets.Count)
来源.激活'???
对于Source.Columns(“M”)单元格中的每个单元格
如果是单元格“”,则
主人,激活???
主列(“J”)单元格中的每个单元格2
如果是“2”,则
如果cell=cell2,则
cell2.Offset(0,9).Value=cell.Offset(0,-2).Value
cell2.Offset(0,8).Value=cell.Offset(0,-8).Value
如果结束
如果结束
下一单元2
如果结束
下一个细胞
提前感谢,,
Bartek执行复制/粘贴时,源工作簿和目标工作簿都不必处于活动状态。例如:

Sub Macro1()
    Dim b1 As Workbook, b2 As Workbook
    Dim r1 As Range, r2 As Range

    Workbooks.Open Filename:="C:\TestFolder\1\1.xlsx"
    Set b1 = ActiveWorkbook
    Set r1 = b1.Sheets("Sheet1").Range("A1")

    Workbooks.Open Filename:="C:\TestFolder\1\2.xlsx"
    Set b2 = ActiveWorkbook
    Set r2 = b1.Sheets("Sheet1").Range("A1")

    ThisWorkbook.Activate
    r1.Copy r2
End Sub

您根本不需要激活或任何与活动工作簿相关的操作。 但是您确实需要使用match或find,而不是在主文件中的每个单元格中循环

非iError
是跳过非匹配项,因为Match在找不到匹配项时会抛出错误。Match函数返回它找到的第一个匹配项的行号

另一件事是
.Worksheets(Sheets.Count)
返回工作簿中的最后一个工作表,为什么不将其设置为与source is类似的工作表名称

Dim Source As Worksheet
Dim Master As Worksheet
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements")
Set Master = Workbooks("Master.xlsm").Worksheets(Sheets.Count)

For Each c In Source.Columns("M").Cells
    If c <> "" Then

                    If Not Application.WorksheetFunction.IsError(Application.Match(c, Master.Columns("J"), 0)) Then
                        crow = Application.Match(c, Master.Columns("J"), 0)
                         Master.Range("J" & crow).Offset(0, 9).Value = c.Offset(0, -2).Value
                         Master.Range("J" & crow).Offset(0, 8).Value = c.Offset(0, -8).Value
                    End If
                'End If
            'Next cell2
     End If
Next c
Dim源代码为工作表
将主控形状设置为工作表
设置源=工作簿(“Source.xlsx”)。工作表(“结算”)
Set Master=工作簿(“Master.xlsm”)。工作表(Sheets.Count)
对于源列(“M”)单元格中的每个c
如果是“c”,则
如果不是Application.WorksheetFunction.IsError(Application.Match(c,Master.Columns(“J”),0)),那么
crow=Application.Match(c,主列(“J”),0)
主范围(“J”和“crow”)。偏移量(0,9)。值=c.偏移量(0,-2)。值
主范围(“J”和“crow”)。偏移量(0,8)。值=c.偏移量(0,-8)。值
如果结束
"完"
“下一个牢房2
如果结束
下一个c

不需要这样做。你是说没有
Activate
行它就不能工作吗?这看起来很麻烦-你在一百万个细胞中循环。是的,没有“激活”它就不能工作。会发生什么?错误?错误是什么?您的行
Set Master=Workbooks(“Master.xlsm”)。工作表(Sheets.Count)
如果
Master.xlsm
不是活动工作簿(由于不合格的
Sheets
参考),则会有问题,但我看不到需要
激活的任何其他原因。