簡體   English   中英

查找Activecell表格行的VBA函數

[英]VBA Function to find Activecell Table Row

作為學習練習和未來代碼中的可能用途,我創建了我的第一個 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

這個問題可能會因為不夠具體而被關閉,但最明顯的項目(對我來說)是您對自定義函數的使用。 您的函數實際上沒有返回任何內容,它只是運行調試打印。 要讓您的函數實際返回行號,您可以將其設置為Long類型( 不是 integer )並將函數名稱=包含到數字中。

我實際上並沒有測試你的函數,但假設 LORow 是 dubug 打印正確的答案,那么它應該像這樣工作:

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未定義/變體。

可能還有更多。 我將通過返回工作表中最后使用的單元格的簡單任務重新啟動您的流程。 有十幾種方法可以做到這一點,還有很多幫助示例。

看看這個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM