![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
Find関数を使用して検索を行う際に、検索対象のシートに"ヶ月"、"ヵ月"という文字が記載されていると
処理が遅くなってしまします。
解決方法をご存知の方いらっしゃいますでしょうか?
以下、読みにくいプログラムかもしれませんが、ご教授願います。
Sub ボタン1_Click()
Dim value As String
Dim pass As String
Dim template As Workbook
Dim object As Object
'検索対象文字
value = "A"
'テンプレートのパス
pass = "C:\template.xls"
'テンプレートを開く
Set template = Workbooks.Open(pass)
'テンプレートをコピー
ActiveWorkbook.Sheets.Copy
'テンプレートを閉じる
template.Close saveChanges:=False
With ActiveWorkbook.ActiveSheet.Range(Cells(1, 1), Cells(10000, 256))
'テンプレートにAという文字が存在するかのチェック
Set object = .Find(What:=value, LookAt:=xlPart, SearchOrder:=xlByRows)
Do
'存在しない場合は処理を終了
If object Is Nothing Then
End
'存在する場合はA→Bに置き換える
Else
object = Replace(object, value, "B")
End If
'引き続きSheet2にAという文字が存在するかのチェック
Set object = .Find(What:=value, LookAt:=xlPart, SearchOrder:=xlByRows)
Loop While Not object Is Nothing
End With
End Sub
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
#1です。
なかなか回答がつきませんね。相変わらずFindメソッドが遅くなることについての解決方法ではありませんが、
前回の回答で書き忘れていたことがあったので、性懲りもなく出てきました。
この手のワークシートのセルの値を逐次変更していくマクロの、実行速度を
上げるのによく効く定番のテクニックがあります。
1. プログラムの最初の方で、以下を挿入
Application.ScreenUpdating = False
プログラムの終了直前に、以下を挿入
Application.ScreenUpdating = True
これを行うと、プログラムが終了するまでの間、画面の更新が抑制されます。
2. プログラムの最初の方で、以下を挿入
Application.Calculation = xlCalculationManual
プログラムの終了直前に、以下を挿入
Application.Calculation = xlCalculationAutomatic
現在のマクロは、一つのセルの値を変更する度に自動的に再計算を実行しますので、
特にセルに計算式が書かれているセルがたくさんある場合にはよく効きます。
以上。
No.1
- 回答日時:
処理が遅くなることについては答えを持ち合わせていないので、最初に
あやまっておきます。
いくつか突っ込みどころのあるプログラムなので、出てきました。
>Dim object As Object
普通は変数名と変数の型は同じにしません。
あと、Findメソッドの返す変数はRangeオブジェクトなので、ここは
Dim rng as Range
などとすべきでしょう。
>With ActiveWorkbook.ActiveSheet.Range(Cells(1, 1), Cells(10000, 256))
処理時間を気にされるなら、もっと検索範囲を絞るべきでは? 使用されていない
セルも検索範囲に含めてないですか?
With ActiveWorkbook.ActiveSheet.UsedRange
>'存在しない場合は処理を終了
>If object Is Nothing Then
>End
ヘルプによればEndステートメントは「強制的にプログラムを終了させる手段を提供する」
と書かれています。今回の場合は、ukmtさんの思った通りに動くかとは思いますが、
かなり乱暴なやり方と言えます。普通はEndステートメントを使用しなければならない
状態にはなりません。この文脈なら普通は
Exit Do
を書きます。
>'引き続きSheet2にAという文字が存在するかのチェック
>Set object = .Find(What:=value, LookAt:=xlPart, SearchOrder:=xlByRows)
同じ文字を前回のFindメソッドと同じ検索条件で検索する場合にはFindNextメソッド
を使用できます。
Set rng = .FindNext(rng)
>Loop While Not object Is Nothing
ループの終了条件が上記にも、ループの内部にも書かれていて冗長である。
このままなら
>'存在しない場合は処理を終了
>If object Is Nothing Then
>End
の部分はループの一回目だけTrueになる可能性があるだけで、2回目以降は絶対に
Falseになる。
だからループ内のIf ... は最初のFind実行直後に持っていく(つまりループの外。
その場合、前述したExit DoはExit Subに書き換えること)か、
>Loop While Not object Is Nothing
を
Loop
と書き換える。
総括すると以下の通りになります。
Sub ボタン1_Click()
Dim value As String
Dim pass As String
Dim template As Workbook
Dim rng As Range
'検索対象文字
value = "A"
'テンプレートのパス
pass = "C:\template.xls"
'テンプレートを開く
Set template = Workbooks.Open(pass)
'テンプレートをコピー
ActiveWorkbook.Sheets.Copy
'テンプレートを閉じる
template.Close saveChanges:=False
With ActiveWorkbook.ActiveSheet.UsedRange
'テンプレートにAという文字が存在するかのチェック
Set rng = .Find(What:=value, LookAt:=xlPart, SearchOrder:=xlByRows)
Do
'存在しない場合は処理を終了
If rng Is Nothing Then
Exit Do
'存在する場合はA→Bに置き換える
Else
rng = Replace(rng, value, "B")
End If
'引き続きSheetにAという文字が存在するかのチェック
Set rng = .FindNext(rng)
Loop
End With
End Sub
なお、Do 以下は次のようにも書ける。
'存在しない場合は処理を終了
If rng Is Nothing Then Exit Sub
Do
'存在する場合はA→Bに置き換える
rng = Replace(rng, value, "B")
'引き続きSheetにAという文字が存在するかのチェック
Set rng = .FindNext(rng)
Loop While Not object Is Nothing
End With
End Sub
以上
ありがとうございます。
VBA初心者なもので、知らない事が沢山ありました!
ソースレビュー頂き、かなりソースが見やすくなりました。
ただ、肝心の
>検索対象のシートに"ヶ月"、"ヵ月"という文字が記載されていると
>処理が遅くなってしまします。・・・
の部分の根本的な解決には至っておりません。。。
何か考えられる原因などありますでしょうか???
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Tomcat高負荷時の設定について
-
[Java] while(true)の意味
-
tryの終了
-
ftp 同時複数接続の負荷テスト...
-
「UIスレッド」「マルチスレッ...
-
JavaでVBのDOEVENTSと同様の処...
-
Mac上でWindowsのファイルパス...
-
Javaプログラムからポップアッ...
-
数値の定数を付ける時
-
JavaScriptからJAVAクラスを呼...
-
ExcelVBAのFind関数について質...
-
Thread.sleep()はすべてのスレ...
-
C#の処理をリアルタイムに表示...
-
onBlurとonFocusの処理順序につ...
-
JSPで「処理中」をブラウザに表示
-
flush()メソッドについて・・・
-
印刷プレビュー表示したい .NET
-
ExcelVBA で文字列の特定の文字...
-
異名同音(C# = Db)をenumで表現...
-
無限ループをわざと作って時計...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
doGetとdoPostの違い
-
JavaScriptからJAVAクラスを呼...
-
Javaでのデバッグコード削除
-
WPF C#でF10のイベント取得方法...
-
数値の定数を付ける時
-
Tomcat高負荷時の設定について
-
Javaプログラムからポップアッ...
-
JavaでVBのDOEVENTSと同様の処...
-
JSP、サーブレットの初期処理
-
switch文の中に、throws new Ex...
-
ExcelVBA で文字列の特定の文字...
-
VBScriptでのWord印刷
-
ラジオボタンの選択判定
-
Javaアプリケーション実行の返...
-
C#で別スレッドの終了を知りたい
-
ftp 同時複数接続の負荷テスト...
-
ブラウザを閉じた後のサーバ側...
-
javaのプログラムが止まる
-
[Java] while(true)の意味
おすすめ情報