○第117回目 計算式をチェックする(その4)
今回は力を抜いて、前回で求めたエラー箇所のカウントと、その場所への移動を考えてみます。
ある場所への移動は、既に計算式中の座標に移動でまとめましたので、計算式中の座標を求める代わりに、エラーの場所の座標を取得することで可能となります。
しかしながら、エラーを対象とするので、エラー件数の目途がたちません。一定の件数以上になった場合おしまい、とするやり方もありますが、ここではさらに簡単に、検索範囲の一番最初のエラーを見つけたらおしまいとします。なお、エラー件数は全範囲で調べます。したがって、移動したいエラーの色を指定することにします(移動先のエラーとエラー件数カウントでの色の範囲がちぐはぐとなりますが、あまり気にしないでください。エラーの座標の蓄積はあまり意味がないような気がします。実際、計算式チェックをやってみますと、エラーの件数が多くてしょうがないからです)。
チェック範囲内のエラー箇所-これは色で判別する-の数をカウントします。
範囲内のセルを一つずつ調べていき、セルの色が該当する色かどうかで件数をカウントします。
エラーの内容は、
46⇒赤色=計算式を構成する項目数が異なる
27⇒黄色=座標の偏差が基準値と違う
44⇒オレンジ色=チェック1(ニ行目による)
43⇒きみどり色=チェック1(一行目による)
これまでのチェックは、調べる範囲を指定していましたが、ここでは使い勝手がいいように、自動的にそのシートのおおよその有効範囲を調べます。それをまずはチェック範囲とします。そのうちの一部も可能とします。すなわち、カーソルで指定する位置を先頭として、最後は有効範囲の端とするものです。
そのシートのおおよその有効範囲とはどうやって求めるのか…。
先頭の位置をカーソルで指定し、行数と列数を与え、範囲を求める。これでは範囲を指定しているのと同じです。先頭のセルを指定するのは必要ですが、それだけで何とか求められないか…。
おおよそですので、いい加減な方法をとります。
ボーリング調査です。
行を例として取り上げて見ましょう。
列を6個ほど決めて、その列の最終有効セルを求めます。求められた6つのセルの行数の一番大きいところを行の有効範囲とします。
全部おこなえば正確な最大有効行数がでますが、それまでやる必要はないのではということです。
同様に最大有効列は、行を適当に6つほど取り、その中で一番大きな列数を求めればいいのです。
ある列の行の一番の端はどうやって求めるのでしょうか。上から移動させていったのでは、埒があきません。一番下から上に向かって調べるのです。同様に列は、一番右端の列から左に向かって調べるのです。
Range("h65536").Select
Selection.End(xlUp).Select '表の上端へ
その場所の行数は、 Selection.Row です。
Range("iv50").Select
Selection.End(xlToLeft).Select '表の左端へ
その場所の列数は Selection.Column です。
このボーリング調査でこのシートのおおよその端がわかります。先頭位置はカーソルで与えますので、これでチェックの範囲は決まります。
このマクロはかなり簡単だと思われたのですが…。
該当する色の場所に止まりません。素通りで終了してしまうのです。
違う色コードを入力しても止まりません。
はてどうしたのでしょうかと、頭を抱えました。
そこであることに気がつきました。それは数字に見えるが文字である場合があるということです。
この場合もそれでした。数字として入れたつもりなのですが、それが文字列となっていて、それを数値変換してくれるのが普通なのですが、ある場合は、その変換がなされずに、文字列のまま認識されてしまい、入力した色コードに一致したセルがないということになったのです。入力値をVALで数値化したら、うまくいきました。
盲点です。お気を付けください。
もう一つの失敗は、列と行の二重のfor文であるので、該当するセルを見つけた場合、二重のfor文を抜け出さなければならないことでしょう。一回だけでは該当する場所が最後の列の最初の行の場所になってしまいます。
今回のマクロは、マクロ的には紹介すべきものがありませんが、おおよそのシートの有効範囲を探す、というのが面白かったかもしれません。

0 件のコメント:
コメントを投稿