SGソフトウェアの開発日記

日々の開発に関するあれこれを書き散らかしています。

先頭行のタイトル位置を検索する処理が突然機能しなくなった件

JRA出走データ解析プロジェクト進行中です。

過去走の解析パラメータとして、馬場状態(良、稍重、重、不良)を追加したところ、別の箇所で誤動作が発生するようになりました。

該当の箇所は、過去走データの表の先頭行にあるタイトルの列位置を取得する処理です。誤動作が発生するのは、騎手重量の列位置を取得するところで、タイトルが「重」となっており、このタイトルを検出するはずが、馬場状態の「重」を検出してしまって、そのセルが先頭行ではないため、エラーと判定してしまっていました。

 

f:id:yokotan:20160920151802j:plain


検索する処理を実行する前に先頭行をセレクトしていたのですが、2行目に「重」と書かれたセルがあると、そのセルを検出してしまうのが原因です。不思議なことに、この現象が発生するのは、先頭行の直下のレースの馬場状態が「重」だったときだけで、二つ目以降のレースの馬場状態が「重」であっても問題は発生しません。

詳細な発生条件を切り分けるのが面倒だったので本当の原因はわかっていませんが、おそらく、レース毎にオートフィルターをかけたときに、先頭行の直下のレースの行は、タイトルがある先頭行と行が連続しているので、検索範囲として認識されてしまっているのだと思います。

最初は、なぜそうなるのか全然わからなかったですが、いろいろ調べて試してみるうちに、どうやらCurrentRegion指定していることが問題だろうという結論に至りました。

問題のコード

Dim FoundCell As Range
Rows("1:1").Select
Set FoundCell = _
    Range("A1").CurrentRegion.Find(What:=Caption, _
    LookAt:=xlWhole)

改修後のコード

Dim FoundCell As Range
Dim MaxCol As Long
MaxCol = Range("A1").End(xlToRight).Column
Set FoundCell = Range(Cells(1, 1), _
     Cells(1, MaxCol)).Find(What:=Caption, _
     LookAt:=xlWhole)

元々は、Find関数の検索範囲の起点をA1セルで指定してCurrentRegionで検索範囲を全体に広げるようになっていたのですが、CurrentRegionの意味を理解せずに、マクロの記録で自動生成したコードをそのまま使っていたのが敗因のようです。CurrentRegionを外して、Find関数の検索範囲をRangeで指定することで、先頭行のみを検索範囲とすることができました。

意味を理解しないままコピペしていたツケが回ってきたわけですね。