目標は商店街をつくる事なんです。

あきらめてるわけじゃないんです。今やっていることが、必ず力になると思うんです。

VBA 降順ソート時の空白の扱い。

こんばんわ。いたかなやです。

今日も来ていただいてありがとうございます。

 

今日もExcelのお話。

 

 

Excelって空白(blank)の種類が3つあるんです。

見た目は、空白なんで、まー問題ないんですが、

データのソートを行う時には、

この「見た目が同じ」ってのが、うっとうしいんですよね。

 

 

まず、空白の3つの種類。

① ただの空白(BLANK)

② 数式 ="" が入力されている空白(fakeBLANK)

③ 0(ZERO)

(③については、Excelオプションの表示のところで、【ゼロの表示】のチェックが外されている場合に空白になります。)

 

f:id:itakanaya9:20130919233853p:plain

 

それぞれをISBLANK関数LEN関数で判定したところ

上図のようになりました。

(注:LEN関数の結果の値0も空白になっています)

 

 

次にこれらの3つの空白が入っているデータをソートしたいと思います。

 

元となるデータはこちら

f:id:itakanaya9:20130919234254p:plain

 

B列のvalueの値に従って、降順にソートしたいと思います。

(D列のtypeは、それぞれB列の空白の種類を表示しています。)

 

 

ソートのコードはこちら

f:id:itakanaya9:20130919234447p:plain

 

 

するとどうなるか・・・

 

f:id:itakanaya9:20130919234517p:plain

 

 

こうなってしまいました。

 

 

ZEROは、値が0なのを空白表示しているだけなので、1の次に来ます。

 

BLANKは、本当の空白なので、最後に来ています。(ソートには関係していない。)

 

問題は、fakeBLANKです。

fakeBLANKは、上図でわかるように、一番上に来てしまっていますね。

文字列扱いみたいな感じでしょうか。

 

本当に厄介なのは、

fakeBLANKをコピーし、値貼付けを行っても張り付けられるのは、fakeBLANKだということです。

 

こうなると、見た目では、BLANKなのかfakeBLANKなのかセルにカーソルを合わせてみても確認する事はできないはずです。

 

fakeBLANKが入っている可能性のあるデータをソートする際は、

Range("B7").ClearContents などを用いて、

fakeBLANK → BLANK

にしてから、ソートするようにしてください。

 

 

ちなみに、昇順の場合は、

f:id:itakanaya9:20130920000119p:plain

 

こうなります。

(コードは、上の xlDescending を xlAscendingに変えるだけです。)

 

 

 

 

 

fakeBLANKってけっこーでてくるんですよ。

 

ExcelでIF関数を使って、

エラーやったら空白にするってのを書きたいときに、

= if ( ISERROR(A1) ,"" ,A1)

みたいに書きますよね。

 

これで、でてきた値(空白)を値貼付けしたところで、

その空白の部分には、fakeBLANKが出てきてしまいます。

 

 

これが、嫌なので、

= if ( ISERROR(A1) ,BLANK,A1)

とか

= if ( ISERROR(A1) ,NULL ,A1)

みたいに書けたら良いんですが、

これは、無理なんですよね。

 

なんかいい方法ないですかね?

 

調べたけど、無いみたいなんですよね。

 

とりあえず、こんなところでハマるのは、嫌なので、

fakeBLANKの存在さえ知っておけば、

なんとでも対処はできるでしょうね。

 

 

 

以上ちょっとまとめてみました。

 

 

おやすみなさい。