我有没有办法让函数更改为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}}
答案 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 ☺☺