既知の情報かもしれませんが、まずはこちらをご覧ください。
〇通常文字
〇途中の文字(う・え)に色つけ
〇すべて上付き文字
〇混在
そもそも、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分もかからずに終了します。いままでのはなんだったのさ? って自分でも思います。
でも、いろんなところに応用できるんじゃないかと思うし、むしろこういうことがあるから、プログラミングは面白いって思うのデス。
※コメント投稿者のブログIDはブログ作成者のみに通知されます