[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ:指定範囲内の文字検索と置換え処理を高速化する方法』(スマトラ)
度々、お世話になっております。
先程の関連処理でアドバイスをお願い致します。
(シート構成見直して数行変わっております)
置換え先のデータ範囲→BV3:最終行〜最終列&行
データ置き換えの判断元のデータ範囲→D3:最終行
質問内容
D列に出勤者番号を「1」、休日者番号を「2」と入力してあり
下記のフィルタにて「1」「2」を絞り込み、置き換え先範囲に、何らかの値があれば
「1」の該当者は→「出」と置換え
「2」の該当者は→「休」と置換え
上記の処理を行っています。
以下の「絞り込みのコード」と「置き換えのコード」を作成し、置き換えの際にCallして処理しています。結果は問題なく動作しています。
しかし、遅いです。ほんの2〜3秒程度ですが遅く感じます。
もっと大きな処理は一瞬で終了するのに、この程度の処理でここまで遅いのかと・・・・
みなさま、ある程度初心者でも理解できるコードで高速化はかれれば、アドバイスの程よろしくお願い致します。
(絞り込みのコード)
Sub Sort_区分1()
'D列目の出勤者抽出
Worksheets("管_予").Range("A2").CurrentRegion.AutoFilter Field:=4, Criteria1:="1"
End Sub
Sub Sort_区分2()
'D列目の休日者抽出
Worksheets("管_予").Range("A2").CurrentRegion.AutoFilter Field:=4, Criteria1:="2"
End Sub
(置き換えのコード)
Dim r As Range '値のあるセル
'D列出勤者抽出
Call Sort_区分1
'指定範囲をループ
For Each r In Range(Cells(3, 74), Cells(d, c)).SpecialCells(xlCellTypeVisible) If r.Value <> "" Then 'セルに値がある場合 r.Value = "出" '置き換え End If
Next
'D列の休日者抽出
Call Sort_区分2
'指定範囲をループ
For Each r In Range(Cells(3, 74), Cells(d, c)).SpecialCells(xlCellTypeVisible) If r.Value <> "" Then 'セルに値がある場合 r.Value = "休" '置き換え End If
Next
< 使用 Excel:Excel2010、使用 OS:Windows7 >
(マナ) 2018/05/06(日) 14:37
あります。同じシートです。ただ、置換え先のデータ範囲が、シート構成見直したため、2列づれて、BV3:最終行〜最終列&行 となります。
(スマトラ) 2018/05/06(日) 15:10
Sub test() Dim f As String
f = "=IF(COUNTIF($BO3:$BU3,BV$2),IF($D3=1,""出"",""休""),"""")" Range("BV3").Resize(150, 31).Formula = f
End Sub
(マナ) 2018/05/06(日) 15:23
ありがとうございます。
ワークシート関数の一括挿入を考えていたところ・・・思わぬヒントに気づき
標準機能のジャンプで値のあるセルを取得して置き換えしてみたらと思いやってみました。
↓
高速化に成功しました。
'範囲内のxlCellTypeVisible (可視セル)で、xlTextValues (テキストのあるセル)にジャンプし値を代入
Range(Cells(3, 74), Cells(d, c)).SpecialCells(xlCellTypeConstants, xlTextValues).Value = "出"
(スマトラ) 2018/05/06(日) 16:48
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.