ExcelのVBAについて。


「保護範囲」という名前のつけたRange以外のUsedRangeをクリアするのに早い方法はないでしょうか。

以下の様なコードでやっているのですが、とても遅いです。


i = 1
For Each 対象セル In UsedRange

If Application.Intersect(対象セル, 保護範囲) Is Nothing Then
対象セル.Clear
End If

i = i + 1

Next 対象セル

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/03/03 02:22:59
  • 終了:2013/03/07 23:42:59

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912013/03/03 15:30:08

ポイント100pt

範囲が矩形なのか、バラバラなのか、
範囲が同一シート上だけなのか、複数シートにまたがっているのか、
などで処理が変わってきますが、アクティブなシートにすべての範囲がある前提の処理です。

Option Explicit

Sub UnprotectRangeClear()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    
    Dim dstWS As Worksheet
    Set dstWS = ActiveSheet
    
    ActiveSheet.Copy
    Dim cpyWS As Worksheet
    Set cpyWS = ActiveSheet
    
    dstWS.Cells.ClearContents
    
    Dim r As Range
    For Each r In Range("保護範囲")
        dstWS.Cells(r.Row, r.Column).Value = cpyWS.Cells(r.Row, r.Column).Value
    Next

    cpyWS.Parent.Close Savechanges:=False
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
id:tetlis

ありがとうございます。私には難しい部分があるのですが、調べながら読み解きたいと思います。

2013/03/07 23:36:33
  • id:windofjuly
    うぃんど 2013/03/03 02:36:06
    眠いのでヒントだけ

    (案1)
    1.保護範囲のデータを変数に入れる
    2.シート全クリア
    3.変数から保護範囲に書き戻す

    (案2)
    1.保護範囲の左上セルと右下セルの位置を得る
    2.保護範囲より上をクリア
    3.保護範囲より左をクリア
    4.保護範囲より右をクリア
    5.保護範囲より下をクリア

    どちらも速度差はあまり無いと思うのでお好きなほうでどうぞ。
  • id:tetlis
    お眠いところ、ありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません