9

変更中の既存のコードがいくつかあります。このコードは、既存のワークシート テーブルから行のコレクションを作成します。各列に個別の情報を持つ大規模な 2-D コレクションが作成されます。各列のデータ型を宣言する別のクラス モジュールがあります。

このコードは、各項目を順番にループすることにより、2-D コレクションを新しいシートに書き込みます。これまでコレクションを使用したことがなく、1 回のパスでコレクションをシートに書き込みたいと考えています。テーブルに多くのレコードがある場合、現在のコードは非常に長い時間がかかります。

コレクション全体を 2 次元配列に変換する方法、または 2 次元配列を一度に書き込めるようにする方法はありますか? または、2 次元配列のように、コレクション全体をシートに書き込む方法はありますか? 私はこれを検索しようとしましたが、これまでのところ成功していません。一般的なポイントをいただければ幸いです。

コレクションがどのように使用されているかを示すために、コメントを太字で示したコード例を次に示します。

TableEntry という名前のクラス モジュールを定義します。

Public Item1 As String
Public Item2 As String
Public Item3 As String
Public Item4 As Integer
Public Item5 As Integer

メイン ルーチン - コレクションの作成、コレクションの入力、シートへのコレクションの書き込み

Sub MainRoutine()

Dim table As Collection
Set table = New Collection

Call FillCollection(File As String, ByRef table As Collection)

Call WriteCollectionToSheet(ByRef table As Collection)

サブルーチン 1 - コレクションを埋める

Dim wb As Workbook
Set wb = Workbooks.Open(File)

Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets

Dim R As Range
Set R = ws.Range("A2")

  Dim e As TableEntry
  For i = 1 To 20

    Set e = New TableEntry

    e.Item1 = R.Offset(i + 1, 0).Offset(0, 0)
    e.Item2 = R.Offset(i + 1, 0).Offset(0, 1)
    e.Item3 = R.Offset(i + 1, 0).Offset(0, 2)
    e.Item4 = R.Offset(i + 1, 0).Offset(0, 3)
    e.Item5 = R.Offset(i + 1, 0).Offset(0, 4)

    table.Add e

  Next i

Next ws

サブルーチン 2 - コレクションをシートに書き込む

4

2 に答える 2

4

コード内に入力した 2D 配列をワークシートに書き込みたい場合は、このコードを使用します。ワークシートに一度だけ「話しかける」だけなので、非常に効率的です。

Dim r as Range
Dim var_out as Variant
Set r = Range("OutputValues")  
r.clear
var_out = r.value

'Then use code to appropriately fill the new 2D array var_out, such as your subroutine 1 above

r.value = var_out

配列を印刷するワークブックの範囲を特定することから始めます。この例では、出力範囲に「OutputValues」という名前を付けたとします。

r.value を var_out (入力する予定の配列変数) に最初に割り当てると、範囲のサイズに基づいて配列変数の次元が設定されます。(範囲内の既存の値も読み取るため、それが必要ない場合は、ここで示したように範囲をクリアしてください。)

配列変数を範囲に 2 番目に割り当てると、値がシートに書き戻されます。

于 2013-12-19T04:06:10.933 に答える