2017-11-21 6 views
0

配列が大量であるため、サイクルのためにシートをExcelに渡すためにデータを書き込んでいましたが、より速い選択肢を検討した。配列から範囲へのセルへの書き込み:配列が範囲内に完全に表示されない

今、私は、配列に直接セルの範囲の値を設定して情報を表示しよう:

Sub displayRandomMatrix(clientsColl As Collection, resultWorkbook As Workbook) 

Dim NamesRange As Range 

With resultWorkbook.Worksheets("matrix_random") 
... 
Set NamesRange = _ 
    .Range(.Cells(2, 1), .Cells(clientsColl.Count + 1, 1)) 
Dim NamesArray() As String 
ReDim NamesArray(1 To clientsColl.Count) 

Dim clientRow As Long 
Dim simulation As Long 
clientRow = 1 
simulation = 1 

Dim clientCopy As client 
For Each clientCopy In clientsColl 
    For simulation = 1 To clientCopy.getRandomNumbers.Count 
      ... 
    Next 

    NamesArray(clientRow) = clientCopy.getClientName 
    clientRow = clientRow + 1 
Next 
... 
NamesRange.value = NamesArray 
... 
End With 

'debugging 
Debug.Print "**************start" 
For clientRow = 1 To clientsColl.Count 
    Debug.Print NamesArray(clientRow) 
Next 
Debug.Print "**************end" 

End Sub 

しかし、私は、私は同じクライアントの名前はすべて必要で書かれていることがわかりresultWorkbookを開いたとき第1列の細胞。同様に、コードのデバッグセクションが正しい出力を生成します - その配列に正しい複数のクライアント名があります。

その配列を範囲に割り当てると何かが壊れてしまうので、NamesRange.value = NamesArrayです。

同時に私は他の配列と同様のことを行い、うまくいきますが、これはバグが出てきます。

どういう理由が考えられますか?

注:clientsCollは、適切なクライアントのコレクションです。それには何も問題はありません。どちらもresultWorkbookではありません。

答えて

2

NamesArrayは、水平方向の配列で、垂直方向の範囲に割り当てようとしています。トランスポーズは、簡単な修正であるが、その制限がありApplication.Transpose

NamesRange.value = Application.Transpose(NamesArray) 

を使用してみてください。問題が解決しない場合は、あなたの配列の第二次元を宣言することによって垂直配列を強制する必要がありますので:

NamesArray(clientRow,1) = clientCopy.getClientName 

:次に

ReDim NamesArray(1 To clientsColl.Count, 1 to 1) 

あなたはそれが第二の次元が含まれていることを確認してください埋めるとき次に、あなたが持っている通りに割り当てることができます:

NamesRange.value = NamesArray 
+0

ありがとう!私もコード内に1次元の配列を持っていますが、私はそれをいくつかの列(水平方向)に1行表示します。水平表示は、その配列で変換を行う必要はないという意味ですか? – Ans

関連する問題