<<目次へ


初心者のためのExcel VBAの超簡単な使い方

Contents

1) Excelへの招待
2) ExcelVBAについて
3) VBAを使う前に
4) セルの操作
  1.任意のセルを選択する
  2.Offsetプロパティ
  3.Endプロパティ
  4.CurrentRegiuonプロパティ
  5.Resizeプロパティ
  6.RowsプロパティとColumnsプロパティ
  7.Countプロパティ
5) 制御構造を理解する
  1.if構文/条件判断
  2.for構文/繰り返し
  3.while構文/ループ
  4.For Each 〜 Nextステートメント
  5.処理を中断する
  6.Withステートメント
6) 配列の使用
7) 関数とサブルーチン
8) ユーザーフォームの使い方
9) ボタンへの登録


1) Excelへの招待

 Excelを使用して高度なデータ分析を行うのは不可能です。もちろんVBA(Visual Basic for Applycations)という機能を用いたり、あるいは統計解析を行うためのアドインソフトを購入すればいくらでも可能になりますが、、、

 Excelに限らずコンピュータの操作というのは慣れ親しむということが大切で、よく意味が分からなくてもとにかくイジってみることが上達の早道です。だから、なんでもいいからExcelについて書かれた本を1冊買って、それを1通り読んでみる(本に習って操作してみる)ことが良いと思います。ちなみに私が初めて買ったExcelの書籍は

白石修二著『例題で学ぶExcel統計入門』森北出版 2004年(第1版第4刷)

という本ですが、本当にExcelを触ったことがない人にはこれがおススメです。というか、この本に習って操作をしていけば1冊を読み終えた頃にはかなりExcelを扱えるようになっているはずです。少なくとも基本的な関数やグラフを描くための機能は使いこなせているはずです。

 最近はインターネットが使えればwebサイトでプログラミング言語などを勉強できますが、なんでもかんでもインターネットに頼りすぎて書籍を買うことが少なくなっているように感じます。確かにwebサイトで紹介されている説明は作者独自の分かり易い説明がされているのですが、それらの説明は断片的であったりするので、やはり入門書のように系統立てて説明されているものが必要となるのではないでしょうか。・・・ということで上で紹介した本(それ以外の本でも構いませんが)をまず買いましょう。やはりある程度は手間とお金をつぎ込まなければ成長しません。


Contentsへ戻る



2) ExcelVBAについて

 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冊置いておき、このページで説明されている部分で足りない部分を補えるようにしておくと効果的です。

 


Contentsへ戻る



2) VBAを始める前に

これからVBAプログラミングをしていくうえで大切な用語というか概念を説明します。最初は「こんなこと覚えてなくてもできるんじゃないか?」と思ってしまうかもしれませんが、ここをキッチリと理解しておかないと後になってけっこう大変なことになります。

■モジュール

Excel VBAにおいてモジュールとは@オブジェクトモジュールAユーザーフォームモジュールB標準モジュールの3種類のことを指します。

■プロシージャ

 Excel VBAにおいてプロシージャとは@SubプロシージャとAFunctionプロシージャの2種類のことを指します。

■ステートメント

 ステートメントとはプロシージャを構成する1行ごとのコードのことです。

■モジュールとプロシージャの関係

 モジュールはいくつかのプロシージャによって構成されています。例えば自転車はフレームやホイール、ハンドル、サドル、コンポーネントなどが組み合わさって1つの完成車となっています。この完成車がモジュールで、それぞれの部品がプロシージャであると考えればよいでしょう。

■オブジェクト

 オブジェクトとは処理の対象となるもののことです。例えばワークシートやセルなどがそうで、ワークシートを閉じるようなプログラムを作ったとき、処理の対象はワークシートですからこのときのオブジェクトはワークシートということになります。またA1:A10までのセル範囲の合計を求めるようなプログラムを作るときは、処理の対象がA1:A10というセル範囲ですからこのときのオブジェクトはセルであるといるわけです。

■プロパティ

 プロパティとはオブジェクトが持つ特徴のことです。例えばセルに入力されている値や文字サイズ、文字色などの特徴がプロパティです。

