为每个工作表VBAselect具有特定列的第一个空行

有什么办法,我可以使function更改为ActiveWorkbook每个工作sheet的特定列我尝试了各种版本,但似乎无法得到它的权利。

 Sub resetFilters() Dim sht As Worksheet On Error GoTo ErrorHandler Application.ScreenUpdating = False 'On Error Resume Next If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End If Range("A3:T3").ClearContents Application.ScreenUpdating = True Call GetLastRow Exit Sub ErrorHandler: Debug.Print "Error number: " & Err.Number & " " & Err.Description End Sub Private Function SelectFirstEmptyRowInColumnH(ByVal sheet As Worksheet, Optional ByVal fromColumn As Long = 8) As Long SelectFirstEmptyRowInColumnH = sheet.Cells(sheet.Rows.Count, fromColumn).End(xlUp).Row End Function Private Sub GetLastRow() Dim selectLastRow As Long selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 8) Cells(selectLastRow, 8).Offset(1, 0).Select End Sub 

工作表是一个对象,不能作为parameter passingByVal。 它必须是ByRef,这是默认的,因此可以省略。 还要注意,表单是为VBA使用保留的一个字。 在大多数情况下,VBA将能够确定您的意图,并允许您按照自己的意愿使用自己的词汇,但是对于您来说,在面对解决问题的任务时,确定每种情况下的表单意味着VBA的表格或您自己的表格。 select代码中的任何单词,然后按F1让VBA显示其附加的含义以及如何使用它。

除此之外,请注意您的函数返回最后使用的行。 第一个空的是下一个。 所以,我会写这样的function:

 Private Function FirstEmptyRow(Ws As Worksheet, _ Optional ByVal Clm As Long = 1) As Long With Ws FirstEmptyRow = .Cells(.Rows.Count, Clm).End(xlUp).Row + 1 End With End Function 

请注意,我将可选列的默认值更改为1.默认值应该是最合理的select,也是最常用的选项。 在最后一行是第一列的情况下,列A.

这是根据您的评论(我不能完全理解)的替代scheme。 此代码在ActiveSheet Rows(3)中查找单词“样式”,并返回find“样式”的列中的下一个空行。

 Private Function FirstEmptyRow() As Long ' 9 Apr 2017 Dim Clm As Long With ActiveSheet On Error GoTo ErrHandler: Clm = WorksheetFunction.Match("Style", .Rows(3), 0) FirstEmptyRow = .Cells(.Rows.Count, Clm).End(xlUp).Row + 1 End With ErrHandler: Err.Clear End Function 

如果没有find“Style”这个词,就会发生一个错误,并且执行将跳转到标签ErrHandler:它什么都不做。 你可能想让它以某种方式处理这种情况。 由于函数站立的行号返回将为零,这将导致错误,如果您尝试寻址该行。

你可以使用这个function:

 Private Function SelectFirstEmptyRowInColumnWithGivenHeader(ByVal sheet As Worksheet, Optional ByVal header As String = "Style") As Long Dim col As Variant With sheet col = Application.Match(header, .Rows(1), 0) If Not IsError(col) Then .Activate '<--| you must select a sheet to activate a cell of it .Cells(.Rows.Count, col).End(xlUp).Offset(1).Select End If End With End Function 

并在您的主要代码中利用它如下:

 Sub main() Dim sht As Worksheet Application.ScreenUpdating = False '<--| this to prevent sheet activating slow down the code (and annoy you) For Each sht In Worksheets SelectFirstEmptyRowInColumnWithGivenHeader sht , "Style" '<--| you can omit the 2nd parameter and it'll be assumed the default column header Next Application.ScreenUpdating = True '<--| get default behavior back in place End Sub 

您只需将所需的列号传递给该函数。 Optional ByVal fromColumn As Long = 8表示如果在调用函数时没有传递任何列号,则第Optional ByVal fromColumn As Long = 8列(列H)是缺省列。 但传递一个列号将覆盖该默认值。

所以在这一行中,传递8实际上并不是必需的,虽然可能是为了清晰起见,并且可以像这样写出相同的结果(返回列H的最后一行):

 selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet) 

例如,要将列号更改为2(B列),可以这样更改行:

 selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 2) 

我也build议您将函数的名称泛化为SelectFirstEmptyRowInColumn ,以避免混淆。

这个简单的代码将帮助你。

Sub FindFirstEmptyRow()

单元格(Rows.Count,1).End(xlUp).Offset(1).Select

End Sub☺☺