Согласно документации, любые цитируемые текстовые имена могут быть определены переменной, если я определю

Set xlsDataSource = Application.Workbooks("New_TOR_V1.xlsm").Names("MyRange").RefersToRange

работает как положено если я использую

Dim S as string
S="MyRange"

Set xlsDataSource = Application.Workbooks("New_TOR_V1.xlsm").Names(S).RefersToRange

это также хорошо работает

но используя

Dim Arr() as string
Arr(1)="MyRange"
Set xlsDataSource = Application.Workbooks("New_TOR_V1.xlsm").Names(Arr(1)).RefersToRange

выдает сообщение об ошибке

а также

Set xlsDataSource = Application.Workbooks("New_TOR_V1.xlsm").Names(Cstr(Arr(1))).RefersToRange

выдает сообщение об ошибке

Почему элемент массива вызывает ошибку и как я могу это решить?

Мне нужно использовать массив?

1 ответ1

0

Объявите ваш массив с размером Dim Arr(1) as String

Я не совсем уверен, каково ваше конкретное приложение, но массив должен иметь размер, прежде чем его можно будет использовать -

Sub test()
'One number indicates one dimension and starts at **0** See footnote
Dim Arr(1) As String
Arr(1) = "MyRange2"
Range("A2").Name = Arr(1)
End Sub

сноска

Если вы еще этого не знаете, вам нужно будет redim его:

Sub test()

Dim Arr() As String
'Do stuff to get a number 
ReDim Arr(1)
Arr(1) = "MyRange3"
Range("A3").Name = Arr(1)

End Sub

В вашем примере я разбил его, но он работает так:

Sub test()

Dim Arr() As String
ReDim Arr(1)
Arr(1) = "MyRange"
Range("A1").Name = Arr(1)

Set xlsdatasource = ThisWorkbook.Names("MyRange").RefersToRange
MsgBox (xlsdatasource.Address)

End Sub

Дает мне $A$1 в msgbox.

Замените "A1" на «A1:C1», и msgbox даст мне $A$1:$C$1 .


Более сложный пример с теми же ограничениями

Для A1: чтение A6 -

this
is
a
one
dimensional
array

Это также компилируется и запускается:

Sub test()

Dim Arr() As String

Dim j As Integer
j = [counta(A1:A10)]
ReDim Arr(j - 1) 

Dim i As Integer
  For i = 0 To 5
  Arr(i) = Cells(i + 1, 1)
  Next

Dim rng As Range

  For i = 0 To 5
  Set rng = Range(Cells(i + 2, i + 5), Cells(i + 2, i + 8))
  rng.Name = Arr(i)
  Next

Set xlsdatasource = ThisWorkbook.Names(Arr(3)).RefersToRange
MsgBox (xlsdatasource.Address)

End Sub

и msgbox отображает $H$5:$K$5 .

Меняем это:

Set xlsdatasource = ThisWorkbook.Names(Arr(3)).RefersToRange 
MsgBox (xlsdatasource.Address)

к этому:

Set xlsdatasource = ThisWorkbook.Names("one").RefersToRange
MsgBox (xlsdatasource.Address)

также возвращает msgbox, отображающий $H$5:$K$5 .


Записка

Если в ячейке A4 читается 1 вместо one , я не могу использовать Dim Arr() as String поскольку "1" не начинается с буквы или подчеркивания.

Я мог бы использовать _1 или Dim Arr() as Variant , но на самом деле я не мог назвать диапазон "1", потому что это недопустимое значение для именования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .