从数组写入范围

时间:2017-09-26 14:34:48

标签: vba excel-vba excel

我正在列表并在VBA上进行所有计算,但是当我想将列表写入预定义范围时,我什么也得不到。以下是我正在使用的代码示例。我没有发布实际代码,因为它很长但是这个例子有同样的问题。

Option Explicit

Sub readArray()
Dim CoGrade() As Variant
Dim LastRow As Integer
Dim NPSeQuedan() As Variant
Dim SeQuedanRng As Range


'erases information from arrays if there was any
Erase CoGrade

Erase NPSeQuedan

'-------------------------------------------------------------------------
'find the last row on the data i want to read
LastRow = Range("b10000").End(xlUp).Row
'the relevant data starts on row 34
ArrayRows = LastRow - 34 + 1
'redifines the variables with the total numbers of stocks in the portfolio
ReDim CoGrade(ArrayRows, 1)
ReDim NPSeQuedan(ArrayRows, 1)

'reads each relevant number into its proper variable
CoGrade = Range(Cells(34, 2), Cells(LastRow, 2))

'' test
Set SeQuedanRng = Range(Cells(34, 13), Cells(34 + ArrayRows - 1, 
13))
For a = 1 To ArrayRows
    NPSeQuedan(a, 1) = CoGrade(a, 1)
Next
SeQuedanRng.Value = NPSeQuedan
'''
end sub

2 个答案:

答案 0 :(得分:1)

你可以这样做,其中包含John Coleman的一些评论。

Sub readArray()

Dim CoGrade As Variant
Dim LastRow As Long, ArrayRows as Long, a as Long
Dim NPSeQuedan() As Variant
Dim SeQuedanRng As Range

'find the last row on the data i want to read
LastRow = Range("b10000").End(xlUp).Row
'the relevant data starts on row 34
ArrayRows = LastRow - 34 + 1
'redifines the variables with the total numbers of stocks in the portfolio
ReDim NPSeQuedan(1 To ArrayRows)

'reads each relevant number into its proper variable
CoGrade = Range(Cells(34, 2), Cells(LastRow, 2))
Set SeQuedanRng = Range(Cells(34, 13), Cells(34 + ArrayRows - 1, 13))

For a = 1 To ArrayRows
    NPSeQuedan(a) = CoGrade(a, 1)
Next

SeQuedanRng.Value = Application.Transpose(NPSeQuedan)

End Sub

答案 1 :(得分:1)

这是另一种解决方案(尽管@SJR使用一维数组的想法很好)。我在代码的注释中添加了有关原始代码的各种要点:

Sub readArray()
    Dim CoGrade As Variant 'Don't bother with ()
    Dim LastRow As Long 'Integer risks overflow
    Dim A As Long, ArrayRows As Long 'you use these -- so declare it
    Dim NPSeQuedan As Variant 'etc.
    Dim SeQuedanRng As Range


    'erases information from arrays if there was any
    'Erase CoGrade -- VBA is garbage collected and these have just been declared, so 100% pointless

    'Erase NPSeQuedan

    '-------------------------------------------------------------------------
    'find the last row on the data i want to read
    LastRow = Cells(Rows.Count, "B").End(xlUp).Row 'why hard-wire in 10000?

    'the relevant data starts on row 34
    ArrayRows = LastRow - 34 + 1
    'redifines the variables with the total numbers of stocks in the portfolio
    'ReDim CoGrade(ArrayRows, 1) -- pointless

    ReDim NPSeQuedan(1 To ArrayRows, 1 To 1) 'this is important for what you are doing

    'reads each relevant number into its proper variable

    CoGrade = Range(Cells(34, 2), Cells(LastRow, 2)).Value

    '' test
    Set SeQuedanRng = Range(Cells(34, 13), Cells(34 + ArrayRows - 1, 13))

    For A = 1 To ArrayRows
        NPSeQuedan(A, 1) = CoGrade(A, 1)
    Next

    SeQuedanRng.Value = NPSeQuedan 'works now!

End Sub