のヮの@no05071730


五十路男の独り言集。
乱筆乱文はご容赦ください。

ExcelVBAで上付き下付文字を検索 ~いまさらだけど言われてみればそうだよね編

2023年05月26日 23時23分53秒 | パソコン

既知の情報かもしれませんが、まずはこちらをご覧ください。

 

〇通常文字

 

〇途中の文字(う・え)に色つけ

 

〇すべて上付き文字

 

〇混在

 

そもそも、Excelでは上付き下付き色付きの属性は「フォントの装飾」にあたるわけです。ですがExcel通常検索では、書式設定で指定しても、その設定の仕方によってはヒットしたりしなかったりです。

で、VBAでやったれや! と思ってググっても、一向にヒットしないのです。ヒットするのは「セルを指定して文字を総当たりして」「あるかないか」「あったら何文字目か」「置換は」の類いでした。いやね、そんなことやってたら、たとえば20行20列ぐらいならむしろ目視で確認した方が早いんですよね。でも1000行150列とかなったら目視なんてやってられません。

でもじゃあどうやって「上付き下付き色つき文字があるセル」を「素早く」探すのでしょうか。ワタクシのググり方が下手っぴなのでしょうが、たいてい選択範囲内セルすべてセル内文字総当たりの記事でした。えぇ…一文字一文字チェックなんて待ってられないでしょ普通。いやワタクシもやってたけども。

 

どこかの先達が、「.Item()最強!」みたいなことを言ってたなあと思い出し、.Itemではどう変化してるんだろうと調べていたら、なんのことはない Fontオブジェクトで、各プロパティが上の画像のような変化をしていたわけです。

上付き下付きの場合、どうやら、文字列に何の設定がなければ false(イロハニホヘト)、すべての文字列に設定があった場合 true(111上付き)を返すようですね。さらに、文字列の一部にしかない(X2+SO4=10000)場合、 nullを返してきました。falseでも trueでもないので、返すべき値がないのでしょうか。色つきも似たようなもので、0=自動(デフォルト)かセル内全部同一色(単色)でないときに、nullを返してきているようです。

 

つまりはこれ。

For Each cl In Selection
    If IsNull(cl.Font.Superscript) = True Or cl.Font.Superscript = True _   '……上付きが false(設定なし)以外
    Or IsNull(cl.Font.Subscript) = True Or cl.Font.Subscript = True Then  '……下付きが false(設定なし)以外
        cl.Interior.Color = vbYellow
    End If
    
    If IsNull(cl.Font.Color) = True Then   '……色付きがデフォルト(自動)でも単色でもない
        cl.Interior.Color = vbCyan
    End If
Next cl

 

セルの上付き下付きのプロパティ値が nullか Trueの場合は設定あり、文字色のプロパティ値が nullの場合は複色あり、と判断できると言うことです。こうすれば上付き下付き色つき文字のないセルまで全文字列チェックする必要はなくなるので、格段に処理速度が上がります。置換処理や文字位置の取得などは、「cl.Interior.Color =~」の部分に望む処理を書けばいいわけです。forや ifの入れ子状態が多発するかもしれませんが、それはまあよくあることだし。

 

ワタクシの場合、おおよそ50行40列3~6シートあるファイルを10個、ループさせて上付き下付き色つきをピックアップさせていたのですが、列や行をある程度絞っても、セル内文字総当たりでやると、文字数やマシンスペックにもよりますが90分~120分かかったわけで、そりゃ不評だわな(´・ω・`)

でもこのやり方でマクロを回すと、10ファイルで10分もかからずに終了します。いままでのはなんだったのさ? って自分でも思います。

 

でも、いろんなところに応用できるんじゃないかと思うし、むしろこういうことがあるから、プログラミングは面白いって思うのデス。

 



最新の画像もっと見る

コメントを投稿