在以下代码中,“Master.Activate”中的“Sheets.Count”仅在运行宏之前通过鼠标单击手动选择“源”工作簿时有效。否则,“Master.Activate”将激活“Master”工作簿的第一个工作表,而不是执行Sheets.Count
并选择最后一个工作表。这基本上意味着宏必须从“主”工作簿运行,但只有在单击“源”工作簿之后。对于如何解决这个问题的任何建议,我将不胜感激。
Dim Source As Worksheet
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements")
Dim Master As Worksheet
Set Master = Workbooks("Master Bonviva.xlsm").Worksheets(Sheets.Count)
Source.Activate
For Each cell In Source.Columns("M").Cells
If Not IsEmpty(cell) Then
Master.Activate
For Each cell2 In Master.Columns("J").Cells
If Not IsEmpty(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
End Sub
此致 巴特克
答案 0 :(得分:2)
错误在
Set Master = Workbooks("Master Bonviva.xlsm").Worksheets(Sheets.Count)
没有限定条件Sheets.count指的是在运行时打开的工作簿中的工作表数。替换为
Dim wb as workbook
Set wb =Workbooks("Master Bonviva.xlsm")
Set Master = wb.worksheets(wb.sheets.count)
答案 1 :(得分:1)
尝试取消重新Select
和Activate
。声明cell1
和cell2
。因此,这应该工作:
Public Sub TestMe()
Dim Source As Worksheet
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements")
Dim Master As Worksheet
Set Master = Workbooks("Master Bonviva.xlsm").Worksheets(Sheets.Count)
Dim cell1 As Range
Dim cell2 As Range
For Each cell1 In Source.Columns("M").Cells
If Not IsEmpty(cell1) Then
For Each cell2 In Master.Columns("J").Cells
If Not IsEmpty(cell2) Then
If cell1 = cell2 Then
cell2.Offset(0, 9).Value = cell1.Offset(0, -2).Value
cell2.Offset(0, 8).Value = cell1.Offset(0, -8).Value
End If
End If
Next cell2
End If
Next cell1
End Sub
How to avoid using Select in Excel VBA
通常,作为一种好的做法,不要声明使用VB编辑器使用的相同名称的变量。例如,避免声明cell
,但使用cell1
或其他任何有意义的内容。