初心者のためのExcel VBAの超簡単な使い方
|
Excelを使用して高度なデータ分析を行うのは不可能です。もちろんVBA(Visual Basic for Applycations)という機能を用いたり、あるいは統計解析を行うためのアドインソフトを購入すればいくらでも可能になりますが、、、
Excelに限らずコンピュータの操作というのは慣れ親しむということが大切で、よく意味が分からなくてもとにかくイジってみることが上達の早道です。だから、なんでもいいからExcelについて書かれた本を1冊買って、それを1通り読んでみる(本に習って操作してみる)ことが良いと思います。ちなみに私が初めて買ったExcelの書籍は
白石修二著『例題で学ぶExcel統計入門』森北出版 2004年(第1版第4刷)
という本ですが、本当にExcelを触ったことがない人にはこれがおススメです。というか、この本に習って操作をしていけば1冊を読み終えた頃にはかなりExcelを扱えるようになっているはずです。少なくとも基本的な関数やグラフを描くための機能は使いこなせているはずです。
最近はインターネットが使えればwebサイトでプログラミング言語などを勉強できますが、なんでもかんでもインターネットに頼りすぎて書籍を買うことが少なくなっているように感じます。確かにwebサイトで紹介されている説明は作者独自の分かり易い説明がされているのですが、それらの説明は断片的であったりするので、やはり入門書のように系統立てて説明されているものが必要となるのではないでしょうか。・・・ということで上で紹介した本(それ以外の本でも構いませんが)をまず買いましょう。やはりある程度は手間とお金をつぎ込まなければ成長しません。
|
Excel VBAもしくは単にVBAといいますが、VBAとはVisual Basic for ApplicationsといってExcelというアプリケーションの中だけで動くプログラムを作るための言語です。したがってVBAで作成したプログラムはMS-Excelが使える環境でなければ(プログラムが)動かないので役に立ちません。もっとも現在はほとんどのユーザーがWindowsを使用しているようですし、MacでもExcelは使えるので基本的にはどのパソコンでも大丈夫ということになるでしょう。
ところでExcel VBAの入門書は山ほどあります。またExcelを使ってデータ分析をするための書籍も山ほどあります。しかしExcel VBAをデータ分析用のプログラムを作るための解説をしている本はなかなかありません。確かにVBAの入門書を買って、それをマスターすれば良いのですがデータ分析用のプログラムを作る、あるいはちょこっとした統計処理を手助けるようなプログラムを自分で作るには通常の入門書では無駄な部分が多いのです。かといってデータ解析用の本だと長いプログラムが載っていたり、付属のCDに組み込まれていたりなどVBA初心者にはとても読めたものではありません。
そんな状態ではいくら書籍を買っても途中で嫌になって投げ出してしまうのがオチです。そこで今回はVBAを使って簡単な統計処理をラクにするようなプログラムを作るために必要なこと(覚えるべきこと)を紹介していきます。できれば手元にVBAの入門書などを1冊置いておき、このページで説明されている部分で足りない部分を補えるようにしておくと効果的です。
|
これからVBAプログラミングをしていくうえで大切な用語というか概念を説明します。最初は「こんなこと覚えてなくてもできるんじゃないか?」と思ってしまうかもしれませんが、ここをキッチリと理解しておかないと後になってけっこう大変なことになります。
■モジュール
Excel VBAにおいてモジュールとは@オブジェクトモジュールAユーザーフォームモジュールB標準モジュールの3種類のことを指します。
■プロシージャ
Excel VBAにおいてプロシージャとは@SubプロシージャとAFunctionプロシージャの2種類のことを指します。
■ステートメント
ステートメントとはプロシージャを構成する1行ごとのコードのことです。
■モジュールとプロシージャの関係
モジュールはいくつかのプロシージャによって構成されています。例えば自転車はフレームやホイール、ハンドル、サドル、コンポーネントなどが組み合わさって1つの完成車となっています。この完成車がモジュールで、それぞれの部品がプロシージャであると考えればよいでしょう。
■オブジェクト
オブジェクトとは処理の対象となるもののことです。例えばワークシートやセルなどがそうで、ワークシートを閉じるようなプログラムを作ったとき、処理の対象はワークシートですからこのときのオブジェクトはワークシートということになります。またA1:A10までのセル範囲の合計を求めるようなプログラムを作るときは、処理の対象がA1:A10というセル範囲ですからこのときのオブジェクトはセルであるといるわけです。
■プロパティ
プロパティとはオブジェクトが持つ特徴のことです。例えばセルに入力されている値や文字サイズ、文字色などの特徴がプロパティです。
■メソッド
メソッドとはオブジェクト(すなわちワークシートやセル)に対する操作、例えばコピーや移動、削除などといったオブジェクトを直接操作できる命令のことです。
☆データ分析を行うプログラムを作っていく上ではいくつかのセル範囲が処理の対象となるので、「オブジェクト=セル」と考えてしまって結構です。すなわちセルの操作を覚えることがExcel VBAでデータ解析用のプログラムを作るための基本となります。
|
ExcelVBAを使いこなすためにはセルの操作がとても重要になります。それに伴ってプロパティを覚える必要があり、セルを操作するためのいくつかのプロパティさえ覚えてしまえばもうこっちのもんです。最初は退屈かもしれませんが、地道にプロパティの使い方を習得していきましょう。
任意のセルまたはセル範囲を選択するためにはRangeプロパティを使う方法とCellsプロパティを使う方法があります。ただしCellsプロパティでは単一セルを取得するだけでセル範囲を取得することはできません。
■単一のセルを選択(セルA1を選択)
Sub prog()
Range("A1").Select
End Sub
Sub prog2()
Cells(1, 1).Select
End Sub
■セル範囲を選択(セル範囲A1:A3を選択)
Sub prog()
Range("A1:A3").Select
End Sub
■単一のセルを2つ以上選択(セルA1とセルB3を選択)
Sub prog()
Range("A1,B3").Select
End Sub
■2つ以上のセル範囲を選択(セル範囲A1:B5とセル範囲D3:E8を選択)
Sub prog()
Range("A1:B5,D3:E8").Select
End Sub
■アクティブセルから1行下のセルを選択
Sub prog()
Range("A1").Select
ActiveCell.Offset(1,0).Select
End Sub
■アクティブセルから1列右のセルを選択
Sub prog()
Range("A1").Select
ActiveCell.Offset(0,1).Select
End Sub
■アクティブセルから1行上のセルを選択
Sub prog()
Range("A1").Select
ActiveCell.Offset(-1,0).Select
End Sub
■アクティブセルから1列左のセルを選択
Sub prog()
Range("A1").Select
ActiveCell.Offset(0,-1).Select
End Sub
Sub prog()
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
End Sub
Sub prog()
Range("A1").Select
ActiveCell.CurrentRegion.Select
End Sub
Sub prog()
Range("A1").Resize(10, 2).Select
End Sub
Sub prog()
Range("A1:B10").Rows(4).Select
End Sub
Sub prog()
Range("A1:B10").Rows("4:6").Select
End Sub
Sub prog()
Range("A1:B10").Rows(2).Select
End Sub
Sub prog()
Range("A1:B10").Rows("1:2").Select
End Sub
Sub prog()
Dim a As Integer
a = Range("A1:D10").Rows.Count
MsgBox "行数は" & a & "です"
a = Range("A1:D10").Columns.Count
MsgBox "列数は" & a & "です"
End Sub
|
Sub prog()
Dim num As Integer
num = Range("A1").Value
If num <= 10 Then
MsgBox "A1に入力されている値は10以下です"
Else
MsgBox "A1に入力されている値は11以上です"
End If
End Sub
Sub prog2()
Dim num As Integer
num = Range("A1").Value
If num = 0 Then
MsgBox "A1に入力されている値は0です"
ElseIf num = 5 Then
MsgBox "A1に入力されている値は5です"
Else
MsgBox "A1に入力されている値は0か5以外です"
End If
End Sub
■セルA1からセルA10に数値が入力されていた場合にその合計を求める。
Sub goukei()
Dim sum As Double
Dim i As Integer
sum = 0
For i = 1 To 10
sum = sum + Cells(i, 1).Value
Next i
Range("A11") = sum
End Sub
■Do 〜 Loopステートメント:条件が真である(成立している)限り永遠に処理を繰り返します。
ex. セルが空白でない限り処理を繰り返す。これを利用してA1からA10までの合計を求めてみる。
Sub myprog()
Dim sum, num As Double
Range("A1").Select
Do While ActiveCell.Value <> ""
num = ActiveCell.Value
sum = sum + num
ActiveCell.Offset(1, 0).Select
Loop
MsgBox sum
End Sub
■Do Until 〜 Loopステートメント:条件が真になる(成立する)まで処理を繰り返します。
ex. セルが空白になるまで処理を繰り返す。これを利用してA1からA10までの合計を求めてみる。
Sub myprog()
Dim sum, num As Double
Range("A1").Select
Do Until ActiveCell.Value = ""
num = ActiveCell.Value
sum = sum + num
ActiveCell.Offset(1, 0).Select
Loop
MsgBox sum
End Sub
VBAでは,このほかにもDo〜Loop WhileステートメントやDo〜Loop Untilステートメントが使用できます。
この構文は非常に便利で指定したセル範囲すべてに特定の処理を行います。例えばセル範囲A1:B10に入力されている値のなかで0.50以下のもののみを塗りつぶす、だとかセル範囲全ての値に10を足す、などができます・
■A1:B10のセル範囲において、0.5以下の値が入力されているセルを塗りつぶす
Sub for_each()
Dim a As range
For Each a In range("A1:B10")
If a.Value < 0.5 Then
a.Interior.ColorIndex = 5
Else
a.Interior.ColorIndex = xlNone
End If
Next a
End Sub
■A1:B10のセル範囲において、全てのセルに入力されている値に10を足す
Sub for_each2()
Dim a As range
For Each a In range("A1:B10")
a = a + 10
Next a
End Sub
例えばセルA1に文字が入力されていた場合,そのセルの色や文字色と大きさを1度にまとめて指定するためのステートメントです。ちなみに私はよく間違えるのですが,Withのあとにピリオド(.)を入れてはいけません。
Sub font_change()
Range("A1").Select
With Selection
.font.Bold = True 'ボールド体に設定
.font.ColorIndex = 3 'フォント色を設定
.Interior.ColorIndex = 35 'セル色を設定
End With
End Sub
Contentsへ戻る
|
配列を宣言するには
Dim 変数() As 変数型
と宣言します。
Sub prog_array()
Dim num(5) As Integer
Dim i As Integer
num(0) = 10
num(1) = 20
num(2) = 30
num(3) = 40
num(4) = 50
For i = 0 To 4
Cells(1 + i, 1).Value = num(i)
Next i
End Sub
またExcel VBAには2次配列というものがある。つまり通常の配列はn行1列であるのに対して2次配列はn行2列の行列を扱うことができるのである(2次配列は主に行列の計算に必要となる)。例えば次のようにデータが入力して,下に記述されているコードを走らせてみてください。
Sub hairetsu()
Dim a(1 To 4, 1 To 2) As Integer
Dim i, j As Integer
Range("A1").Select
For i = 1 To 4
For j = 1 To 2
a(i, j) = Selection.Cells(i, j)
MsgBox "2次配列a(" & i & "," & j & ")に" & a(i, j) & "という値が代入されています"
Next j
Next i
End Sub
|
Excel VBAにおいて関数とは@VBAに用意されている関数とAワークシート上で使う関数の2種類を指します。またFunctionプロシージャを利用することによってBユーザー定義関数を使用することもできます(これは自分で作る関数のこと)。
VBAにあらかじめ用意されている関数とは、例えばMsgBox関数とかですね。ワークシート上で使う関数としては、合計を求める=sum()や平均を求める=average()などがそうですね。統計解析を行う際には後者のワークシート関数をよく用いるのでその使い方を説明しましょう。
■セルA1:A10に入力されている値の合計と平均値を求める(ワークシート関数の使用)
Sub prog_func()
Dim sum, mean As Double
sum = WorksheetFunction.sum(Range("A1:A10"))
mean = WorksheetFunction.Average(Range("A1:A10"))
Range("C1").Value = sum
Range("C2").Value = mean
End Sub
Sub prog_func2()
Dim ran As Range
Set ran = Range(Range("A1"), Range("A1").End(xlDown))
Range("C4").Value = WorksheetFunction.sum(ran)
Range("C5").Value = WorksheetFunction.Average(ran)
End Sub
■ユーザ定義関数の使用
Function pow(x, y) 'xとyが引数
Dim z As Double
z = x ^ y
pow = z 'zが戻り値
End Function
Function myprog(y As Range) 'yが引数
Dim sum As Integer
sum = WorksheetFunction.sum(y)
myprog = sum 'sumが戻り値
End Function
これでワークシート上で=pow(12,2)とすれば12の2乗の値が返ってきます。また=myprog(A1:A10)と入力すればA1:A10の合計が返ってきます。
■サブルーチンの使用
サブルーチンとはC言語で習う関数のようなものです。親プロシージャからべつのプロシージャを呼び出すことができ、この呼び出されるプロシージャのことをサブルーチンというわけです。まぁ、論よりRUNですね。以下のプログラムをみてください。
'サブルーチン(呼び出されるプロシージャ)
Sub sub_rootin(x, y As Integer)
Dim z As Integer
z = x ^ y
MsgBox z
End Sub
'親プロシージャ
Sub myprog()
Dim pow As Integer
sub_rootin 12, 2
MsgBox "サブルーチンは正常に動きましたか?"
End Sub
■C言語をやったことのある人への補足
#include<stdio.h> int function(int x,int y) { int z; z=x*y; return z; } int main(void) { int kakezan; pow=function(12,2); printf("%d",kakezan); return 0; } |
|
ユーザーフォームの作り方についての基本的なことは他のwebサイトなどを参考にして、とにかく自力で以下のようなユーザーフォームを作成してください。これは値その1のテキストボックスと値その2のテキストボックスに値を入力し、足し算・引き算・掛け算・割り算を(オプションボタンを用いて)選んでその結果をセルA1に出力するものです。
☆手順1(ユーザーフォームを終了させるためのコードを記述する)
Private Sub CommandButton2_Click() Unload UserForm1 End Sub |
☆手順2(プログラムを実行するためのコードを記述する)
Private Sub CommandButton1_Click() Dim tashi, hiki, kake, wari As Double Dim num1, num2 As Integer num1 = UserForm1.TextBox1.Value num2 = UserForm1.TextBox2.Value If TextBox1.Value = "" Then MsgBox "値を入力して下さい" Exit Sub ElseIf TextBox2.Value = "" Then MsgBox "値を入力して下さい" Exit Sub End If tashi = num1 + num2 hiki = num1 - num2 kake = num1 * num2 wari = num1 / num2 If OptionButton1.Value = True Then Range("A1").Value = tashi ElseIf OptionButton2.Value = True Then Range("A1").Value = hiki ElseIf OptionButton3.Value = True Then Range("A1").Value = kake ElseIf OptionButton4.Value = True Then Range("A1").Value = wari End If End Sub |
【コードの解説】
num1 = UserForm1.TextBox1.Value num2 = UserForm1.TextBox2.Value |
―――
num1という変数にユーザーフォーム1のテキストボックス1に入力された値を代入
num2という変数にユーザーフォーム2のテキストボックス2に入力された値を代入
If TextBox1.Value = "" Then MsgBox "値を入力して下さい" Exit Sub ElseIf TextBox2.Value = "" Then MsgBox "値を入力して下さい" Exit Sub End If |
―――
もしテキストボックスに値が入力されていなかった場合は、メッセージボックスに「値を入力して下さい」と表示してプログラムを終了させる。
If OptionButton1.Value = True Then Range("A1").Value = tashi ElseIf OptionButton2.Value = True Then Range("A1").Value = hiki ElseIf OptionButton3.Value = True Then Range("A1").Value = kake ElseIf OptionButton4.Value = True Then Range("A1").Value = wari End If |
―――
もしオプションボタン1(つまり足し算)にチェックが入っていたらセルA1に変数tashiに代入されている値を出力する。以下同文。
*ユーザーフォームをボタンから実行する方法は次の章を参照。
|
自分で作ったSubプロシージャやユーザーフォームはボタンや図にマクロ登録することによってワークシート上から簡単に実行させることができます。ボタンを作成するには表示->ツールバー->フォームの順で。
■Subプロシージャの場合
あらかじめSubプロシージャを作成していた場合はボタンを作成したのと同時に次のようなウィンドウが現れます。ここで登録したいマクロ(下の場合ではprog)をクリックして[OK]ボタンをクリックすれば大丈夫です。そうでない場合でも、作成したボタンを右クリックして[マクロの登録]を選択すれば登録できます。
■ユーザーフォームの場合
上と同じようにボタンを右クリックしマクロの登録を選ぶウィンドウが開きますので、そこで新規作成をクリックしてください。するとコードウィンドウが開かれるので、そこに以下のようにコードを記述してください。
Sub ボタン1_Click()
UserForm1.Show
End Sub
コードウィンドウを閉じてボタンをクリックしてみてください。