Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10119 / 13644 ツリー ←次へ | 前へ→

【23548】データの間引きの高速化 あいんすと 05/3/27(日) 21:40 質問[未読]
【23550】Re:データの間引きの高速化 ちゃっぴ 05/3/27(日) 21:53 回答[未読]
【23551】Re:データの間引きの高速化 ponpon 05/3/27(日) 22:40 発言[未読]
【23574】Re:データの間引きの高速化 あいんすと 05/3/28(月) 23:32 お礼[未読]
【23576】Re:データの間引きの高速化 ponpon 05/3/28(月) 23:47 発言[未読]
【23591】Re:データの間引きの高速化 あいんすと 05/3/29(火) 15:13 お礼[未読]
【23577】Re:データの間引きの高速化 ちゃっぴ 05/3/28(月) 23:52 発言[未読]

【23548】データの間引きの高速化
質問  あいんすと  - 05/3/27(日) 21:40 -

引用なし
パスワード
   データを間引くマクロを作成しましたが、
何千という行をLoopで選択、削除していったら、
時間がかなり掛かってしまいました。

やはり一度に削除する行を選択し、削除した方がいいのでしょうか?

すいませんが、何とか高速化出来ないでしょうか?


Sub データの間引き()

'StrRow・・・間引きを開始する行番号
'Thin_Num・・・間引き量(例:Thin_Num=5場合、4列ずつ削除する)

'A列が
'(変更前) 0, 0.1, 0.2, 0.3, 0.4, 0.5,・・・
'→ (変更後) 0, 0.5, 1.0 ・・・  となる。


Dim StrRow, Thin_Num As Integer

Do Until Cells(Str, "A") = ""
  Range(Cells(StrRow + 1, 1), Cells(StrRow + Thin_Num - 1, 256)).Select
  Selection.Delete shift:=xlUp
  StrRow = StrRow + 1
Loop

End Sub

【23550】Re:データの間引きの高速化
回答  ちゃっぴ  - 05/3/27(日) 21:53 -

引用なし
パスワード
   高速化するためのPoint

1. 行(列)の削除は行わないこと
  行の削除は、削除する際、Indexの再構築が行われるので、
  非常に処理の重たい作業となります。
  Sort, 別のSheetにCopyするなどを駆使してやりましょう。

2. Select, Activateは使用しない
  選択するという作業を行わないだけで、格段に高速化します。

3. Cellの指定に文字列を使用しない。
  Cellsの引数に数値と文字列を指定した場合の速度を比較すると、
  文字列を指定した場合のほうが3割程度余計な時間がかかります。

4. Integerで有効な範囲でもLongを使用する
  現在のOSは32bit CPU向けに書かれていますので、32bitの型で
  処理するほうが高速です。

以上を踏まえた上で、がんばって修正してください。

【23551】Re:データの間引きの高速化
発言  ponpon  - 05/3/27(日) 22:40 -

引用なし
パスワード
   ponponです。こんばんは。
逆に考えて、必要な部分を抽出したらいかがでしょう。

以下コードは、sheet1のA列のデータを4つおきにsheet2のA列にコピーします。

Sub test3()
  Dim myVal As Variant
  Dim A As Long
  With Worksheets("sheet1")
   A = .Range("A65536").End(xlUp).Row
   For i = 1 To A Step 4
   myVal = .Cells(i, 1).Value
   Worksheets("sheet2").Cells((i + 4) \ 4, 1).Value = myVal
   Next
  End With
End Sub

【23574】Re:データの間引きの高速化
お礼  あいんすと  - 05/3/28(月) 23:32 -

引用なし
パスワード
   ▼ponpon さん
▼ちゃっぴさん

回答ありがとうございます。
まだ作っていませんが、
2つのシート間で貼り付け作業を繰り返すのって動作が遅くなりませんか?

【23576】Re:データの間引きの高速化
発言  ponpon  - 05/3/28(月) 23:47 -

引用なし
パスワード
   ponponです。
6000行ぐらい確かめましたが、ほとんど一瞬ですよ。

【23577】Re:データの間引きの高速化
発言  ちゃっぴ  - 05/3/28(月) 23:52 -

引用なし
パスワード
   >2つのシート間で貼り付け作業を繰り返すのって動作が遅くなりませんか?

>2つのシート間で貼り付け作業を繰り返すのって動作が遅くなりませんか?

どっちが速いか測定してみるのが一番です。

Timer関数をつかってもいいですし、TimeGetTime API, GetTickCount APIを
使用してもいいでしょう。

'API宣言
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Sub S_CallTest()
  Dim lngStartTime As Long
  Dim lngEndTime As Long
  Dim i As Long
  
  lngStartTime = timeGetTime
  ' 処理
  
  lngEndTime = timeGetTime
  
  Debug.Print (lngEndTime - lngStartTime)
End Sub

【23591】Re:データの間引きの高速化
お礼  あいんすと  - 05/3/29(火) 15:13 -

引用なし
パスワード
   ▼ponpon さん:
▼ちゃっぴさん:

確かに作業が格段に早くなりました。
ありがとうございます。

10119 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free