这是我现在的案子我有以下函数调用:
Call function_1(name_sheet)
Call check_sheet_exist(name_sheet)
Call function_3(name_sheet)
如果一个条件为真并且这个条件在循环中,则调用此函数。在这个循环的开始,我有Workbooks(main).Worksheets(mask_1).Activate
。所以function_1
是用这个表调用的,它在这个表上做操作,这是我想要的。然后在check_name_sheet
函数中,我这样做:
Windows(main).Activate
For Each check_sheet In Workbooks(secondary).Sheets
'some code
Next check_sheet
Workbooks(main).Sheets(mask1).activate '(mask2 can also be activated depending on what parameter is passed)
既然你有了背景,问题就来了。在function_3
中,我尝试这样做:
Workbooks(secondary).Sheets(name_sheet).Activate 'name_sheet passed as parameters
MsgBox Range("AQ100").End(xlUp).Row
我在Msgbox
中等待的值是21,但我得到了19。这是因为代码搜索工作表Workbooks(main).Sheets(mask1)
中的最后一个空行。但我不知道问题出在哪里,因为我已经在第一行指定了要搜索的工作表。
我试着打印我使用的每个变量的值,一切都是定义和正确的。我也在function_3
中尝试了这个:
Msgbox Workbooks(secondary).Sheets(name_sheet).Range("AQ100").End(xlUp).Row
name_sheet
包含check_sheet_exist
函数复制的名称,因此工作表显然在工作簿中。工作簿已打开,存在且工作表的名称正确。
我唯一看到的可能是Windows(主).激活,这是我的问题的目的,是否windows.激活拒绝工作簿的变化?
编辑:
下面是我创建secondary
工作簿的函数:
Dim secondary as New Workbook 'outside the function
Sub example ()
Set new_file = Workbooks.Add
With new_file
.SaveAs Filename:=secondary
End With
secondary = ActiveWorkbook.name
End Sub
下面是调用上面3个函数的main函数:
For i = 1 To Collection_1.Count
For j = 1 To 5
Workbooks(main).Worksheets(mask_1).Activate
If Collection_1(i).Length(j) = 5 Then
Call function_1(name_sheet)
Call check_sheet_exist(name_sheet)
Call function_3(name_sheet)
End If
Function_1
不会修改活动工作簿或活动工作表。
下面是为什么最后一行应该是21的图像:
1条答案
按热度按时间djmepvbi1#
想象一下我的测试表:
由于你的问题是合并了单元格,并且对你的最后一行之后的下一个空行有误解:
偏移量(我自己测试过,实际上知道这一点)考虑了合并的单元格,所以它比合并单元格的最后一行多1。
在你的情况下,那就是: