気がついたら、今年に入って既に3ヶ月が過ぎようとしていることに慄然とせざるを得ない今日この頃、皆様いかがお過ごしでしょうか。
ワタクシはと言えば、Java 8 でラムダを書きつつ、なぜか .Net のつかない ASP をテキストエディタでゴリゴリと修正したり、Visual Studio 2013 を使って開発をする傍ら、いまさら VB 6 アプリの手直しをせざるを得なかったりと、おおよそ 15 年くらい幅のある日々を過ごしております。
我ながら意味が分かりませんが、そんなこんなのひとつとして、Excel で VBA なんかも交えつつ、あれやこれやしなくてはいけない案件が少し前に転がり込みまして。
いやいや、今日び VBA て、キミ。
とはいえ、スプレッドシート自体は、最近流行りのリアクティブプログラミングの具体例として良く取り上げられますので、ある意味最先端と言えないこともないかも知れません。
そうでしょうか。
ごめんなさい、適当こきました。
まぁ、そんな与太はともかく。
Excel および VBA につきまして、検索結果をちょろっと漁っただけでは、そのものズバリの情報に素早く辿り着けずに、面倒臭くなって自分でなんとかしたケースが2つほどありましたので、いちおう記事として残しておきます。
普通の GUI 操作による方法と、VBA マクロによる方法、両方とも書いておきますので、もしどなたかのお役に立ちましたら。
さて、第1回目の今回は、「数値を表示する時に、小数部分がゼロの場合は、小数点すら表示しない(小数点以下が存在する場合は表示する)」という、別にそんなの簡単にできるんじゃねーの、と思ってしまいがちな、割りとどうでもいい表示上の事柄です。
題して『春一番!第1回、これ Excel でどうやってやるのかな大会!ドキッ!マクロもあるよ!』です。
もうちょっと捻れ。
ちなみに、シリーズは全2回の予定です。わぁ、簡潔。
※動作確認は Excel 2007, 2013 で行っていますが、それ以外のほとんどのバージョンでも普通に動作すると思います。そんな大したことしてませんからね。
読み込み中です。少々お待ち下さい
画像で見てみよう
はい、そんな訳でね。
早速ですが、やりたいことを画像にすると、つまり、こういうことです。
うぅん......最初に断っておきますけど、別にコレ、私が提案した訳じゃありませんからね?
ていうか、個人的には以下のように、小数点以下の桁数を揃えて、素直に表示した方が見易いと思うのですが。
ところが、なんでも、その数値項目の小数点以下は、ほとんどゼロばっかりなので、延々と「.00」が表示されるよりは、そっちの方がマシなんですって。ふぅん。そんなの、単に要望出した人の好みの問題なんじゃないですか?
あれ?思ったより......
釈然としませんが、どうしてもと言われれば、私も鬼じゃありません。仕方がないので、なんとかするとしましょう。
ていうか、こんなの「値に小数点以下が存在しない場合は表示しない」チェックみたいなのが、数値セルの書式設定かどっかにあって、そこで指定できるんじゃないですか?(ほじー)
みたいに楽観的に考えていたのですが......ありませんね。
そんなら、ユーザー定義で指定すれば良いのでは、と思ったのですが、そうか、「#,##0.##」だと小数点が残っちゃうのか......
別に小数点くらい残ってもいいんでないの、と個人的には思わなくもないですが、後で文句言われて修正するのも面倒臭いので、もうちょい上手いやり方を考えてみましょう。
何にでも合わせられるから標準なんですよ
さて、一体どうすれば上に書いたようなことを、お手軽に実現できるでしょうか。
こういう時はですね、書式設定で「標準」を選択しとけばいいんですよ。
いろんな形式を、なんやかんやでうまい具合に標準的に表示してくれるから、「標準」ってなモンでしてね。
すると、こんな風にいい感じに表示してくれます。
でも、これじゃダメだ
まぁ、表示形式が「標準」で問題無いケースは、それでいいと思うんですけどね。
でも、「数値だからカンマで自動的に桁区切りしたい」とか、「小数点以下がゼロじゃない場合は、2桁で揃えて」とか、「標準」ではまかないきれない仕様を後出しで言われることは目に見えています。
なので、もう少しちゃんとした方法を考えてみることにしましょう。
さて、どうしましょうか。
うん、条件付き書式を使えば、どうやら実現できそうですね。
念の為に簡単に説明しておくと、条件付き書式とは、「こういう条件の時だけ、こっちの書式で表示して欲しいな~......ダメ?」というユーザーのワガママにお応えする機能です。
マクロを使わない場合
VBA マクロを使わずに、普通に GUI で設定する場合は、例えば以下のように操作します。
- 適用したい範囲を選択して、右クリック等から「セルの書式設定」を選び、まずはデフォルトの表示形式をユーザー定義で「#,##0.00」と設定します(このサンプルでは、小数点以下を2桁に揃えています)。
- すると、このようにカンマで3桁ごとに区切られ、かつ小数点以下は2桁で揃えられた表示になります。
- 同じ範囲を選択して、リボンの「ホーム」から「条件付き書式」→「ルールの管理...」を選択します(「新しいルール...」を直接選んでも構いません)。
- 「条件付き書式ルールの管理」ダイアログで「新規ルール...」ボタンを押下します。
- 画面上部の一覧から「数式を使用して、書式設定するセルを決定」を選んで、その下の「次の数式を満たす場合に値を書式設定」に、以下のように入力します。
- 続いて、入力した数式のすぐ下、「プレビュー:」の右横にある「書式...」ボタンを押下し、表示形式のユーザー定義で「#,##0」を設定します。
- 開いている各ダイアログの「OK」ボタンを押して設定を反映すると、5. の条件を満たした場合のみ、6. で設定した書式が適用され、以下のように表示されます。
=INDIRECT(ADDRESS(ROW(),COLUMN()))=TRUNC(INDIRECT(ADDRESS(ROW(),COLUMN())))
数式についてざっくり説明すると、セル自身の数値と、そこから小数部分を取り除いた数値が同じだった場合のみ(つまり、小数点以下がゼロだったら)、条件付き書式で設定した書式が適用されます。
C2 セルを選んで、条件付き書式で「=C2=TRUNC(C2)」のように数式を設定して、コピペ等で範囲適用しても良いのですが(もしくは、条件付き書式の「適用先」で範囲を指定する)、編集していると気付かないウチに書式が崩れたりして面倒臭いので、どこに移動しても問題無いように、常に自分自身を参照するようにしています。
マクロを使う場合
さて、それでは VBA マクロを使う場合も見てみましょう。
以下のサンプルコードでは、アクティブシートの C 列「全体」に一括して、上で見てきたような表示形式&条件付き書式を設定しています。
- ' C 列全体の表示形式として「#,##0.00」を設定し、小数点以下がゼロの場合のみ「#,##0」を適用する条件付き書式を追加
- With ActiveSheet.Range("C1").EntireColumn
- .NumberFormatLocal = "#,##0.00"
- .FormatConditions.Delete
- .FormatConditions.Add Type:=xlExpression, Formula1:="=INDIRECT(ADDRESS(ROW(),COLUMN()))=TRUNC(INDIRECT(ADDRESS(ROW(),COLUMN())))"
- .FormatConditions(1).NumberFormat = "#,##0"
- End With
-
- ' ヘッダー行のみ表示形式を「標準」に戻したい場合は、以下を追加
- With ActiveSheet.Range("A1").EntireRow
- .FormatConditions.Delete ' ヘッダー行の条件付き書式を削除
- .NumberFormatLocal = "G/標準" ' ヘッダー行の表示形式を「標準」に設定
- End With
上記はあくまでサンプルでしかありません。少し変更すれば、列全体ではなく任意の範囲を選択して適用することも、もちろん可能です。
また、既に元から条件付き書式を設定しており、且つそちらも有効のままにしておきたい場合は、Delete せずに、Add(もしくは Modify)する際の FormatConditions のインデックスを変更してください。
おわりに
やぁ、できたできた。
まぁ、こんなモンでおっけーでしょう。
正直、「コレ、必要かなぁ?」思うことしきりですし、使いドコロは著しく限定されると思いますが、何故か同じようなことを要望されてしまった方のお役に立ちましたら。
表示形式を変えたい場合は、本家やヘルプ等を参考に、都合に応じて適当に変更してください。
例えば、「右端はゼロ埋めせず、小数点以下は可変で最大3桁まで表示」のような場合は、デフォルトの表示形式を「#,##0.###」みたいに指定すると良いと思います。まー、そんなヘンな表示の仕方をすることは、まず無いとは思いますけど(笑)
それにしても、VBA とか JavaScript とか、普段はあまりプログラムと縁のない方が触りがちな言語の情報を検索すると、やたらと「教えて!」知恵袋系(または掲示板)のやり取りが検索結果の上位を占めてしまう現象は、なんとかならないですかね。
いえ、あの、ちゃんと回答さえ書かれていれば、別に全然問題無いんです。
ただ、開いた先が「マルチポストすんな」やら、質問者が提供している情報はそこそこ充分なのに「情報足りね。それじゃ答えようがねーだろ」やら、「過去に何度も同じ質問がされています。ちゃんと検索してください」みたいな説教だけだった時の脱力感たるや......
いや、自分でマッタク調べようともせず他人任せにしているような素行の悪い質問者も沢山見かけるので、マナー違反を指摘するのは良いんです。
でも、できれば回答も併記して欲しいかなー、なんて。いちおう、回答を書くのがマナーな場所なんですし。
あれでは、どっちもどっちというか、単に説教したいだけの人にしか見えな(自粛)
技術寄りの情報に関しては、知恵袋的な情報の順位は、もちっとばかし下げていただけると助かります、Google 先生。