如何在function中正确激活工作簿中的工作表

我正在尝试获取工作簿中给定工作表的最后一列和最后一行。 下面是我用来获取这些值的代码。 这个代码工作完美(因为我得到正确数量的上校和行),只要我点击工作表,然后运行Sub LastRowCol()

Function LastUsedRow_Find() As Integer Dim rng As Range Set rng = ActiveSheet.Cells LastUsedRow_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row End Function Function LastUsedColumn_Find() As Integer Dim rng As Range Set rng = ActiveSheet.Cells LastUsedColumn_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column End Function Sub LastRowCol() MsgBox "last row -> " & LastUsedRow_Find() MsgBox "last col -> " & LastUsedColumn_Find() End Sub 

但是,比方说,我有多张纸。 我正在尝试将表格的索引传递给如下所示的方法。 然后我尝试激活给定的索引表,因为我几秒后使用ActiveSheet 。 代码运行没有例外但是我没有得到正确数量的列和行在信息框中anylonger。

 Function LastUsedRow_Find(wksIndex As Integer) As Integer ActiveWorkbook.Sheets(wksIndex).Activate Dim rng As Range Set rng = ActiveSheet.Cells LastUsedRow_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row End Function Function LastUsedColumn_Find(wksIndex As Integer) As Integer ActiveWorkbook.Sheets(wksIndex).Activate Dim rng As Range Set rng = ActiveSheet.Cells LastUsedColumn_Find = rng.Find(What:="*", After:=rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column End Function Sub LastRowCol() MsgBox "last row -> " & LastUsedRow_Find(1) MsgBox "last col -> " & LastUsedColumn_Find(1) End Sub 

有人可以让我知道我可能做错了什么,或者我可能需要改变? 谢谢

为什么不传递Worksheet Object而不是传递索引?

 Function LastUsedRow_Find(sh As Worksheet) As Variant Dim rng As Range Set rng = sh.Cells.Find(What:="*", _ After:=sh.Cells(1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False) If Not rng Is Nothing Then LastUsedRow_Find = rng.Row End Function 

你的其他function也应该完成。
另外,我稍微修改它来处理空白页。
所以上面的函数会返回最后一行的数字,如果没有的话就返回空行。

然后像这样调用你的函数:

 Sub LastRowCol() MsgBox "last row -> " & LastUsedRow_Find(Sheets("Sheet1")) MsgBox "last col -> " & LastUsedColumn_Find(Sheets("Sheet1")) End Sub 

你的代码实际上工作正常,但这里是一个修改后的版本,将Debug.Printfind最后一行/列的单元格的地址。 我也不会激活表单,因为这是多余的。 我也不会将整个工作簿单元格范围分配给一个variables,只有find的结果。

 Function LastUsedRow_Find(wksIndex As Integer) As Integer Dim ws As Worksheet Set ws = ActiveWorkbook.Sheets(wksIndex) Dim rgFound As Range Set rgFound = ws.Cells.Find(What:="*", After:=ws.Cells(1), _ Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, MatchCase:=False) 'return first row if worksheet is blank If rgFound Is Nothing Then LastUsedRow_Find = 1 Else LastUsedRow_Find = rgFound.Row Debug.Print "Last row address: " & rgFound.Address End If End Function Function LastUsedColumn_Find(wksIndex As Integer) As Integer Dim ws As Worksheet Set ws = ActiveWorkbook.Sheets(wksIndex) Dim rgFound As Range Set rgFound = ws.Cells.Find(What:="*", After:=ws.Cells(1), _ Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, MatchCase:=False) 'return first column if worksheet is blank If rgFound Is Nothing Then LastUsedColumn_Find = 1 Else LastUsedColumn_Find = rgFound.Column Debug.Print "Last column address: " & rgFound.Address End If End Function Sub LastRowCol() MsgBox "last row -> " & LastUsedRow_Find(1) MsgBox "last col -> " & LastUsedColumn_Find(1) End Sub