2015-03-02 4 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

OK Спасибо! Большой! Это займет у меня часть пути. Думаю, я могу зачитать RefersTo как строку поиска, для какого столбца она уже определена, а затем построить новую строку и назначить это? Также могу ли я перебирать коллекцию имен? –

+0

Только что понял, что я хотел бы не быть конкретным в именах названных диапазонов! Я не могу ввести все имена! Должен быть способ итерации через все Named Ranges, независимо от их имен и обмена контентом? –

+0

Извините, что я новичок в этом форуме! Не знал, что я мог или должен сделать это! Теперь я официально признателен за вашу помощь! –

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 

Особая благодарность Жан-Франсуа за то, что он помог мне.

Измените RawData на ваше имя листа и NameToExclude на свои диапазоны, чтобы оставить нетронутыми. Убрать последний комментарий для его совершения! Но сначала сделайте резервную копию !!!!

Смежные вопросы