2015-03-02 110 views
1

我正在使用具有将近200个命名范围(每列是NR)的工作表。我现在想使其动态的,即不是定义他们像VBA定义多个命名范围

PersonID = =RawData!$A$2:$A$100 

我想这样做,这样

PersonID = OFFSET(RawData!$A$2,0,0,COUNTA(RawData!$A:$A),1) 

但我不想手动做!有没有办法在Excel以外的文本编辑器中执行此操作,或者是否有方法以编程方式执行此操作?我已经用第一种方法完成了200个NR,但手动完成它们的想法让我感到害怕。

回答

1

你可以在VBA中做到这一点。例如要创建一个新的名字:

ActiveWorkbook.Names.Add Name:="PersonID", _ 
    RefersTo:="=OFFSET(RawData!$A$2,0,0,COUNTA(RawData!$A:$A),1)" 

要编辑已有的名称:

ActiveWorkbook.Names("PersonID").RefersTo = _ 
    "=OFFSET(RawData!$A$2,0,1,COUNTA(RawData!$A:$A),1)" 

你指明一个评论,您也想通过所有的命名范围重复,以方便改变它们的定义。要通过所有名称循环,你可以这样做:

Dim nm As Name 
For Each nm In ActiveWorkbook.Names 
    Debug.Print nm.Name 
Next nm 

或本:

Dim i As Long 
For i = 1 To ActiveWorkbook.Names.Count 
    Debug.Print ActiveWorkbook.Names.Item(i).Name 
Next i 
+0

好的,谢谢!大!这将使我成为其中的一部分。我想我可以读出RefersTo作为一个字符串来搜索它已经定义的列,然后构建我的新字符串并分配它?我也可以迭代通过名称集合吗? – 2015-03-02 08:26:09

+0

刚刚意识到我不想具体说明名称范围的名称!我无法输入所有名字!必须有一种方法来遍历所有命名范围,而不管它们的名称和交换内容? – 2015-03-02 08:28:53

+0

对不起,我是这个论坛的新手!不知道我可以或应该这样做!我现在正式为您提供帮助! – 2015-03-02 09:39:51

0

这似乎是在你的工具箱中一个很好的工具吗?

Sub MakeRangesDynamic() 
Dim i As Long 

For i = 1 To ActiveWorkbook.Names.Count 
    If Not (ActiveWorkbook.Names.Item(i).Name = "NameToExclude1" Xor _ 
      ActiveWorkbook.Names.Item(i).Name = "NameToExclude2" Xor _ 
      ActiveWorkbook.Names.Item(i).Name = "NameToExclude3") Then 

    FindTheColumn = Mid$(ActiveWorkbook.Names.Item(i).RefersTo, 11, 2) 

    If Mid$(FindTheColumn, 2, 1) = "$" Then 
     FindTheColumn = Mid$(FindTheColumn, 1, 1) 
    Else 
     FindTheColumn = Mid$(FindTheColumn, 1, 2) 
    End If 

    DynNameString = "=OFFSET(RawData!$" & FindTheColumn & "$2,0,0,COUNTA(RawData!$" & FindTheColumn & ":$" & FindTheColumn & "),1)" 
    Debug.Print DynNameString 
    'ActiveWorkbook.Names.Item(i).Name.RefersTo = DynNameString 
    End If 
Next i 

End Sub 

特别感谢Jean-Francois帮助我。

将RawData更改为sheetname,并将NameToExclude更改为您的范围以保持不变。 删除最后的评论!但一定要先备份一份!