• ベストアンサー

【ExcelVBA】 セルの削除(上方向にシフト)を超高速にする方法

Range("A1:A100").Delete Shift:=xlUp で セルの削除で上方向にシフトになりますが、 この作動が0.17秒くらいかかります。 これを0.10秒未満に。 できれば0.02秒くらいにしたいのですが、 何か別の方法ありませんでしょうか。 また、コードの工夫以外にも、 Officeの設定で早くなったりするのでしょうか? セルが削除されなくても、下のセルが上へ移動でも構いません。 たとえば、Rnage("A1”)=Range("B1")に変数を使って、 ループで100セル繰り返せば、実質同じ作動になりますが、Deleteより当然遅いです。 さらに、Rnage(”B1")より下のセルが、全て上方向に 移動しないと困るので確実に使えません。 環境 WinXP、Win7 Office2003 ハードについてのアドバイスは一切不要です。 高速な作動が必要な理由についての返答は一切不要です。

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

  • ベストアンサー
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.3

win7 winxp  office2003の条件で 白紙に近い状態で、遅いPCと速いPCで調べてみました。  ハードに言及しないという条件を守ると、 シートを見せないでやると1ミリ秒以内で、 シートを小さくすると4ミリ秒 シートを大きく見せて数字を2000個と乱数データを3000個入れたシートで 14~20ミリ秒くらいでした。 A1:A100でもA1:A1000でもほとんど同じでした。 0.17秒(170ミリ秒)もかかるのには 何か理由があるはずです。  アップデートプログラムがインストール待ちになっているとか?

emson100
質問者

お礼

ご返答ありがとうございます。 そんなにも早く処理が終わるものなのですね。 アップデートプログラム的なものは特になかったです。 当方の結果がこんなに遅いものとは知りませんでした。 こんなにも速度が違うのなら、 他のコードが干渉している可能性がありますね。見直します。 シートを小さくすると、処理速度に影響があるとは思いもしませんでした。 早速試させて頂きます。 実例を具体的に示して頂き本当にありがとうございました。

その他の回答 (2)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

理由は解りませんが、VBAによる行列やセルの削除を伴う処理は、他の処理と比較すると時間が掛かるようです。 >ループで100セル繰り返せば、 実際にどのような動作になるのか文面ではイメージ出来ませんが・・・。 範囲を決められるならコピーでも良いのでは? Range("A101:A200").Copy Range("A1:A100") Range("A101:A200").ClearContents

emson100
質問者

お礼

ご返答ありがとうございます。 コピペも試したのですが、範囲コピーしている状態が一瞬でも入ると、 その直後に範囲を解除しても、 結構時間がかかったので、Deleteに行き着きました。

  • seiiiichi
  • ベストアンサー率41% (79/190)
回答No.1

すでに試されているか分かりませんが、、 Application.ScreenUpdating = False で画面描写を更新しないようにはされていますか?

emson100
質問者

お礼

記載不備申し訳ございません。 Application.ScreenUpdatingは使っております。

