为每个图纸VBA选择具有特定列的第一个空行
是否有任何方法可以将为每个图纸VBA选择具有特定列的第一个空行,vba,excel,Vba,Excel,是否有任何方法可以将ActiveWorkbook中的每个工作表的函数更改为特定列?我尝试了各种版本,但似乎都做不好 Sub resetFilters() Dim sht As Worksheet On Error GoTo ErrorHandler Application.ScreenUpdating = False 'On Error Resume Next If ActiveSheet.FilterMode Then ActiveSheet.ShowAl
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
只需将所需的列号传递给函数即可
可选ByVal fromColumn As Long=8
表示如果调用函数时未传递列号,则第8列(H列)是默认列。但传递列号将覆盖该默认值
因此,在这一行中,实际上不需要通过8,尽管为了清晰起见,可能需要这样写,并且可以得到相同的结果(返回H列的最后一行):
例如,要将列编号更改为2(B列),可以将行更改为:
selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 2)
我还建议您将函数名泛化为
SelectFirstEmptyRowInColumn
,以避免混淆。您只需将所需的列号传递给函数即可可选ByVal fromColumn As Long=8
表示如果调用函数时未传递列号,则第8列(H列)是默认列。但传递列号将覆盖该默认值
因此,在这一行中,实际上不需要通过8,尽管为了清晰起见,可能需要这样写,并且可以得到相同的结果(返回H列的最后一行):
例如,要将列编号更改为2(B列),可以将行更改为:
selectLastRow = SelectFirstEmptyRowInColumnH(ActiveSheet, 2)
我还建议您将函数名泛化为
SelectFirstEmptyRowInColumn
,以避免混淆。工作表是一个对象,不能通过val作为参数传递。它必须是ByRef,这是默认值,因此可以省略。还要注意的是,Sheet是为VBA保留的一个字。在大多数情况下,VBA将能够确定您的意图,并允许您以您希望的方式使用其词汇表,但对于您来说,在面临故障排除任务时,在每种情况下,确定Sheet是指VBA的Sheet还是指您自己的Sheet是一项艰巨的工作。选择代码中的任何单词,然后按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列
根据你的评论(我不能完全理解),这里有一个备选方案。此代码在ActiveSheet
的行(3)
中查找单词“Style”,并返回找到“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
如果未找到单词“Style”,则会发生错误,执行将跳转到标签
ErrHandler:
,该标签不起任何作用。你可能想让它以某种方式处理这种情况。当函数处于静止状态时,它返回的行号将为零,如果试图寻址该行,则会导致错误。工作表是一个对象,不能作为参数ByVal传递。它必须是ByRef,这是默认值,因此可以省略。还要注意的是,Sheet是为VBA保留的一个字。在大多数情况下,VBA将能够确定您的意图,并允许您以您希望的方式使用其词汇表,但对于您来说,在面临故障排除任务时,在每种情况下,确定Sheet是指VBA的Sheet还是指您自己的Sheet是一项艰巨的工作。选择代码中的任何单词,然后按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列
根据你的评论(我不能完全理解),这里有一个备选方案。此代码在ActiveSheet
的行(3)
中查找单词“Style”,并返回找到“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
如果未找到单词“Style”,则会发生错误,执行将跳转到标签
ErrHandler:
,该标签不起任何作用。你可能想让它以某种方式处理这种情况。当函数处于静止状态时,它返回的行号将为零,如果您试图寻址该行,将导致错误。您可以使用此函数:
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
Private函数选择FirstEmptyRowinColumnWithGivenHeader(ByVal工作表作为工作表,可选ByVal标题作为String=“Style”),长度为
Dim col作为变体
用床单
col=Application.Match(标题,.Rows(1),0)
如果不是IsError(col),则
。激活“您可以使用此功能:
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
Private函数选择FirstEmptyRowinColumnWithGivenHeader(ByVal工作表作为工作表,可选ByVal标题作为String=“Style”),长度为
Dim col作为变体
用床单
col=Application.Match(标题,.Rows(1),0)
如果不是IsError(col),则
。激活“此简单代码将帮助您
子FindFirstEntryRow()
单元格(Rows.Count,1).结束(xlUp).偏移量(1).选择
端接头
☺ ☺ 这个简单的代码将帮助您
子FindFirstEntryRow()
单元格(Rows.Count,1).结束(xlUp).偏移量(1).选择
端接头
☺ ☺ 基本上不应该使用。在VBA代码中选择等,因为这是非常不必要的。具体来说,你想要实现什么?还有,你看到的问题到底是什么——“它工作不正常”不是吗