Код JS20'07'11 действительно невероятно простой и прямой. Одно из предложений, которое я хотел бы дать, - поставить восклицательный знак в следующих условиях:
InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare)
Потому что это предотвратит добавление NamedRange в неправильный лист. Например: если NamedRange относится к листу с именем Plan11 и у вас есть другой лист с именем Plan1 , код может привести к путанице при добавлении диапазонов, если t используйте восклицательный знак.
UPDATE
Исправление: лучше использовать регулярное выражение для оценки названия листа. Простая функция, которую вы можете использовать: (http://blog.malcolmp.com/2010/regular-expressions-excel-add-in, разрешает регулярные выражения Microsoft VBScript 5.5):
Function xMatch(pattern As String, searchText As String, Optional matchIndex As Integer = 1, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
For Each Match In matches
If i = matchIndex Then
xMatch = Match.Value
End If
i = i + 1
Next
End Function
Итак, вы можете использовать что-то вроде этого:
xMatch("'?" +sWsName + "'?" + "!", objName.RefersTo, 1) <> ""
вместо
InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare)
Это будет охватывать Plan1 и 'Plan1' (когда диапазон относится к более чем одной ячейке) вариаций
СОВЕТ: избегайте имен листов в одинарных кавычках ('), :).