■メソッド

 メソッドとはオブジェクト(すなわちワークシートやセル)に対する操作、例えばコピーや移動、削除などといったオブジェクトを直接操作できる命令のことです。

データ分析を行うプログラムを作っていく上ではいくつかのセル範囲が処理の対象となるので、「オブジェクト=セル」と考えてしまって結構です。すなわちセルの操作を覚えることがExcel VBAでデータ解析用のプログラムを作るための基本となります。


Contentsへ戻る



4) セルの操作

 ExcelVBAを使いこなすためにはセルの操作がとても重要になります。それに伴ってプロパティを覚える必要があり、セルを操作するためのいくつかのプロパティさえ覚えてしまえばもうこっちのもんです。最初は退屈かもしれませんが、地道にプロパティの使い方を習得していきましょう。

1.任意のセルを選択する

任意のセルまたはセル範囲を選択するためには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


Contentsへ戻る



2.Offsetプロパティ

■アクティブセルから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


Contentsへ戻る



3.Endプロパティ

Sub prog()
   Range("A1").Select
   Selection.End(
xlDown).Select
   ActiveCell.Offset(
1, 0).Select
End Sub


Contentsへ戻る



4.CurrentRegiuonプロパティ

Sub prog()
   Range("A1").Select
   ActiveCell.CurrentRegion.Select
End Sub


Contentsへ戻る



5.Resizeプロパティ

Sub prog()
  Range("A1").Resize(10, 2).Select
End Sub


Contentsへ戻る



6.RowsプロパティとColumnsプロパティ

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


Contentsへ戻る



7.Countプロパティ

Sub prog()
  Dim a As Integer
  a = Range("A1:D10").Rows.Count
  MsgBox "行数は" & a & "です"
  a = Range("A1:D10").Columns.Count
  MsgBox "列数は" & a & "です"
End Sub


Contentsへ戻る



5) 制御構造を理解する

1. if構文

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


2.for構文

■セル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


3.while構文

■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ステートメントが使用できます。


Contentsへ戻る



4.For Each 〜 Nextステートメント

 この構文は非常に便利で指定したセル範囲すべてに特定の処理を行います。例えばセル範囲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


5.処理を中断する


Contentsへ戻る



6.Withステートメント

 例えばセル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へ戻る



6) 配列の使用

 配列を宣言するには

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


Contentsへ戻る



7) 関数

 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言語をやったことのある人への補足


Contentsへ戻る



8) ユーザーフォームの使い方

 ユーザーフォームの作り方についての基本的なことは他のwebサイトなどを参考にして、とにかく自力で以下のようなユーザーフォームを作成してください。これは値その1のテキストボックスと値その2のテキストボックスに値を入力し、足し算・引き算・掛け算・割り算を(オプションボタンを用いて)選んでその結果をセルA1に出力するものです。

☆手順1(ユーザーフォームを終了させるためのコードを記述する)

☆手順2(プログラムを実行するためのコードを記述する)

【コードの解説】

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に代入されている値を出力する。以下同文。

*ユーザーフォームをボタンから実行する方法は次の章を参照。


Contentsへ戻る



9) ボタンへの登録

 自分で作ったSubプロシージャやユーザーフォームはボタンや図にマクロ登録することによってワークシート上から簡単に実行させることができます。ボタンを作成するには表示->ツールバー->フォームの順で。

■Subプロシージャの場合

 あらかじめSubプロシージャを作成していた場合はボタンを作成したのと同時に次のようなウィンドウが現れます。ここで登録したいマクロ(下の場合ではprog)をクリックして[OK]ボタンをクリックすれば大丈夫です。そうでない場合でも、作成したボタンを右クリックして[マクロの登録]を選択すれば登録できます。

■ユーザーフォームの場合

 上と同じようにボタンを右クリックしマクロの登録を選ぶウィンドウが開きますので、そこで新規作成をクリックしてください。するとコードウィンドウが開かれるので、そこに以下のようにコードを記述してください。

Sub ボタン1_Click()
  UserForm1.Show
End Sub

 コードウィンドウを閉じてボタンをクリックしてみてください。


Contentsへ戻る