Excel2003で処理が早い方法について質問

このQ&Aのポイント
  • XCEL2003 VBAでデータの一行にまとめる処理が遅いため、処理を早くする方法を教えてください。
  • 現在、オートフィルタを使用して一つずつデータを抽出しているが、件数が多いため処理に時間がかかる。
  • 一行にまとめて表示するための効率的な記述方法を教えてください。
回答を見る
  • ベストアンサー

excel2003 で処理の早い記述があれば

XCEL2003 VBAで質問です。よろしくお願いします。 まず、リンク先の写真を参照お願いします。 https://www.dropbox.com/s/01saveqkt1u93zj/%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3.JPG?dl=0 A列-連続番号の数字 B列-名称があり、あらかじめ昇順に並んでいます。 同じ名前が複数行続く場合と、そうでない場合があります。 C列~H列-同じ名称(ひとつの名称)の中でそれぞれ計1個か、0個データが入っています。 これを別のシートで、写真の下表の様に、一つの名称を一行にまとめたいです。 この時 数値の入っているデータは、一行に集合して表示されます。 私のVBAの記述だと、オートフィルタで一件ずつ名称を抽出して、コピーの空白セルを無視して貼り付けるというやり方で、一行にまとめていますが、データが一万件ぐらいあり、いまいち処理が遅くて困っています。 どういう記述だと処理が早いか教えてもらえないでしょうか?

  • puyopa
  • お礼率87% (459/525)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

2003 であっても Excel には「統合」という機能があり、お望みの処理がパッとできます。オートフィルタではありません。これを手動またはマクロを使って動かしてください。まずは参考 URL などを読んで、統合について学んでください。 マクロ記録をしてもらえば分かりますが、Range.Consolidate メソッドが統合に相当します。VBA のヘルプも参照してください。 添付図では、表示されているダイアログで OK することにより、B19 セルの位置に統合されたデータが貼り付けられました。A 列は、わざと除外して統合しています。A 列へのデータの記入については、統合の後で、「WorksheetFunction.VLookup メソッドにより検索した NO」を空白セルの Value プロパティに、あるいは「VLOOKUP 関数を含む数式」を同じ範囲の Formula プロパティに代入すればいいだけですね。

参考URL:
http://www.eurus.dti.ne.jp/~yoneyama/Excel/tougou.html
puyopa
質問者

お礼

回答ありがとうございました。 EXCELにそんな便利な機能があるなんて、知りませんでした。 是非、統合を使い込んで、活用させていただきたいと思います。 ありがとうございました。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! どれだけ短縮できるか判りませんが、一例です。 Sheet1のデータをSheet2に表示するようにしてみました。 尚、Sheet3を作業用のSheetとして使用していますので、Sheet3は使用していない状態にしておいてください。 標準モジュールです。 Sub Sample1() Dim i As Long, j As Long, k As Long Dim lastRow As Long, endRow As Long, myMax As Long, c As Range Dim wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet2") Set wS3 = Worksheets("Sheet3") Application.ScreenUpdating = False wS2.Cells.Clear With Worksheets("Sheet1") .Rows(1).Copy wS2.Range("A1") lastRow = .Cells(Rows.Count, "B").End(xlUp).Row .Range("B:B").AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("I1"), unique:=True For i = 2 To wS3.Cells(Rows.Count, "I").End(xlUp).Row On Error Resume Next '←念のため .Range("A1").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "I") endRow = .Cells(Rows.Count, "B").End(xlUp).Row If endRow > 1 Then Range(.Cells(2, "C"), .Cells(lastRow, "H")).SpecialCells(xlCellTypeVisible).Copy wS3.Range("C2") myMax = 0 For j = 3 To 8 myMax = WorksheetFunction.Max(myMax, WorksheetFunction.CountA(wS3.Columns(j))) Next j If myMax > 0 Then Range(wS3.Cells(2, "C"), wS3.Cells(endRow, "H")).SpecialCells(xlCellTypeBlanks).Delete shift:=xlUp Range(wS3.Cells(2, "B"), wS3.Cells(myMax + 1, "B")) = wS3.Cells(i, "I") Set c = .Range("B:B").Find(wS3.Cells(i, "I"), LookIn:=xlValues, lookat:=xlWhole) wS3.Cells(2, "A") = .Cells(c.Row, "A") If myMax > 1 Then For k = 3 To myMax wS3.Cells(k, "B") = wS3.Cells(k - 1, "B") + 1 Next k End If Range(wS3.Cells(2, "A"), wS3.Cells(myMax + 1, "H")).Cut wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If End If Next i wS3.Range("I:I").Clear .AutoFilterMode = False End With Application.ScreenUpdating = True wS2.Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous wS2.Activate End Sub ※ じっくり考えればもっと簡単になるかもしれませんが とりあえずはこの程度で・・・m(_ _)m

