我想知道在vba中查找已定义名称的列名称和已定义名称的行号的命令。因此,如果B3被命名为Candy,我会搜索Candy并返回B列。我谷歌一小时后找不到答案。
我将使用这些列名和行号从交集处获取数据并将其提取到另一个工作表中。
答案 0 :(得分:0)
您可以将工作表和其中的命名范围传递给此子,它会将范围的地址和第一个Column
以及第一个Row
打印到立即窗口。如果范围是多个单元格,它还将打印最后一列和行:
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