#arrays #excel #vba #string #range
#массивы #excel #vba #строка #диапазон
Вопрос:
Я пытаюсь выбрать строку из измененной ячейки в этой строке, а затем заполнить массив из выбранных значений строки.
Когда я пытаюсь создать строковую переменную, содержащую выбранную строку, такую как Copyrange = Начальная позиция и конечная позиция, а затем передать ее параметру диапазона в массив, он выдает ошибку подстрочного индекса вне диапазона.
Мне нужно сформулировать правильную строку для назначения диапазону, как я могу это сделать, если вы не можете передать строковую переменную в параметр диапазона?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, s As Long
If Not Application.Intersect(Target, Range("PrioritySelect")) Is Nothing Then
If Not Application.Intersect(Target, Range("PrioritySelect")) = "Select" Then
r = Target.Row
s = r 8
' MsgBox "row " amp; r, , "Amended Cell..."
Dim MyArray() As Variant
'unallocated array
Dim i As Integer
Dim ThisWs As Worksheet
Dim Copyrange As String
Dim Position As String
Set ThisWs = Worksheets("PIPPR")
Position = "B" amp; r
EndPosition = "B" amp; s
MsgBox Position
MsgBox EndPosition
Let Copyrange = Position amp; ":" amp; EndPosition
MsgBox Copyrange
MyArray = ThisWs.Range(Copyrange).Value2
MsgBox "Lower Bound = " amp; LBound(MyArray)
MsgBox "Upper Bound = " amp; UBound(MyArray)
MsgBox MyArray(1)
'MsgBox MyArray(1)
' Print student marks from the array to the Immediate Window
Debug.Print "Values"
For i = LBound(MyArray) To UBound(MyArray)
Debug.Print MyArray(i)
Next i
Комментарии:
1. Попробуйте использовать
Copyrange = Position amp; ":" amp; EndPosition
вместоLet Copyrange = Position amp; ":" amp; EndPosition
. Строка должна получать значение таким простым способом.2.
ThisWs.Range(Copyrange)
не удается выдать ошибку выхода индекса за пределы диапазона. Место, где вы его получаетеMyArray(1)
.MyArray
это 2D-массив, а не 1D.
Ответ №1:
myArray — это 2-мерный массив. Вы должны использовать его правильно. Попробуйте это:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, s As Long
If Not Application.Intersect(Target, Range("PrioritySelect")) Is Nothing Then
If Not Application.Intersect(Target, Range("PrioritySelect")) = "Select" Then
r = Target.Row
s = r 8
' MsgBox "row " amp; r, , "Amended Cell..."
Dim MyArray() As Variant
'unallocated array
Dim i As Integer
Dim ThisWs As Worksheet
Dim Copyrange As String
Dim Position As String
Set ThisWs = Worksheets("PIPPR")
Position = "B" amp; r
EndPosition = "B" amp; s
MsgBox Position
MsgBox EndPosition
Let Copyrange = Position amp; ":" amp; EndPosition
MsgBox Copyrange
MyArray = ThisWs.Range(Copyrange).Value2
MsgBox "Lower Bound = " amp; LBound(MyArray)
MsgBox "Upper Bound = " amp; UBound(MyArray)
MsgBox MyArray(1, 1)
'MsgBox MyArray(1)
' Print student marks from the array to the Immediate Window
Debug.Print "Values"
For i = LBound(MyArray) To UBound(MyArray)
Debug.Print MyArray(i, 1)
Next i
End If
End If
End Sub
Вместо этого используется одномерный myArray со строками или variant:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, s As Long
If Not Application.Intersect(Target, Range("PrioritySelect")) Is Nothing Then
If Not Application.Intersect(Target, Range("PrioritySelect")) = "Select" Then
r = Target.Row
s = r 8
' MsgBox "row " amp; r, , "Amended Cell..."
'unallocated array
Dim i As Integer
Dim ThisWs As Worksheet
Dim Copyrange As String
Dim Position As String
Dim Cell As Range
Dim MyArray() As String
Set ThisWs = Worksheets("PIPPR")
Position = "B" amp; r
EndPosition = "B" amp; s
MsgBox Position
MsgBox EndPosition
Let Copyrange = Position amp; ":" amp; EndPosition
MsgBox Copyrange
ReDim MyArray(1 To ThisWs.Range(Copyrange).Cells.Count)
i = 1
For Each Cell In ThisWs.Range(Copyrange)
MyArray(i) = Cell.Value2
i = i 1
Next
MsgBox "Lower Bound = " amp; LBound(MyArray)
MsgBox "Upper Bound = " amp; UBound(MyArray)
MsgBox MyArray(1)
'MsgBox MyArray(1)
' Print student marks from the array to the Immediate Window
Debug.Print "Values"
For i = LBound(MyArray) To UBound(MyArray)
Debug.Print MyArray(i)
Next i
End If
End If
End Sub
Комментарии:
1. О, это так полезно, спасибо Evil Blue Monkey! Это работает. Есть ли способ передать его в 1-мерный массив и, следовательно, не иметь этой проблемы?
2. Похоже, я также не могу получить доступ к значениям массива i выше 2 — Debug. Print выводит только первые 2 значения из общего числа 9, что является нечетным.
3. @JamesintheUK Взгляните на документацию функции LBound() и ее
dimension
параметр4. Извините, я не лучший программист в мире, как вы все можете сказать. Бит, в котором я застрял, заключается в том, что я не понимаю, как формируется массив. Полученный мной диапазон успешно содержит 9 значений, но эти 9, похоже, не приводят к созданию 9 значений в массиве, только 2? Насколько я могу судить.
5. Я добавил к ответу дополнительный код, который использует одномерный myArray. Я также превратил его в строковый тип вместо variant; поскольку нам нужно только копировать значения ячеек, использование variant должно быть ненужным.