2015-07-24 2 views
0

эй я новичок в vba, и я уже пытался найти ответ на мой вопрос. Я хочу заполнить динамический массив конкретными массивами, которые можно изменить в таблице. для этого я создал следующий код:vba заполнение динамического массива со строками

Sub ZellenArrayReader() 
    Dim boom() As Variant 
    Dim rowsboom As Integer 
    Dim sh As Variant 

    sh = "TAB1" 
    Worksheets(sh).Range("A1").Select 
    rowsboom = Selection.CurrentRegion.Rows.Count - 2 

    ReDim boom(0 To rowsboom) 

    For i = LBound(boom) To i = UBound(boom) 
     boom(i) = Worksheets(sh).Cells(i + 2, 1) 
    Next i 

    Cells(10, 5).FormulaR1C1 = boom(0) 
    Cells(10, 1).FormulaR1C1 = boom(1) 

End Sub 

Для части это не работает правильно. Он работает код только один, даже если UpperBound из массива 4 или 5.

ответ

0

Вы должны изменить свой For ... Next цикл для:

For i = LBound(boom) To UBound(boom) 
    boom(i) = Worksheets(sh).Cells(i+2, 1) 
Next i 
+0

OMG это была такая глупая ошибка, большое спасибо, теперь он работает: D – brj1997

0

небольших изменений, это хорошо работает.

Private Sub ZellenArrayReader() 

    Dim boom() As Variant 
    Dim rowsboom As Integer 
    Dim sh As String 

    sh = "TAB1" 

    Sheets(sh).Range("A1").Select 

    rowsboom = Selection.CurrentRegion.Rows.Count - 2 

    ReDim boom(0 To rowsboom) 

    For i = 0 To UBound(boom) Step 1 
     boom(i) = Sheets(sh).Cells(i + 2, 1) 
    Next i 

    Cells(10, 5).FormulaR1C1 = boom(0) 
    Cells(10, 1).FormulaR1C1 = boom(1) 

End Sub 
+0

спасибо большое, я так много в Java, что эта ошибка произошло, спасибо: D – brj1997

+0

Если это это работа, принять ответ на вопрос. Добро пожаловать..! –

0

Как на других ответили, часть вашего цикла for вызывает проблему. Если стрела имела 1 элемент, это возвращало бы True (i = 0 и UBound (boom) = 0), и это было бы как For i = LBound(boom) to -1 (True при -1, когда используется как Long). Это будет равняться нулю. В вашем случае у вас есть как минимум два элемента, поэтому i=UBound(boom) возвращает False. Это как For i = LBound(boom) to 0, поэтому он выполняется только один раз.

Свойство Range.Value возвращает двумерный массив и, как правило, быстрее, чем цикл через массив и заполняет его значениями из ячеек. Нижняя граница массива, назначенного через Range.Value, равна 1, а не нулю. Вот переписывание кода без цикла.

Sub ZellenArrayReader() 

    Dim vBoom As Variant 
    Dim sh As Worksheet 
    Dim rCurrReg As Range 

    Set sh = ThisWorkbook.Worksheets("TAB1") 

    Set rCurrReg = sh.Range("A1").CurrentRegion 
    vBoom = rCurrReg.Resize(rCurrReg.Rows.Count - 2).Value 

    sh.Cells(10, 5).Value = vBoom(1, 1) 
    sh.Cells(10, 1).Value = vBoom(2, 1) 

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