- ベストアンサー
VBAで表の集計方法(値の出力方法)について
まだVBA初心者です。 とっても曖昧な質問なんですが、今会社で莫大なデータベース?(表:Excel)から特定条件の値を抜き取り、違うシートに表を作るマクロを作ってます。 ただ、値を抜き取ると言っても、1行目のD列が"1"だった場合は1行目のG列の値と2行目のG列の文字列をくっつけて別シートの一つのセルに入れたり…D列の値が"2"だったらG列の二つ下の文字列とくっつけて、他にもB列の日付が今日より過去だったら…みたいな条件が30以上あるんです。 そして元々の表が列数が70弱、行数は4000を超えています。 元々の表(表1)の1行目から条件を特定していき、条件が合えば移してまたその下の行を…とやっていこうと思ってます。 特定条件で抜き取るマクロはなんとか書けそうなんですが、そもそも元の表(表1)から別シートの表(表2)へ値を移す方法がどうしたらいいのかわからず質問しました。 移す方法と言うのは、例えば、元々の表(表1)のA1、C1、E1を別シートに移すとして、移す値が少なければ、A1、C1、E1をコピーして別シートにペーストすればいいんでしょうけど、あまりにも移す値が多い(1行で25の値)ので、マクロ上で条件に合う値を一度変数に全部入れて別シートにValueで入れたほうが早いですよね?それとも2つのシート間で条件に合った値のコピペを繰り返した方がよいのでしょうか?CPUやメモリの量にもよるんでしょうが、どっちの方が負担がすくなく、サクッっと行くのか知りたいです。 どう説明していいのか分からず、意味がわからないかもしれませんがよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Sheet1からSheet2にデータをコピーするだけなら、それぞれのシートを参照してValueからValueへ値を渡してしまうのが手っ取り早いです。わざわざクリップボードを経由する必要はありません。 ついでに、アドレスだけを指定すればSheet2の同じアドレスへコピーするプロシージャも作ってみたり。。。 Public Sub Sample() ' 直接コピー Sheet2.Range("A1").Value = Sheet1.Range("A1").Value ' コピー用メソッドを使ってコピー Copy "B1" Copy "B2" Copies "C1", "C2", "C4", "C8", "D3", "D5", "D7" End Sub ' 指定したアドレスをSheet1からSheet2にコピー Public Sub Copy(Address As String) Sheet2.Range(Address).Value = Sheet1.Range(Address).Value End Sub ' 指定した複数のアドレスをSheet1からSheet2にコピー Public Sub Copies(ParamArray Addresses()) Dim Address As String For Each Address In Addresses Sheet2.Range(Address).Value = Sheet1.Range(Address).Value Next End Sub もちろんこれを全て手書きで書くのではなく、For等のループ処理やSelect Caseなどの条件分岐を組み合わせて、できるだけ効率よく処理することが肝要です。
その他の回答 (1)
- rivoisu
- ベストアンサー率36% (97/264)
少なくともコピペが一番かかりそうです。 一般的には Sheet2.cells(1,1)=Sheet1.cells(2,1) ちょっと裏技的な方法ですけど一番早いのは抽出するデータ量が大きくないという条件ですが variant型の変数を宣言してこれを配列とみなしてデータを入れる 受取側のシートのrange指定=として代入 これは早いです。 暇があったらコードを書きます。 自分で調べてみてください
お礼
返事が遅れてすいませんでした。 データ量が多いので一つずつ宣言しましたが、はやいVBAが書けてとても満足してます! ありがとうございました!
お礼
返事が大変遅れてすみませんでした。 Wizard_Zeroの言うようにValue渡しで作ったら思っていた以上に速く動いて本当に助かりました! ありがとうございました!!