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

时间:2017-04-08 22:42:31

标签: excel vba excel-vba

我有没有办法让函数更改为sheet ActiveWorkbook中每个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 的特定列,我尝试了各种版本,但似乎无法正确使用。

{{1}}

4 个答案:

答案 0 :(得分:1)

工作表是一个对象,不能作为参数ByVal传递。它必须是ByRef,这是默认值,因此可以省略。另请注意,Sheet是为VBA使用而保留的单词。在大多数情况下,VBA将能够确定您的意图并允许您按照您希望的方式使用其词汇,但对于您来说,当面临故障排除的任务时,在每种情况下确定是否有工作是一个很大的工作。表示VBA的表格或您自己的表格。选择代码中的任何单词,然后按F1键让VBA显示它附加到它的含义以及如何使用它。

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

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.默认值应该是最合理的选择和最常用的选择。如果是最后一行,即第一列,则为A列。

这是基于您的评论的替代方案(我无法完全理解)。此代码在Rows(3)的{​​{1}}中查找“样式”一词,并返回找到“样式”的列中的下一个空白行。

ActiveSheet

如果未找到单词“Style”,则会发生错误,执行将跳转到标签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 ,该标签不执行任何操作。您可能希望以某种方式让它处理这种情况。由于函数代表它返回的行号将为零,如果您尝试寻址该行,将导致错误。

答案 1 :(得分:1)

你可以使用这个功能:

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

答案 2 :(得分:0)

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

所以在这一行中,传递8实际上并不是必需的,虽然可能很清楚,并且可以用相同的结果编写(返回H列的最后一行):

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet)

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

selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 2)

我还建议您将函数名称通用化为SelectFirstEmptyRowInColumn,以避免混淆。

答案 3 :(得分:0)

这个简单的代码可以帮到你。

Sub FindFirstEmptyRow()

Cells(Rows.Count,1).End(xlUp).Offset(1).Select

End Sub ☺☺