[[20180921094722]] 『エラーを見つけて修正する処理の高速化』(ka) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エラーを見つけて修正する処理の高速化』(ka)

いつもお世話になっております。

「数値が文字列として保存されています」というエラーが出ている箇所を探し出して文字列を数値に変換するというコードを作成したいです。
(エラーは無視しないで数値に変換する必要があります)

現在のコードが↓なのですが大変時間がかかるので
処理を早くしたいです。
使えそうな関数やその他方法があればどうぞご教授よろしくお願いいたします。

Dim Rng As Range

For Each Rng In ActiveSheet.UsedRange

         If Rng.Errors.Item(xlNumberAsText).Value = True Then

            Rng.Value = Val(Rng.Value)

         End If

Next

< 使用 Excel:Excel2003、使用 OS:Windows7 >


>大変時間がかかるので
大量のデータということは、特定の行とか特定の列とかある程度固定することが出来ませんか?
まとまった領域なら、判定を省略して全部一旦配列変数に取り込んで変換したものを一回で出力すれば高速化出来ると思います。

該当警告のある領域と、無関係な領域に極端に差があるのならよりも
ユーザーに領域を選択させて、その中で検索すれば短縮出来ると思います。
エラー対策、行列選択される危険性も考えるとこんな感じでしょうか。

    If TypeName(Selection) = "Range" Then
        For Each Rng In Intersect(Selection, ActiveSheet.UsedRange).Address
・・・

(名無し) 2018/09/21(金) 10:30


判定する部分を、If IsNumeric(Rng.Value) = True Then とするのはどうでしょう? 数値化できそうなら処理、という感じになります。 アドレス修飾する数が減るので今より速くなりますが、意図したものと違う選択になるかも知れません。
(???) 2018/09/21(金) 10:52

 数式とかの結果とかではないのなら、
 データ→区切り位置→完了
 で済むと思うけど?
 実際、データがどうなってるのか知らないけど。
(BJ) 2018/09/21(金) 11:19

みなさん早速のお返事ありがとうございます!

ユーザーに領域選択してもらうというのが難しく、また配列については文字列と数値が入り混じっていたので断念したのですが、
特定の行列に固定するというのと、Intersectメソッドにヒントを得て
だいぶと処理を早くすることができました!

For Eachで回す場合の範囲の絞り方が分からなかったのでIntersectで絞れることがわかり
大変助かりました。ありがとうございました!!
(ka) 2018/09/21(金) 12:54


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.