【问题标题】:VBA Function to find Activecell Table Row查找 Activecell 表行的 VBA 函数
【发布时间】:2021-11-02 12:32:42
【问题描述】:

作为学习练习和未来代码中的可能用途,我创建了我的第一个 Excel VBA 函数来返回任何 Excel 表格(而不是工作表本身)中的活动单元格行号。本质上,它只是在工作表中找到活动行,然后找到表格标题的行号,然后从单元格行号中减去该行号以返回表格的行号,然后可以在后续代码中使用该行号。但是,虽然它可以工作,但它看起来并不是最有效的。有人可以改进它吗?

Sub TableRow()
Dim LORow As Integer
Dim TbleCell As Range
Set TbleCell = Activecell
Call FuncTableRow(TbleCell, LORow)
MsgBox LORow
End Sub


Public Function FuncTableRow(ByRef TbleCell As Range, LORow As Integer) As Range
    Dim LOName As String
    Dim LOHeaderRow, Row As Integer
    LOName = Activecell.ListObject.Name
    Row = Activecell.Row
    LOHeaderRow = ActiveSheet.ListObjects(LOName).HeaderRowRange.Row
    LORow = Row - LOHeaderRow
    Debug.Print (LORow)
End Function

【问题讨论】:

  • 似乎有点迂回使用Activecell.ListObject 来获取表名,这样你就可以使用它来获取表对象,而那是你已经引用过的......
  • 真的你只需要:TbleCell.Row - TbleCell.Listobject.HeaderRowRange.Row 和适当的错误处理程序。

标签: excel vba numbers row


【解决方案1】:

这个问题可能会因为不够具体而被关闭,但最明显的项目(对我而言)是您对自定义函数的使用。您的函数实际上并没有返回任何内容,它只是运行调试打印。要让您的函数实际返回行号,您可以将其设置为类型 Long (not integer) 并将函数名称 = 包含到数字中。

我实际上并没有测试你的功能,但假设 LORow 正在重复打印正确的答案,那么它应该像这样工作:

Public Function FuncTableRow(ByRef TbleCell As Range, LORow As Integer) As Long
    Dim LOName As String
    Dim LOHeaderRow, Row As Integer
    LOName = Activecell.ListObject.Name
    Row = Activecell.Row
    LOHeaderRow = ActiveSheet.ListObjects(LOName).HeaderRowRange.Row
    LORow = Row - LOHeaderRow
    Debug.Print (LORow)
    FuncTableRow = LORow
End Function
  • 你也不要Call一个函数,你可以把它作为它自己插入一个子程序。
  • 您正在使用LORow 作为输入变量,但随后对其进行了更改。这通常是一种不好的做法。
  • 您不应该使用ActiveSheetTbleCell.Worksheet 获取工作表
  • 您几乎不会将 activecell 用作自定义公式的一部分。
  • Dim LOHeaderRow, Row As Integer 实际上应该是 Dim LOHeaderRow as Long, Row As Long。正如您目前所拥有的那样,LOHeaderRow 未定义/变体。

可能还有更多。我将通过更简单的任务重新启动您的流程,即返回工作表中最后使用的单元格。有十几种方法可以做到这一点,还有很多帮助示例。

【讨论】:

    【解决方案2】:

    看看这个TheSpreadsheetGuru

    这里有一些变量可能会对您有所帮助。

    Sub TableVariables()
        Dim ol As ListObject: Set ol = ActiveSheet.ListObjects(1)
        Dim olRng As Range: Set olRng = ol.Range                            ' table absolute address
        Dim olRngStr As String: olRngStr = ol.Range.Address(False, False)   ' table address without absolute reference '$'
        Dim olRow As Integer: olRow = ol.Range.Row                          ' first row position
        Dim olCol As Integer: olCol = ol.Range.Column                       ' first column position
        Dim olRows As Long: olRows = ol.Range.Rows.Count                    ' table rows including header
        Dim olCols As Long: olCols = ol.ListColumns.Count                   ' table columns
        Dim olListRows As Long: olListRows = ol.ListRows.Count              ' table rows without header
    End Sub
    

    【讨论】:

    • 旁注:应该使用Long 而不是Integer,参见this
    • @BigBen 更重要的是:因为 Excel 的行数超过了 Integer 可以处理的行数^^
    • @BigBen,感谢分享!
    • 我有时还是用byte来炫耀,但不是在计算行数时...
    • 感谢您的所有 cmets - 我已经很多年没有使用 VBA,这是我以前从未尝试过的东西,因此获得您的反馈很有用。我可以看到代码存在问题,这就是我向您寻求帮助的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多