文字列の抽出と計算 3.VBA:文字数の規則性 ①
はじめに
前回は、求める数値の前後に半角スペースがあることに着目し、FIND、LEN、LEFT、RIGHT関数を用いて中央の数字を取り出しました。
今回も、前回と同じテーマで、別の解決方法を模索してみます。
今回のテーマ
前回と同じテーマです。
一つのセルに、3桁の数字が3つあります。これらは、半角スペースで区切られています。この数字について、真ん中のグループの和を求めてみましょう。
VBA使用/不使用の判断
前回までは、Excelのメニューにある機能や関数のみを用いる、つまりVBAを用いない方法で解決してきました。恐らくこれ以外にも多くの、VBAを使用しない方法がたくさんあると思います。
もしこれで充分ならば、敢えてVBAでマクロを作成する必要はありません。この点について絶対的な優劣や、良し悪しは無いと思います。
状況に合わせて、自分がベストと思う方法を選択しましょう。
それでは以降、VBAを用いた方法について考えてみます。
VBAとマクロの違いについて
まず、頻繁に混同される「マクロ」と「VBA」について。様々なサイトで私が得た知見は以下のとおりです。
マクロ:
Excel や他のアプリケーションなどを、予め決めた手順で制御する機能の名前
VBA:
マクロ機能で作成する手順を記述するときに使う言語の名前
(Visual Basic for Applications の略)
マクロ用の言語には VBA でないものも存在するため、マクロと VBA は別物と考えます(本職の方からすれば、異論反論あると思いますが)。本ブログでは、なるべく両者を使い分けていこうと思います。
VBEについて
VBAは、VBE(Visual Basic Editor)に記述します。
VBEは、開発タブにあるVisual Basicボタンを押すか、または Alt キーを押しながら F11 を押すことで起動します。
「開発タブが見当たらない」という方は、リボンのユーザー設定で、「開発」にチェックを入れてください。
文字数の規則性を利用する
それでは今回から、VBAを用いてマクロを記述していきましょう。
まず、VBEを起動します( Alt キー + F11)。
マクロを追加したいファイルを右クリックし、「標準モジュール」を挿入します。
↓のように、Sub myCalc と入力して、Enter キーを押します。
↓自動で、このようになります。
myCalcの後ろに()とEnd Sub が追加されました。
Sub から始まるマクロは全て、End Sub で終わります。この Sub ~ End Sub の間に、VBA でマクロを作成します。これを、サブプロシージャと呼びます。
「myCalc」など、サブプロシージャの名前は、禁止文字が含まれない限り自由に命名可能です。ただし、作った本人も後でわからなくなることがあるため、なるべく目的や機能を端的に現わす名前のほうが良いでしょう。
それでは、いよいよプログラミング開始です。まず先ほど作成したサブプロシージャに、以下のように記入します。
Sub myCalc()
Range("B2").Value = Range("A2").Value
End Sub
Range("A2") は、A2 のセルそのものを表しています。これを、レンジオブジェクトと呼びます。そして、このレンジオブジェクトが持っている様々な情報をプロパティと言います。これらの情報は、レンジオブジェクトの後ろに「.」を入力し、さらに続けることで表すことができます。
Range("A2").Value ⇒ セルに入力された値(例.123 456 789)
Range("A2").Address ⇒ セルの番地 (例.A2)
その他、フォントの名前やセルの色、セルの高さや幅など、様々な情報を入手することができますし、逆に、指定して変更することも可能です。先ほど入力した意味は、A2 の値を B2 に代入しなさい、という指示になります。
それでは、このマクロを実行してみましょう。マクロの実行ボタンを押すか、またはF5を押します。
B2 に、A2 の値が入力されました。
今回は5番目の文字から3つを抜き出したい訳ですから、これでは不充分です。前々回と同様、MID関数を用いて、次のように変更しましょう。
Sub myCalc()
Range("B2").Value = Mid(Range("A2").Value, 5, 3)
End Sub
再度、実行してみましょう(F5)。このような結果になります。
上手く抜き出すことができました。ワークシート関数のMIDを使う場合と、要領はほとんど変わりません。ただ1点、大きな違いがあります。それは、マクロ側の判断により、「456」という文字列が数値に置き換えられたことです。ワークシート関数では1を掛けて数値に変換していましたが、マクロの場合は不要です。
同様に、3行目と4行目についても処理します。
Sub myCalc()
Range("B2").Value = Mid(Range("A2").Value, 5, 3)
Range("B3").Value = Mid(Range("A3").Value, 5, 3)
Range("B4").Value = Mid(Range("A4").Value, 5, 3)
End Sub
あと少しです。さらに、合計値を求めてみましょう。
Sub myCalc()
Range("B2").Value = Mid(Range("A2").Value, 5, 3)
Range("B3").Value = Mid(Range("A3").Value, 5, 3)
Range("B4").Value = Mid(Range("A4").Value, 5, 3)
Range("B5").Value = Range("B2").Value + Range("B3").Value + Range("B4").Value
End Sub
完成です。
おわりに
今回の方法に対する評価(私見)は、以下のとおりです。
メリット :
- 前回と比べて、1を掛ける処置が不要になった。
- 何を行っているか、分かり易い(可読性が良い)。
デメリット:
- マクロに関する知識が必要。
- 行や列の追加に追従しない。
- 半角スペースが2個以外の場合に対応できていない。
マクロの登場により、新たな可能性が見えてきました。ただし、まだまだ解決すべき点は多いようです。
(おわり)