Заполнение параметра диапазона в массив с использованием строковой переменной

#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 должно быть ненужным.