関連するQ&A

  • 【EXCELマクロ】空白のセルを削除する

    質問させてください。 ある特定のセルのみなにも記述されていない場合に削除するマクロを作成したいと思っております。 以下のようにコードを書いたのですがセルが削除されません。 知っていらっしゃる方いらっしゃいましたら教えていただけないでしょうか。 k = <<任意の数の場合>> If ThisWorkbook.Worksheets(<<【シートネーム】>>).Range("A" & k) = "" Then ThisWorkbook.Worksheets(<<【シートネーム】>>).Range("P" & k).Delete Shift:=xlToLeft End If If ThisWorkbook.Worksheets(<<【シートネーム】>>).Range("J" & k) = "" Then ThisWorkbook.Worksheets(<<【シートネーム】>>).Range("P" & k).Delete Shift:=xlToLeft End If                       : 削除後は左方向にシフトしたいと思っております。 以上、大変お手数をお掛けいたしますが宜しくお願い致します。

  • excelのセル複数削除について

    2箇所の範囲を削除したいのですが、 Rows("188:247").Select Selection.Delete Shift:=xlUp Rows("311:373").Select Selection.Delete Shift:=xlUp とすると最初に削除されるとRowがずれてしまって、 次のRows("311:373").Selectがうまく削除できません。 2つを同時に削除することは可能でしょうか? 最大で3つまで削除を考えています。 どうぞよろしくお願い致します。 excel2000です。

  • マクロでセルの移動方向を変えるには

    ひとつのシート内に表が3つあり、それぞれの表のセルの移動方向を変えたいのですが マクロを使えば可能でしょうか? 【表A】A1:B30 (セル移動「下」) 【表B】D1:P10 (セル移動「右」) 【表C】d2:K30 (セル移動しない) ([エクセルのオプショ]-[編集設定]でセルの移動方向は「下」に設定しています) よろしくお願いします。

  • ExcelVBAで任意のシートの任意のセル範囲を削除する方法

    http://okwave.jp/qa1222496.html こちらのページを参考にやってみたのですが、下記コードの3行目で 「アプリケーション定義またはオブジェクト定義のエラーです」となります コードは以下のとおりです ---------- X = Sheets("Sheet1").Cells(1, 1).Value  Sheets("Sheet2").Select Sheets("Sheet2").Range(Cells(X, 1), Cells(X, 7)).Select Selection.Delete shift:=xlUp ---------- Sheet1のA1には任意の数字が入り、その数字に対応したセル範囲を削除するというものです 仮に3と入っているとして、Sheet2のA3からG3までを削除して 行を詰めたいと考えています Sheet1のA1には確かに数字が入っていることは確認しております あともし可能であれば、Sheets("Sheet2").Selectをしなくても 行を削除する方法があればご教授願いたいと思います webでいろいろ調べてみましたが、Sheets("Sheet2").Select としないといけないようでした VBAはまったくの初心者ですので、そもそも調べ方が間違っているかもしれませんが・・・

  • 指定するセルのRange書き込み変更

    Sub 移動と削除() Range("A1").Select Selection.Cut Destination:=Range("E1") Range("A1").Select Selection.Delete Shift:=xlUp End Sub 自動マクロで作った上記の記録があります。これをA1固定ではなくA列の指定するセルにし E1もA列で指定したセルと同じ行のE列にしたいのですが書き換える方法をおしえてください。

  • Excel2007 セルを右方向に削除する方法

    例えば、Excelのデータで各セルに次のような入力があります。 A A A B C D A A B C D A B C D これを A A A B C D   A A B C D     A B C D というように、空白のセルを右方向に削除し、一番右に入力のあるセルの列にすべての行を揃えたいです。 500行以上あるデータなので、一気にできる方法を探しています。 セル選択後、削除する時に「左方向にシフト」や「上方向にシフト」はあっても、「右方向にシフト」がないため、データ処理に苦戦しています。 マクロの知識がないので、マクロを使わない方法(複雑すぎなければ関数でも・・・)があれば嬉しいです。 最終的には、 A B C D A B C D A B C D とまとめる予定のデータです。 拙い説明で申し訳ありませんが、 もし、ご存知の方がいらっしゃっいましたら、よろしくお願いいたします。

  • ファイルごとにセルの移動方向を自動的に決める方法は?

    エクセルに関する質問です。 業務でエクセルを頻繁に使いますが、書類の中身によってセルの自動移動(入力後のセル移動)方向が、右だったり下だったりします。 一応、オプションで移動方向を変更するまでの動作を記憶させたマクロをキーに割り付けてはあるのですが、ファイルごとに移動方向を決めておくことが出来たら、もっと便利だと思いました。 つまり、Aのファイルでは入力後セルは下に移動し、Bのファイルに切り替えたらセルの移動は右に、というように自動的に切り替えることが出来ないでしょうか? なおファイルを開くごと、ではなく、開きっぱなしにした複数のファイルを交互に使用しますので、「ALT+W」キーなどでファイルを切り替えるだけで実現したいのです。 よろしくお願い致します。

  • ExcelVBAで、キーボード方向キーを押したら、その方向に塗りつぶし

    ExcelVBAで、キーボード方向キーを押したら、その方向に塗りつぶしたセルを移動させたいです。 とりあえず、以下のようなマクロを組んだのですが、 方向キーを一度でも押すと、押した方向の彼方へ一瞬で飛んでいってしまいます。 Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long 'キー入力のAPI '一番最初に塗りつぶすセル set 塗りつぶし = Range("B2,C2")  do 塗りつぶし.Interior.ColorIndex = 3 '赤く塗りつぶし '左入力したら塗りつぶしセルを左に移動 If GetAsyncKeyState(37) Then     塗りつぶし.Interior.ColorIndex = 0     Set 塗りつぶし = 塗りつぶし.Offset(0, -1) End If '右入力したら塗りつぶしセルを右に移動  If GetAsyncKeyState(39) <> 0 Then 塗りつぶし.Interior.ColorIndex = 0 Set 塗りつぶし = 塗りつぶし.Offset(0, 1) End If Loop 予想なんですが、一度でもキーを入力したら、 その方向へずっと入力しているようになっている と思うのですが、どう直して良いか分かりません。 宜しくお願いします。

  • エクセルマクロで行を変えて千回カット&ぺースト

    下記のコードでB,C,D・・・と行を1,000回変えて同じ作業をしたいのですが、どのようにしたらよいか分かりません。 どなたかお詳しい方アドバイスをお願いします。 Range("A18:A32").Select Selection.Cut Destination:=Range("B3:B17") ←B,C,D・・と変えてカットしたい。 Rows("18:32").Select Selection.Delete Shift:=xlUp Range("A18:A32").Select Selection.Cut Destination:=Range("C3:C17") Rows("18:32").Select Selection.Delete Shift:=xlUp Range("A18:A32").Select Selection.Cut Destination:=Range("D3:D17") Range("D3:D17").Select End Sub

  • マクロでエクセルの行を準に削除したいのですが…(;_;)

    エクセルのマクロを使って Range("D3:E3").Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp Range("D4:E4").Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp という風に3000個ほど順番に消していきたいのですがfor...nextを使うと for I = 3 to 3000   Range("DI:EI").Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp nest I となってこれを実行するとDIのセルに飛んでしまいます。どうしたらいいのですか?教えて下さいお願いしますm(_ _)m

専門家に質問してみよう