Vba 在工作簿之间复制和粘贴,而不激活任何工作簿
以下代码在不同工作簿之间复制和粘贴。我不知道为什么没有“Source.Activate”和“Master.Activate”行它就不能工作?换句话说,尽管工作簿在开始时已声明和设置,但为什么仍需要激活它们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
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
参考),则会有问题,但我看不到需要激活的任何其他原因。