- ベストアンサー
Excel2003で処理が早い方法について質問
- XCEL2003 VBAでデータの一行にまとめる処理が遅いため、処理を早くする方法を教えてください。
- 現在、オートフィルタを使用して一つずつデータを抽出しているが、件数が多いため処理に時間がかかる。
- 一行にまとめて表示するための効率的な記述方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
2003 であっても Excel には「統合」という機能があり、お望みの処理がパッとできます。オートフィルタではありません。これを手動またはマクロを使って動かしてください。まずは参考 URL などを読んで、統合について学んでください。 マクロ記録をしてもらえば分かりますが、Range.Consolidate メソッドが統合に相当します。VBA のヘルプも参照してください。 添付図では、表示されているダイアログで OK することにより、B19 セルの位置に統合されたデータが貼り付けられました。A 列は、わざと除外して統合しています。A 列へのデータの記入については、統合の後で、「WorksheetFunction.VLookup メソッドにより検索した NO」を空白セルの Value プロパティに、あるいは「VLOOKUP 関数を含む数式」を同じ範囲の Formula プロパティに代入すればいいだけですね。
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! どれだけ短縮できるか判りませんが、一例です。 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
お礼
ありがとうございました。 まだ理解できていませんが、 後日改めて勉強させていただきます。
- watabe007
- ベストアンサー率62% (476/760)
参考に 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
お礼
回答ありがとうございました。 すごく、上手に短文に集約されていて、 読みやすかったです。 理解するのに、時間がかかり、お礼が遅れて すみませんでした。
お礼
回答ありがとうございました。 EXCELにそんな便利な機能があるなんて、知りませんでした。 是非、統合を使い込んで、活用させていただきたいと思います。 ありがとうございました。