puyopa
質問者

お礼

ありがとうございました。 まだ理解できていませんが、 後日改めて勉強させていただきます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

参考に Sub Test()   Dim v1 As Variant, v2 As Variant   Dim 名称 As String, i As Long, j As Long, ii As Long   v1 = Range("A3", Cells(Rows.Count, "A").End(xlUp)).Resize(, 8)   ReDim v2(1 To UBound(v1), 1 To 8)   For i = 1 To UBound(v1)     If v1(i, 2) <> 名称 Then       名称 = v1(i, 2)       ii = ii + 1       v2(ii, 1) = v1(i, 1)     End If     For j = 2 To 8       If v1(i, j) <> "" Then v2(ii, j) = v1(i, j)     Next j   Next i   Worksheets("別シート").Range("A3").Resize(UBound(v1), 8).Value = v2 End Sub

puyopa
質問者

お礼

回答ありがとうございました。 すごく、上手に短文に集約されていて、 読みやすかったです。 理解するのに、時間がかかり、お礼が遅れて すみませんでした。

関連するQ&A

  • excel2003 複数の行のデータを連動して消す

    excel2003 のvbaで質問です。 changeイベントで、とある列で複数行のデータを消すと、 それと同じ複数行の指定列を連動して消せるようにしたいです。 https://www.dropbox.com/s/01saveqkt1u93zj/%E3%82%AD%E3%83%A3%E3%83%... 私がやると、どうしても先頭の一行しか消すことができず投稿いたしました。 どのように記述したらいいか、教えていただけないでしょうか。

  • EXCEL2000VBAの記述について

    e列~j列の5行目に 下記の項目が入っています。   e列 f列 g列 h列 i列 j列 5行目 4月 5月 6月 7月 8月 9月 別シートのE列の5行目に入っているデータと、上記の列(e列~j列)の5行目に入っているデータが 同じの場合は、別シートのE列の6行目から38行目に入っているデータをコピーして、上記の 同じ項目の場所の6行目から38行目にデータを貼り付けたい場合 VBAで記述の仕方を教えてください。

  • Excel教えてください。

    いつもお世話になってます。 |A |B |C |D |E | 1|(1) |(2) |(3) |(4) |(5) | 2|(6) |(7) |(8) |(9) |(10) | のように列に入ってるデータを |A | 1|(1) | 2|(2) | 3|(3) | 5|(4) | のように一行に並べたいのですが、何か簡単に出来る方法がありましたら教えてください。 Win.95 Excel 97

  • excel2003の入力を省力化したい

    写真のように A,C,E列に記号 B,D,F列に文字が入っています。 そこで、A~F列に何かしら入力した場合、 G列、H列には、それぞれ A-C-E、B-D-Fを ハイフンで連結した文字を、自動で表示させたいです。 ただし、A~F列の値を消した場合、G列とH列の値もクリア させたいです。 どうか、VBAの記述を教えていただけないでしょうか? できれば、早くて、負荷の少ない記述が助かります。

  • excel2000でお助けください

    関数では、何とかできるのですが、ファイルがとても重くなってしまうので、VBAの記述で対処するコードの記述を教えていただきたいです。 まず添付写真を参照願います。 mainシートに、A列-年月日、B列-時間、C列-データと3列構成の表があります。 一日24行のデータがあり、毎日ずっとデータが更新して下行に増えていきます。 そして、隣のシートに[00時]、さらにその隣に[01時]、[02時]・・・・とシートが[23時]まで計24枚のシートが続いています。 これらのシートは、A列-年月日、B列-データの2列構成です。 ここで、mainのシートのコマンドボタンを押すとカレンダーが表れ、その日をクリックすると mainシートのそれぞれの年月日と時間に対応するデータを、それぞれの時間に対応するシートに自動で転記させたいです。 たとえば、写真のように、mainシートの2013/8/22の00時のデータが541なので、00時シートの2013/8/22の行のデータの値を、自動で541と表示させたいのです。 mainシートにどういったコードを記述すれば、こういったことが出来るか、教えていただけないでしょうか? 自分では、どうもコードがイメージできず、せめてヒントだけでも教えていただけると助かります。

  • excel2000マクロ記述

    シート名JISEKIの中のF列には2行目から4桁のコードが入っています。 X列の2行目から数値データが入っています。 条件としてF列のコードがA310又はA505で、X列の数値がマイナスの場合は、 R列からW列の数値データを非表示にしたい。 これをマクロ化したいのですが、記述の仕方を教えてください。

  • excel2000マクロ記述方法

    抽出条件方法のマクロ記述 1つのファイルのシートの中にデータがあります。 例ファイル名a.xlsシート名マスター     B列 C列   D列    E列 項目名 倉庫  翻訳  ソート  非表示項目     A057 レオナ工場  1     A870 セ新港    2    Y     A887 セ日向    3 もう1つのファイル 例ファイル名B.xlsシート名WORK     A列   B列   c列    d列    E列    連結コード  品名  倉庫 出荷1  加工1  AA 0G120 0G120  A870 0 0 0 AA 0H120 0H120  A057 0 0 0 AA 0S0100 0S010  A887 0 0 0 抽出条件方法 シート名WORKのデータの中のC列と、シート名マスターのB列の倉庫を参照して 非表示項目のYが入っていない、倉庫と同じデータをシート名WORKのデータを抽出したい 場合のマクロ記述の方法を教えてください。よろしくお願いします。 (抽出表示方法) AA 0H120 0H120  A057 0 0 0 AA 0S0100 0S010  A887 0 0 0     

  • Excel並べ替えマクロ

    よろしくお願いします。 Excel並べ替えマクロについて質問なのですが、画像を見ていただきたいのですが、 前提条件としてL列~S列までは画像とるために非表示にしてあります。 又非表示にしてありますがQ列は区切り線でQより右側と左側は支店Aと支店Bのデータになります。※左側データの支店Aのデータを基準にします。 (1)D列を名称ごとに並べ替えします。 (2)E列を名称ごとに並べ替えします。 (3)E列の名称ごとにJ列の高い順に並べ替えします。 (4)左側の支店Bも基準となる支店Aと比較できるように横並びに見れるようにします。 (5)横並びにできたらE列の名称ごとに太線で分けます。 どうぞよろしくお願いいたします。

  • EXCEL2007マクロ/オートフィルについて

    VBA初心者です。 EXCEL2007でオートフィルのマクロを作ったのですが、下記のケースで困っています。 A列のデータが入っている行までB列のデータをオートフィルで入力したく、 A列の最終行からデータが入っている行までを求めてB列のデータをオートフィルで入れるため、下記のマクロを設定しました。 Sub test()   Range("B1").AutoFill Destination:=Range("B1", Range("A1048576").End(xlUp).Offset(, 1)) End Sub ところが、A列のデータが2行以上ある場合はうまくいくのですが、一行のみだった場合オートフィルができなくてマクロがとまってしまいます。 一行なので当然なのですが、このような処理をしたい場合、他に方法はないものでしょうか? お知恵を拝借できますと大変助かります。 どうぞよろしくお願いいたします。

  • ● Excel VBAでの計算処理

    ● Excel VBAでの計算処理 超初心者です。いろいろ研究したのですが、よくわかりません。 VBAに詳しい方、是非をお教えください。VBAでやりたいことは以下のことです。 (1)あるブックのSheet1、A列の項目の特定のキーワード(例えば”数量”)を検索条件にしてデータを検索し、その行の複数の列(例えばAA列からCC列)の数値データに-1を掛けて正の数をすべて負の数にする。 (2)上記(1)の結果を別のブックの”計算結果”というシートに抽出する。 (3)元のブックには”数量”のほかさまざまなキーワードが設定されたデータが混在しています。また、計算の対象となる列のはじまりと終わりは特定できる。しかし、もとのブックの行数(データ件数)は特定できないとします。 イメージとしては、 元のブックにあるデータ) A列  B列  C列  ・・・・・ AA列 ・・・・ CC列 数量                5000     2376 数量                1234     9932 金額                30000    2099 結果が抽出されたブックのイメージ(結果は別のブックに抽出される) A列  B列  C列  ・・・・・ AA列 ・・・・ CC列 数量                -5000     -2376 数量                -1234     -9932

専門家に質問してみよう