初心者のためのExcel エクセルマクロVBA入門-関数を使ってみる
関数を使ってみよう!
色々な関数がありますが、いくつか取り合えず使ってみましょう。使わないとわからないですし、なかなか慣れないと思います。今日は結構コードが多めですから、頑張ってください。まぁやってることは大体関数を使って結果がある場合はメッセージボックスに表示する。だけです。
日付を返してくれるDate関数
Date関数は今日の日付を戻り値として返してくれます。要するに「なんか処理して」日付を返すんです。
Sub test() Dim ret As Date ret = Date MsgBox ret End Sub
これも立派なプログラムです。ちょっと難しい言い方するんですが、このプロシージャも「日付を表示する」という処理を行う関数。とも言えますね。一応変数をわざわざ作って戻り値をその変数に格納していますが、使わなくても構いません。単に・・・
Sub test() MsgBox Date End Sub
としてもOKです。
引数がない関数はカッコを付けない。
コード見ていただくとわかりますが、Date関数には引数がありません。その場合はカッコは不要です。また、いきなり関数名そのものをズバリ書いています。つまりこれはVBAの関数ということになります。
今何行あるの?COUNTA関数
シートに何行かデータがある場合に、その行ごとに処理をしたいことってないですか?私はしょっちゅうあります。大抵データは隙間なく埋まっていて、その行ごとに何かをしたい場合には、COUNTA関数をよく使います。これはエクセルのワークシート関数です。
Sub test() MsgBox Application.WorksheetFunction.CountA(Sheet1.Columns(2)) End Sub
ワークシートの関数ですので、例のフレーズ「アプリケーション.ワークシートファンクション」がついています。COUNTA関数は列を引数として入力するとやっぱり「なんか処理して」その列に入っているデータの数を戻り値として返してくれます。3行入っていたら135行入っていたら135という感じですね。
列が設定されているColumnsプロパティ
Colunmsはプロパティです。覚えてますでしょうか・・・変数の回が長かったから忘れてるでしょうか・・・忘れてたら、オブジェクトの回をもう一度読んでくださいね。覚えている人はわかると思いますが、Colunmsはシートオブジェクト(ロボ)のプロパティになります。列全体を表すプロパティで、()の中に1とか2とか指定するとその列1ならA列、2ならB列・・・というようになっています。
もちろんシートオブジェクトのプロパティなのでちゃんとオブジェクト名から書いているのです。
よくプロパティから書いてあるマクロを見かけますが、あれ絶対だめです。エラーの元。わかっててやってるのなら100歩譲っていいですが、正直人が読んでてわかりにくいです。
プロパティの話はこれくらいで、ワークシート関数なので当然エクセルのセル内でも有効です。セル内だとどう書きますか?
COUNTA(B:B)
と書きます。つまり、この「B:B」をVBAで書くと「Sheet1.Columns(2)」となるわけですね。この辺はRangeオブジェクトについてがっつりやるとわかるようになりますが、この話するとブログ3回とか5回くらい使う気がする・・・汗
初心者である今は書き方として身に着けてしまいましょう。ぶっちゃけ何でこうなの?とか言う疑問の解決は慣れてきてからでも遅くはありません。
文字列を操作するInStr関数、Mid関数、Trim関数などなど
後、よく使うのはセルに入っているデータを「分けたい」時です。単にカンマとかで分けたいとかなら、普通にエクセルのデータ分割機能を使えばいいのですが、以外とそうじゃない場合も多いです。そんな時によく使われるのが文字列操作関数と呼ばれる類の関数たちです。色々とあるのですが今回は3つほど紹介します。
- InStr関数:指定した文字が文字列の何番目かを返す
- Mid関数:文字列から文字列を抜き出す関数
- Trim関数:文字列の両端にある余分なスペースを削除する関数
InStr関数
Sub test() MsgBox InStr(1, "ABCDEFGHIJ", "E") ' →単に5文字目だから5を返す End Sub
Mid関数
Sub test() MsgBox Mid("ABCDEFGHIJ", 3, 2) ' →3文字目から2文字抜き出してCDを返す End Sub
Trim関数
Sub test() MsgBox Mid(" ABCDEF ") ' →全角半角関係なくスペースを抜いてABCDEFを返す End Sub
っとまぁこんな感じです。それぞれ引数の数が違いますよね。Instr関数は最初に何文字目から探すか?を指定して、その後に探す対象の文字列、最後に検索する文字を入力値として渡します。
Mid関数なら最初に抜き出す前の文字列、次に何文字目から抜き出すか?そして最後に何文字抜き出すか?を指定します。
Trim関数は文字列だけ入力すれば後はスペースを削除した文字を返してくれるのです。
どれもこれも内部的にどうしてるかは知る必要はありません。「なんか処理して」結果を返すだけです。
このあたりは良く使うので、覚えておくと良いと思います。
データを変換する関数Cほにゃらら
最後にある程度自由にデータ型を変換できる関数を紹介します。
- CStr:String型に変換する
- CLng:Long型に変換する
- CDate:日付型に変換する
- CBool:Boolean型に変換する
このようにデータ型を変換することを「キャスト」と呼んだりします。文字を数字にしたり、数字を文字にしたりと、利用したいときに一時的に利用することが多いです。例えば・・・
Sub test() Dim tmp As String Dim dd As Date tmp = "2013/12/23" dd = CDate(tmp) + 1 MsgBox "明日は" & dd & "です" End Sub
こんな感じです。文字列変数に入っている日付を日付型へキャストしてから1を足すことで翌日の日付を計算しています。データの変換関数はこんな感じで使うことが多いです。
ret = CLng("12345")
という感じで使うことはあまりないと思います。マクロを作って「型が違います」というエラーが出てきたらこの変換関数の出番!と覚えておくと良いと思います。
今回は私の独断と偏見でよく使う関数を紹介してみました。次回から本格的にプログラミングの世界へと踏み入れていきます。
今日はここまで!
かしこ