我正在努力获得更好的编码实践并使用通用功能 我正在使用主文件中的几个工作簿。 例如,如果我想获取最后一行,我使用以下代码行。
LastRow=Range("A" & Rows.Count).End(xlUp).Row
要使用函数检索值,我构建函数:
-Function 1
Function GetLastRow() As Integer
GetLastRow = Range("A" & Rows.Count).End(xlUp).Row
End Function
现在我的Sub Main()
我想将GetLastRow()
用于不同的工作簿或工作表。我认为在调用我的函数之前Activate
工作簿并不是一件好事。
然后我应该每次将工作簿名称和工作表编号发送到我的函数并将我的函数更改为:
-Function 2
Function GetLastRowIn(sWb As String, iWs As Integer) As Integer
GetLastRowIn = Workbooks(sWb).Worksheets(iWs).Range("A" & Rows.Count).End(xlUp).Row
End Function
或者是否有一种更好/更简单的方法来传输工作簿和工作表,我想在其中保留它而不像函数1中那样使用函数?
感谢您的回答!
答案 0 :(得分:0)
为了使功能更通用,您可以允许一些灵活性,
但也为函数调用强加了一些争论
通用功能
Option Explicit
Public Function GetLastRow(ByRef ws As Worksheet, Optional ByVal fromCol As Long = 1) As Long
Dim invalidWS As Boolean, lastRow As Long
If Not ws Is Nothing Then 'check 1st param
On Error Resume Next 'check that ws reference is valid (delted WS invalidates ws)
invalidWS = Len(ws.Name) > 0
invalidWS = Err.Number <> 0 'No error if Err.Number = 0
On Error GoTo 0
If Not invalidWS Then
If fromCol > 0 And fromCol <= ws.Columns.Count Then 'validate 2nd param
lastRow = ws.Cells(ws.Rows.Count, fromCol).End(xlUp).Row
'check if WS.fromCol is empty
If lastRow = 1 And Len(ws.Cells(1, fromCol)) = 0 Then lastRow = 0
End If
End If
End If
GetLastRow = lastRow
End Function
测试子
Public Sub TestGetLastRow()
'show results in the Immediate Window (VBA Editor: Ctrl+G)
Debug.Print GetLastRow(Sheet1, 1) 'CodeName of WS
Debug.Print GetLastRow(Workbooks(1).Worksheets(1)) 'WS Index
Debug.Print GetLastRow(ActiveWorkbook.Worksheets("Sheet3"), 3) 'WS name (string)
Debug.Print GetLastRow(ThisWorkbook.Worksheets(1), 0) 'invalid column (or -3)
Dim ws As Worksheet
Set ws = Sheet3
Application.DisplayAlerts = False
ws.Delete 'invalidate ws variable
Application.DisplayAlerts = True
Debug.Print GetLastRow(ws, 1) 'function call with invalid ws object
End Sub
Option Explicit
允许编译器捕获变量名称中的拼写错误作为说明:
主文件中的几个工作簿
Range("A" & Rows.Count).End(xlUp).Row
隐式使用ActiveWorkbook.ActiveSheet
ActiveWorkbook.ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
如果使用完整引用,则代码不依赖于活动对象 - 如果用户激活不同的工作簿或工作表,代码将继续正常工作
希望这有帮助
PS。当使用行变量时,总是将它们声明为Long
,以便能够处理超过32,767的整数 - 当前Excel最多有1,048,576行(将来这个最大值可以增加甚至更高)