2013-07-02 105 views
0

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

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

回答

0

您可以将工作表和其中已命名的范围传递给此子,它会将范围的地址和第一个Column和第一个打印到即时窗口。如果范围超过一个细胞,它也将打印最后一列和行:

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 

编辑:在回答在评论您的具体问题,你并不真的需要计算两个范围的列字母和行号。为了得到一个范围的列和另一列的交叉点的内容,然后将其分配到3号的范围内,做这样的事情:

With ActiveSheet 
    .Range("D12") = .Cells(.Range("Cost").Row, .Range("Candy").Column) 
End With 
+0

太谢谢你了。有没有办法将结果插入到另一个代码中? – Reccax

+0

有。正如您在前面的问题中提到的那样,在您的问题中更具体地说明您可以使用的答案。请修改您的问题以显示将被插入的代码。 (或者只是接受我的答案,看看你是否可以自己弄清楚:)) –

+0

好的!糖果在B3,成本在A12。假设B12 = 100,我想找到交点,并将其答案放入d12。再次感谢你。 – Reccax