Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为每个图纸VBA选择具有特定列的第一个空行_Vba_Excel - Fatal编程技术网

为每个图纸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代码中选择
等,因为这是非常不必要的。具体来说,你想要实现什么?还有,你看到的问题到底是什么——“它工作不正常”不是吗