VBA 降順ソート時の空白の扱い。
こんばんわ。いたかなやです。
今日も来ていただいてありがとうございます。
今日もExcelのお話。
Excelって空白(blank)の種類が3つあるんです。
見た目は、空白なんで、まー問題ないんですが、
データのソートを行う時には、
この「見た目が同じ」ってのが、うっとうしいんですよね。
まず、空白の3つの種類。
① ただの空白(BLANK)
② 数式 ="" が入力されている空白(fakeBLANK)
③ 0(ZERO)
(③については、Excelオプションの表示のところで、【ゼロの表示】のチェックが外されている場合に空白になります。)
それぞれをISBLANK関数とLEN関数で判定したところ
上図のようになりました。
(注:LEN関数の結果の値0も空白になっています)
次にこれらの3つの空白が入っているデータをソートしたいと思います。
元となるデータはこちら
B列のvalueの値に従って、降順にソートしたいと思います。
(D列のtypeは、それぞれB列の空白の種類を表示しています。)
ソートのコードはこちら
するとどうなるか・・・
こうなってしまいました。
ZEROは、値が0なのを空白表示しているだけなので、1の次に来ます。
BLANKは、本当の空白なので、最後に来ています。(ソートには関係していない。)
問題は、fakeBLANKです。
fakeBLANKは、上図でわかるように、一番上に来てしまっていますね。
文字列扱いみたいな感じでしょうか。
本当に厄介なのは、
fakeBLANKをコピーし、値貼付けを行っても張り付けられるのは、fakeBLANKだということです。
こうなると、見た目では、BLANKなのかfakeBLANKなのかセルにカーソルを合わせてみても確認する事はできないはずです。
fakeBLANKが入っている可能性のあるデータをソートする際は、
Range("B7").ClearContents などを用いて、
fakeBLANK → BLANK
にしてから、ソートするようにしてください。
ちなみに、昇順の場合は、
こうなります。
(コードは、上の xlDescending を xlAscendingに変えるだけです。)
fakeBLANKってけっこーでてくるんですよ。
ExcelでIF関数を使って、
エラーやったら空白にするってのを書きたいときに、
= if ( ISERROR(A1) ,"" ,A1)
みたいに書きますよね。
これで、でてきた値(空白)を値貼付けしたところで、
その空白の部分には、fakeBLANKが出てきてしまいます。
これが、嫌なので、
= if ( ISERROR(A1) ,BLANK,A1)
とか
= if ( ISERROR(A1) ,NULL ,A1)
みたいに書けたら良いんですが、
これは、無理なんですよね。
なんかいい方法ないですかね?
調べたけど、無いみたいなんですよね。
とりあえず、こんなところでハマるのは、嫌なので、
fakeBLANKの存在さえ知っておけば、
なんとでも対処はできるでしょうね。
以上ちょっとまとめてみました。
おやすみなさい。