2012-03-26 8 views
2

Мне нужно создать массив из списка данных в excel. Данные будут иметь разную длину, поэтому мне придется найти конец, а затем создать массив. Затем мне нужно пройти через массив и использовать каждое значение. Я раньше не использовал VBA, поэтому ничего полезного. Это то, что я получил до сих пор:Excel массив VBA из данных

Sub Calc() 
Dim endCell As String  
endCell = Range("B13").End(xlDown).Row  
endCell = "B13:B" + endCell  
Dim nums As Variant 

nums = Range(endCell) 

End Sub 
+1

Чтобы объединить строки, используйте '&' вместо '+'. Итак, endCell = "B13: B" и endCell –

ответ

1

использовать функцию транспонирования:

nums = Application.WorksheetFunction.Transpose(Range(endCell).value) 
+2

Не знаю, как это относится к вопросу ... – assylias

+0

Если не использовать Transpose, результатом будет вариант Variants ... –

+0

'nums = Range (" A1: B5 ")' будет возвращать 2D-массив, начиная с ' nums (1,1) '(= A1) до' nums (5,2) '(= B5) ... – assylias

4

Вам не придется этого делать. Просто сделайте это:

Dim varValues() as Variant 

' ... 

varValues = Range(endCell).Value 

Для объекта диапазона, который содержит более одной ячейки, свойство value возвращает массив значений.

Если вы не знаете, есть ли диапазон более одной ячейки, но вы хотите иметь массив значений независимо, вы могли бы написать функцию для достижения этого (спасибо brettdj за вдохновение):

Function GetValue(rng As Range) As Variant() 
    Dim varResult() As Variant 

    If rng.Cells.Count = 1 Then 
     ReDim varResult(0 To 0) 'I prefer to be explicit about the base 
     varResult(0) = rng.Value 
    Else 
     varResult = rng.Value 
    End If 

    GetValue = varResult 
End Function 
+0

+1, но стоит проверить, что endCell больше 1 ячейки до 'varValues ​​= Range (endCell) .Value'. Esle - результат ошибки. – brettdj

+0

@brettdj спасибо, что указали это; Я отредактировал ответ. – phoog

0

Начиная с вашего кода, вы могли бы перебираем массив следующим образом:

Sub Calc() 
    Dim endCell As String 

    endCell = Range("B13").End(xlDown).Row 
    endCell = "B13:B" & endCell 

    Dim nums As Variant 
    Dim i As Long 

    nums = Range(endCell) 

    For i = LBound(nums,1) To UBound(nums,1) 
     'do something with nums(i,1) 
    Next i 
End Sub 
0

Я не уверен, что это лучше или чище.

Sub Calc() 
Dim endCell As String 

endCell = Range("B13").End(xlDown).Row 
endCell = "B13:B" & endCell 
Range(endCell).select 

For each c in selection 
    use any attribute of the cells one at a time like, c.value c.formula..... 
Next c 
End Sub