VBA1行コード 意外と便利そう

職場のシステムで、どうしてもExcelVBAで操作したいことができたので、久しぶりにVBAのお勉強しています。今日立ち寄った図書館にあった本ですが、「たった1行のコードでは条件分岐や繰り返しも行えないので、実用性はないだろう」と決めつけて読んでましたが、いやいや、全くの想定外でした。なるほど、そこを使うんだ。

 

EXCEL VBA 1行コード活用辞典 (CD-ROM付き)

EXCEL VBA 1行コード活用辞典 (CD-ROM付き)

 

 

 2006年出版の本で絶版ですが、これ読んで、VBE(VBAのエディタ)の使い方の幅がひとつ広がりました。1行コードは一般的にコードを入力する「標準モジュール」などでなく、VBE右下のイミディエイトウインドウに入力するんですね。なるほど、DOSプロンプト画面のように、入力したら即実行。これはちょっとしたコードを使っての操作に便利そう。

 

本に書かれているTIPsの多くは、書式設定や関数を使ってもできなくはない。でも関数は、その結果を表示することはできるが、入力されている値そのものは代えられない。でも、コードを使うと値を変えることができる。ここが一番大きなポイントかと思う。

 

例えば、名前が羅列されている名簿で、全員の名前に「様」など文字を加えたいことは結構頻繁にある。書式設定を使うなら、書式設定内の「ユーザー定義」で「@&"様"」と設定すればいいし、関数でも、「=A1&"様"」との式を別セルに入力すれば、ちゃんと表示される。でも両方とも、表示を変えるだけで値が変わるわけではない。でも、イミディエイトウインドウに、以下の1行を入れると、セルそのものの値が書き換わる。

 

range("A11:A15").Value = evaluate("A11:A15" & "&""様""")

 

あとは、日付表示が「2014年1月25日」って表示されていても、その表示をそのまま利用するのは難しい。でも、これもVBAならrangeオブジェクトのtextプロパティを使えば1行で完結する。ただし、複数セルを一度に替えることはできないようで、これは変数定義を除いても3行必要となる。

Sub TextChange()
Dim iRange As Range
For Each iRange In Selection
iRange.Value = iRange.Text
Next
End Sub

表示されている計算結果を(式を消して)値に書き換えることも、ちょっと考えればすぐにできる。なかなか便利だ。