読者です 読者をやめる 読者になる 読者になる

VBAによる自動化の第一歩

VBA一般

  ウチの職場では、職員のPC全てにExcelが入っているのですが、まあ、ろくに活用されていないw

 たぶん、昔からある方眼付きコピー原紙の電子版ぐらいにしか思われていない。

 VLOOKUP関数がまともに使えるだけで、もう「Excelマスター」気取りですからね。

 まあ、ウチは相当遅れている方だと思いますけど、未だに似たような職場ってのもあるんじゃないのかと。

 で、そんな原始時代みたいな職場で、Excelを使った単純作業に明け暮れている人がいたとしたら、是非こっそりVBAをマスターしてほしいと思います。

 その手始めとして、簡単かつそれなりに使える技を紹介しますよ。

 VBA初級者からさえ( ´,_ゝ`)プッ って笑われるレベルだと思いますけど。

 f:id:akashi_keirin:20170211132040j:plain
 たとえば、こんな表があったとして、全ての名前に「様」をつけなければならない、としよう。
 まあ、この程度の数なら手で打ち込んでもたいした手間ではないと思うが、まあ、こういうのが何百行、何千行あると思ってほしい。とうてい手作業でやろうとは思わないだろう。
 ま、ウチの職場では、「徹夜して1万行の名前全てに『様』を付けた」的な自慢をする人が結構な数いるわけですが……。

Option Explicit

Sub 様をつける()
    Dim objCell As Range
    For Each objCell In Selection
        objCell.Value = objCell.Value & " 様"
    Next
End Sub

 

 そこで、このコード。[Alt]+[F11]でVBEを起動して、標準モジュールを挿入して書けば良い。
 コードの説明は後でしよう。
 f:id:akashi_keirin:20170211132050j:plain
 こんな風に名簿の全てのセルを選択して、
 f:id:akashi_keirin:20170211132204j:plain
 「sub~」の行から「End Sub」の行の間にカーソルを置いて、再生ボタンみたいなやつをクリックしたら、コードを実行することができる。
 f:id:akashi_keirin:20170211132104j:plain
 で、こんな感じ。一瞬で全ての選択範囲のケツに「 様」がつく。
 もちろん、この程度のことなら、数式を使ってもできるんだけど、数式を使う場合は結果出力用の列が余分に必要になるし、また、見た目上文字列が入っているように見えても、実際のセルの中身はあくまでも数式なので、データを利用する際にめんどうなことになるかも知れない。
 その点、このやり方だと、セルに入っているのは純粋に文字列なので、文字列として扱う以外に気を遣う必要がない。
 ここでコードの説明。

Sub 様をつける()
    Dim objCell As Range                        '……(1)
    For Each objCell In Selection               '……(2)
        objCell.Value = objCell.Value & " 様"   '……(3)
    Next                                        '……(4)
End Sub

 (1)で変数を宣言。Range型の「objRange」を宣言している。「objCell」にセルを代入して、セルと同じように扱うことができるというわけ。
 ま、本当はセルそのものを代入しているんではなくて、そのセルが記憶されているメモリの番地を代入しているらしいんだけど。
 んで、(2)。(4)と併せて、「For Each ○○ In □□ ~ Next」という構文で、繰り返しの処理を行う。「□□という集団に属するそれぞれの要素(○○)について、~の処理を行う」ぐらいの意味になる。
 「○○」のところには、変数を書く。「□□」が「3年B組」という集団(「コレクション」という)だとしたら、その集団の構成要素の一つ一つ(加藤優とか伊藤つかさとかひかる一平とか沖田浩之とか川上麻衣子)が入ることになる。

 (2)の「Selection」というのは、「選択中のもの」を表すコレクションで、
 f:id:akashi_keirin:20170211132050j:plain
この画像だと、A1セル~A15セルの集団ということ。
 つまり、(2)の行を実行したら、まず変数「objCell」にA1セルが代入されて、

  •  ・(3)の処理が実行される。
    ・(4)で「objCell」に次(Next)のA2セルが代入され、(2)の行に戻る。


という処理を、コレクションの全てに対して行うまで繰り返すわけ。

 ちなみに、(3)では、その時点で「objCell」に入っているセルの値(Valueプロパティ)に、元の値に「 様」を付け加えたものを代入している。

 これでめでたく全ての名前に「 様」を付けることができたわけだが、このままでは少し問題がある。
 たとえば、
 f:id:akashi_keirin:20170211132128j:plain
こんなふうに「様」が付いていたり付いていなかったりすると途端に使えなくなるのだ。
 f:id:akashi_keirin:20170211140527j:plain
 当たり前だけど、こんな気の利かない結果になる。

 そこで、コードを書き換える。

Sub 様をつける2()
    Dim objCell As Range
    For Each objCell In Selection
        If Right(objCell.Value, 1) <> "様" Then     '……(5)
            objCell.Value = objCell.Value & " 様"   '……(6)
        End If
    Next
End Sub

  変わったのは(5)のところ。右端に「様」が付いていないときだけ「様」を付ければいいのだから、「右端の1文字が『様』でなかったら、次の処理を行え」というふうにすればよい。
 ちなみに、「Right」ってのは関数で、「Right(文字列, 文字数)」って書いてやれば、文字列の右から文字数分切り取った文字列を返す。
 これで、
 f:id:akashi_keirin:20170211132135j:plain
こんなふうに全てを選択して、
 f:id:akashi_keirin:20170211132140j:plain
 「様を付ける」プロシージャ内にカーソルを置いて実行すると、
 f:id:akashi_keirin:20170211132145j:plain
 ほれ、この通り、気の利いた結果が得られました。

 今回ご紹介したごく短いコードですが、
・変数
・繰り返し
・条件分岐
・関数
というプログラミングの基本要素がきっちり入っているので、しっかりと理解することをオススメします。