2016-05-05 4 views
0

私は大量のデータを処理しているExcelブックを持っています。この時点では、およそ5000列と1000行ですが、これは大きくなります。私は定義されていると、私は次のようにforループを二重を使用する場合は、次のように配列にはvbaの配列の特定の列にデータの列全体を割り当てる

ReDim arr(1 To numRows, 1 To lastcol3) 

私は配列全体を読み込むことができ、それが動作します:

WS1は、ワークシート内にある
For r = 1 To lastcol3 
    For i = 1 To numRows 
    arr(i, r) = ws1.Cells(i, 11) 
    Next 
Next 

質問11はデータを取得したいデータの列です(rのすべての値が変更されます)。このメソッドは機能しますが、データの各行をループする必要があるため、膨大な時間がかかります。

rのすべての値に対して、配列内の対応する列 "r"に列11を割り当てる方法があるのだろうかと思っていました。これにより、コードがrだけループする必要があります。

私はオンラインでたくさんの検索をしましたが、配列内の特定の列を定義してデータの範囲と同じにする方法が見つからないようです。

コードの詳細やコピーが必要な場合は、教えてください。

+0

警告a保存するオプションが設定されたアレイを赤目補正するときに情報を保持したい場合は、アレイの最後にリストされたディメンションのサイズを変更することしかできません。あなたに役立つかもしれないし、役に立たないかもしれないが、私がこの問題に遭遇して以来、私が言及すると思った。 –

+0

サイズを定義する必要はなく**メモリに範囲値を読み込む**についての記事がたくさんあります。 'Dim oValues as Variant:oValues = ActiveSheet.UsedRange.Value'のような何かを行うことができます。これは、空の値を含む使用範囲のすべての値をメモリにロードします。境界を取り出すには 'LBound/UBound(oValues、1/2)'を使います:1:rows、2:cols – PatricK

答えて

0

ループを使わずに範囲から直接配列を割り当てることができます。配列の型はvariantでなければなりません。

dim myArr() as Variant 
dim myRng as Range 

Set myRng = Worksheets("Sheet1").Range("A1:Z100") 
myArr = myRng.Value 
'... do stuff with myArr 

Set myRng = Worksheets("Sheet2").Range("A1:Z100") 
myRng.Value = myArr 

Chip Pearsonには、便利な配列処理ルーチンが多数あります。

1

私にとっては、あなたは値を求めているだけです。ただし、ワークシートとのすべての対話は、変数間の対話よりもはるかに遅いです。それをあなたの方法を行うためにヘルパー変数を使用するか:

Dim xxx As Variant 
xxx = ws1.Cells(i, 11).Resize(numRows, 1).Value 
For r = 1 To lastcol3 
    For i = 1 To numRows 
    arr(i, r) = xxx(i, 1) 
    Next 
Next 

またはこのような()()オプションで行くより速くなるように:

ReDim arr(1 To lastcol3) 
Dim xxx As Variant 
xxx = Application.Transpose(ws1.Cells(i, 11).Resize(numRows, 1).Value) 
For r = 1 To lastcol3 
    arr(r) = xxx 
Next 

が、値を取得するために、あなたは次のようにそれに対処する必要がありますarr(r)(i)これは最初は混乱するかもしれません。しかし、それはまたあなたが後で何をしようとしているかによっても異なります。

+0

これはそれを釘付けにしました! –

+0

ご協力いただきありがとうございます。私はかなり後に私を許してください、私はvbaに比較的新しいと私はまだ足を見つける。 メソッドが動作しているように見えますが、間違いがなければ、すべての行「i」を繰り返し処理する必要がありますか?私はそれを試して、それはまだ非常にゆっくりと実行されます。 1000行×5000列の配列を作成したいとします。私がrの値を増やすたびに、データの列が変わり、配列に追加されたデータの列をr = 1からlastcol3に、行ごとに行かなくても欲しい。 私はあなたの説明を誤解しましたが、これは何ですか? – Kettle

+0

実際に役立つには、同じ列が5000倍以上必要な理由を知っているとよいでしょうか? 'arr(i、r)= ws1.Cells(i、11) 'のように、配列の5k列はすべて同じデータを保持します。たぶん別のアプローチは、あなたのコードを狙ったほうが速いのです... –

関連する問題