0

我想知道在 vba 中查找已定义名称的列名和已定义名称的行号的命令。因此,如果 B3 被命名为 Candy,我搜索 Candy 并返回 B 列。我用谷歌搜索了一个小时,但找不到答案。

我将使用这些列名和行号从交叉点获取数据并将其提取到另一个工作表中。

4

1 回答 1

0

您可以将工作表和其中的命名范围传递给此子程序,它将首先打印范围的地址,并首先将其打印ColumnRow即时窗口。如果范围超过一个单元格,它还将打印最后一列和最后一行:

Sub PrintNameRowAndCol(ws As Excel.Worksheet, strName As String)
Dim rng As Excel.Range
Dim SplitAddress As Variant

On Error Resume Next
Set rng = ws.Range(strName)
On Error GoTo 0
If Not rng Is Nothing Then
    Debug.Print rng.Address
    SplitAddress = Split(rng.Address, "$")
    Debug.Print "Column: "; SplitAddress(1)
    Debug.Print "Row: "; SplitAddress(2)
If rng.Cells.Count > 1 Then
    Debug.Print "Last Column: "; SplitAddress(3)
    Debug.Print "Last Row: "; SplitAddress(4)
End If
End If
End Sub

如果没有具有该名称的范围,则不会发生任何事情。

该例程使用Split基于分隔符将字符串分解为数组的函数,在本例中为“$”。由于 Range 的Address属性返回一个绝对引用格式的字符串,即 $Column$Row,因此对于单个单元格区域,Split 函数总是返回一个包含两个元素(列和行)的数组。对于多个单元格范围,它返回四个元素。

像这样称呼它:

Sub test()
PrintNameRowAndCol ActiveSheet, "Candy"
End Sub

编辑:在回答您在评论中的具体问题时,您实际上并不需要计算两个范围的列字母和行号。为了获取一个范围的列和另一个范围的行的交集的内容,然后将其分配给第三个范围,请执行以下操作:

With ActiveSheet
    .Range("D12") = .Cells(.Range("Cost").Row, .Range("Candy").Column)
End With
于 2013-07-02T04:52:10.763 回答