ExcelVBAの基礎知識

シートとブックの指定方法1〜名前とインデックス

シートやブックの指定方法は、名前で指定する方法と、
何番目かという順番で指定する方法があります。

名前で指定する場合は、そのまま文字列で名前を指定してあげます。
ブックの場合は拡張子まで含めて指定します。

Workbooks("Book1.xls")
Worksheets("Sheet1")


数あるワークブック(Workbooksコレクション)の中から
「Book1.xls」というファイルを指定、
数あるワークシート(Worksheetsコレクション)の中から
「Sheet1」というシートを指定しています。


もう1つ、順番で指定する方法があります。
Excelではブックは開いた順、シートは左から順に1、2、3・・・・・と
自動的に番号がつけられます。

この番号をインデックスといいます。

たとえば「Workbooks(1)」であれば、1番目に開いたブック、
「Worksheets(2)」だったら左から2番目のシートを表します。

インデックスは固定のものではありません。
シートを並び替えれば、即座にインデックスも変わります。

処理するシートの位置が変わらない場合や、そもそもブックに1枚しかシートがないような
場合はインデックスで指定するといちいちシート名を指定しなくて
済むので、うまく使えばコードの簡略化につながります。

逆に、ブックをインデックスで指定する機会はほとんどないと思います。

ExcelVBAの基礎知識

VBAの命令のまとめ

VBAの命令文を一度まとめます。

◆メソッド・・・・・・オブジェクトに対する命令
オブジェクト.メソッド


◆プロパティ・・・・・・オブジェクトの設定値を格納する場所
1.プロパティに値を入れる
オブジェクト.プロパティ = 値


2.プロパティの値を取得する
値を格納する場所(変数など) = オブジェクト.プロパティ


◆ステートメント・・・・・・オブジェクトに関係しない命令(条件分岐、繰り返しなど)
ステートメント
ステートメント 〜 End ステートメント


◆関数・・・・・・引数を元に処理を行い、結果を返す命令
1.VBA独自の関数
値を格納する場所(変数など) = 関数名(引数)


2.一般機能の関数
値を格納する場所(変数など) = WorksheetFunction.関数名(引数)


「メソッド」「プロパティ」「一般機能で使える関数」はマクロ記録で記録できるため、
それほど一生懸命に覚えなくても大丈夫です。

マクロを作るうちに、自然と覚えてきます。

ExcelVBAの基礎知識

VBAの命令4〜関数

関数は計算して結果を返す命令です。
一般機能にもありますね。
たとえば、SUM関数は指定した引数の合計値を返します。

サンプルコード1



Sub 関数()

Dim Total As Long

Total = WorksheetFunction.Sum(1, 2, 3, 4, 5)
MsgBox "合計値は" & Total & "です。"

End Sub


VBAで使える関数には、VBA独自の関数と一般機能でも使える関数があります。

VBA独自の関数を使う場合は、普通に関数名を書き、()内に引数を書きます。

◆関数の呼び出し
関数名(引数)

引数がない関数は、引数のところは何も書きません。

サンプルコード2



Sub 引数がない関数()

Dim day As Date

day = Date
MsgBox day

End Sub


一般機能の関数を呼び出すには、関数名の前にWorksheetFunctionをつけ、ピリオドでつなぎます。
WorksheetFunction.関数名(引数)


ExcelVBAの基礎知識

VBAの命令3〜ステートメント

ステートメントは、オブジェクトに関わらない命令文です。
マクロの開始を表すSubステートメントのように、
開始を表す言葉と終了を表す言葉の2つで1セットになっている場合もあります。

ExcelVBAの基礎知識07


ステートメントには、
繰り返し処理をする「Do ... Loopステートメント」「For ... Eachステートメント」
条件を判断して処理を分岐をする「Ifステートメント」など
重要な命令文がたくさんあります。

ステートメントはマクロ記録ではコードが得られないので、
しっかりと勉強しましょう。


ExcelVBAの基礎知識

VBAの命令2〜プロパティ

プロパティとは、オブジェクトの設定を入れておく場所のようなものです。
たとえば、ワークシートには「シート名」や「表示するかどうか」のような
設定があります。

シート名はNameプロパティ、表示するかどうかはVisibleプロパティなど、
オブジェクトの設定はそれぞれのプロパティに保存されています。


VBAではそうしたプロパティの値を取得したり、プロパティに値を入れたりできます。

ただし、すべてのプロパティに値を入れられるわけではありません。
オブジェクトの数を格納するCountプロパティなど、値を入れられない
(取得するだけ)プロパティもあります。


プロパティに値を入れる時はメソッドの時と同様に、オブジェクトとプロパティをピリオドでつなぎます。
さらに、入れる値を=でつなぎます。
値を入れることを、代入するといいます。

◆プロパティへの代入
オブジェクト.プロパティ = 値

サンプルは、一番左のシートのNameプロパティに「Test」という文字を入れています。
Nameプロパティは名前を表すプロパティなので、一番左のシート名が「Test」となります。

サンプルコード1



Sub シート名変更()

ThisWorkbook.Worksheets(1).Name = "Test"

End Sub


プロパティから値を取得する場合は、
取得した値を入れる場所が必要となります。

変数という入れ物に入れるのが一般的です。

サンプルコード2



Sub シート名取得()

Dim strSheetName As String

strSheetName = ThisWorkbook.Worksheets(1).Name
MsgBox strSheetName

End Sub

ExcelVBAの基礎知識

VBAの命令1〜メソッド

メソッドは、オブジェクトやコレクションにに特定の動作をさせる命令です。
メソッドで重要なのは、「何にたいしての操作か」をはっきりさせることです。

VBAでは、オブジェクトにメソッドを実行する場合、
オブジェクトとメソッドをピリオド(.)で結びます。

たとえば、ブック名がBook1.xls、シート名がSheet1の場合、
Worksheetオブジェクトに対してCopyメソッドを実行する場合は
Workbooks("Book1.xls").Worksheets("Sheet1").Copy

と書きます。

対象を省略した場合は


メソッドを実行するときにはオブジェクトを指定するのが基本ですが、
オブジェクトの1部を省いてもマクロは動きます。

たとえば、Workbooks("Book1.xls").Worksheets("Sheet1").Copyを
Worksheets("Sheet1").Copy

と書くこともできます。

しかし、ブックが複数開いていて、それぞれにSheet1というシートがあった場合、
どのブックのSheet1なのかがわかりません。

このようにオブジェクトの指定を1部省略した場合は、
マクロを標準モジュールに書いているなら、アクティブなオブジェクトに対して
メソッドが実行されます。


メソッドの引数


メソッドによっては呼び出すときに特定の値を指定する必要があります。
例えば、WorkBooksコレクションにOpenメソッドを実行する時は「開くブックのパス」が必要です。

こうした呼び出すときに必要になる値のことを、引数(ひきすう)といいます。
引数がある場合は、メソッド名に半角スペースを空けて引数を指定します。
下記のブックを開くサンプルの場合、「"C:¥" & "Book1.xls"」の部分が引数です。
◆サンプルコード1
Sub ブックを開く()
 Workbooks.Open "C:¥" & "Book1.xls"
End Sub


メソッドは覚えなくてもOK


ExcelVBAには、さまざまなメソッドがありますが、これらは基本的に覚える必要はありません。
Excelにはマクロ記録という機能があります。([ツール(T)]-[マクロ(M)]-[新しいマクロの記録(R)])

これは、「新しいマクロの記録」を押してから、次に「記録終了」を押すまでに操作した内容を、
自動的にVBAのコードにしてくれる機能です。

記録したマクロは、標準モジュールに追加されます。


マクロ記録の注意点


便利なマクロ記録ですが、1つ注意点があります。
それは、マクロ記録で記録できるコードは、あまりプログラム的によいとはいえない
ということです。

たとえば、上にもあるようにSheet1をコピーする操作をマクロ記録した場合、
Sheets("Sheet1").Select
Sheets("Sheet1").Copy

というようなコードになります。

Selectメソッドは対象をアクティブにするメソッドです。
これは、あらかじめ対象を指定してメソッドを実行しているなら必要のない処理です。

こうした本来ならば必要ない処理が入ることによって、
マクロの処理速度が遅くなる、コードが長くなって見にくいという欠点があります。

はじめは、マクロ記録で記録をとってみて、それをSelectメソッドを使わない形に
手直しするところから始めるのも1つの手です。

ExcelVBAの基礎知識

VBAの命令の種類

VBAの命令は、大きく2つに分かれます。

1つは、オブジェクトに関係する命令。
もう1つは、オブジェクトに関係しない命令です。

オブジェクトというのは、シートやブックなど、
操作の対象になるもののことです。

オブジェクトに関係する命令


オブジェクトに対して、特定の動作をさせる命令を「メソッド」といいます。
ブック・シートのコピーや新規作成がメソッドにあたります。

また、オブジェクトの設定値(シートの名前や、セルに入っている値など)のことを
プロパティ」といいます。

VBAでは、プロパティに値を入れたり、値を取り出すことができます。


オブジェクトに関係しない命令


一方、オブジェクトに関係しない命令としては「ステートメント」があります。
これには、条件分岐や繰り返し処理などをする命令があります。

また、一般機能にもあるように「関数」があります。
これは、指定した値(引数/ひきすう)を元に、計算などをするための命令です。

◆VBAの命令のまとめ
VBAの命令


オブジェクトとコレクション


冒頭で書いたように、ワークシートやワークブックといった操作の対象になるものを
オブジェクト」といいます。
シートなら「Worksheetオブジェクト」、ブックなら「Workbookオブジェクト」など。

さらに、オブジェクトの集まりを「コレクション」といいます。
シートの集まりは「Worksheetsコレクション」、
ブックなら「Workbooksコレクション」です。

コレクションは複数のオブジェクトの集まりなので複数形、
オブジェクトはコレクションの中の1つなので単数形になります。

オブジェクトとコレクション

代表的なオブジェクトはブック、シート、セルの3つです。
シートはグラフシートなどのシートも含むかどうかで記述が変わってきます。

ブックWorkbookオブジェクト
ワークシート(ワークシートのみ)Worksheetオブジェクト
シート(グラフシートなども含む)Sheetオブジェクト
セルRangeオブジェクト


ExcelVBAの基礎知識

VBAで扱うデータ

ExcelVBAでは、数値や文字列といった様々なデータを扱います。
データの種類によって、すこし書き方が変わります。

文字列


文字列は必ず、ダブルクォーテーションで囲みます。
また、文字列とほかの値を連結して1つの値とすることもできます。

文字の連結は「&」か「+」記号を使います。
ただし、+記号は数値の足し算にも使うため、文字列には「&」を使う方がいいでしょう。

数値と文字列を連結する場合は、数値はダブルクォーテーションなし、
文字列はダブルクォーテーションありになります。

◆サンプルコード1
Sub 文字列の結合1()
 MsgBox "Test" & 1
End Sub


◆サンプルコード2
文字列にはさまれた数値を連結する場合、間違えて数値まで
囲ってしまうことが多いので注意が必要です。
Sub 文字列の結合2()
 MsgBox "Test" & 1 & "番目"
End Sub


数値


数値データは、足し算や掛け算といった計算を行うことができます。
こうした計算のことを演算といい、計算につかう「+」や「-」といった記号を
演算子」といいます。

演算子の種類は以下のとおりです。


種類演算子結果
足し算+1+12
引き算-1-10
掛け算*1*22
割り算/1/20.5

「数値」と「数字」


数値なのか数字(文字列)なのか区別することは大切です。
たとえば、「1+1」としても、数値なら計算されて「2」、
数字(文字列)なら連結されて「11」になります。

◆サンプルコード3
Sub 数値と数字の違い1()
 MsgBox "数値です:" & 1 + 1
End Sub

ExcelVBAの基礎知識04

◆サンプルコード4
Sub 数値と数字の違い2()
 MsgBox "文字列です:" & "1" + "1"
End Sub

ExcelVBAの基礎知識05


日付


日付はシリアル値という数値として扱われます。
1990/1/1を数字の「1」とし、1日たつごとに1が加算されます。
つまり、1990/1/2は「2」、1990/1/3は「3」・・・・・・となっています。
時刻は小数点以下で表されます。

日付を指定する場合は、日付をシャープ(#)で囲みます。
囲み忘れた場合は、日付ではなく数値として計算されてしまいます。

たとえば、2010/4/1をそのまま入力してしまうと、
2010÷4÷1=502.5になってしまいます。

◆サンプルコード5
Sub 日付を扱う()

'日付を囲まない場合
MsgBox 2010 / 4 / 1

'日付を囲む場合
MsgBox #4/1/2010#

End Sub

VBAでは#2010/4/1#と入力しても、自動的に#4/1/2010#と
「年、月、日」が「月、日、年」に並び変わります。

ExcelVBAの基礎知識

VBAの基本

まずはExcelのマクロがどのようなものかを知るために、簡単なマクロを作ってみましょう。
次のサンプルコードをVBEにコピーするか、実際に打ってみて実行してみましょう。
*コードとは、プログラムの文章のことです。

マクロの実行は、F5キーで実行できます。

サンプルコード
Sub マクロの開始()
  'メッセージボックスを表示させる
  MsgBox "事務職のためのExcelVBA入門講座"
End Sub

短いマクロですが、これだけでもVBAの基本がつまっています。

基本1 Sub〜End Subまでが1つのマクロ


マクロはSubステートメントという命令から始まります。
SubステートメントはSub マクロ名()で始まり、End Subで終わります。
Sub マクロ名()〜End Subに囲まれた部分がマクロ本体になるということです。

マクロ名は、マクロ記録の場合勝手に「Macro1」「Macro2」など勝手につきます。

マクロ名は「1文字目には数字が使えない」とか、「使えない記号」などがありますので、
基本的に「英字+単語を区切りたい時はアンダーバー(_)で区切る」とするといいでしょう。


基本2 1行=1命令


VBAでの命令は、基本的に1行で1命令になっています。
上記のサンプルコードだと、以下のような処理になっています。
1行目・・・マクロの開始
2行目・・・コメント行(処理を行わない、ただのメモ)
3行目・・・メッセージボックス表示
4行目・・・マクロの終了

場合によっては1行が長くなってしまうことがあります。
基本的に1行=1命令なので、そのまま改行しようとするとエラーになります。
そういう時は、半角スペースとアンダーバーを入力することで、エラーにならずに改行できます。
サンプルコード
MsgBox _
"事務職のためのExcelVBA入門講座"

アンダーバーの前の半角スペースが忘れがちなので注意!
半角スペースを忘れた場合コードが赤くなり、次のようなエラーがでます。

ExcelVBAの基礎知識06


基本3 先頭にアポストロフィー(')でコメント行


先頭にアポストロフィー(')をつけると、その行全体がコメント行になります。
コメント行とは、マクロの動作に影響しない行のことです。
コメント行を使うことによって、メモを残しておくことができます。

コメント行はVBEでは緑色で表示されます。

ExcelVBAの基礎知識

モジュールの追加と削除

Excelマクロを書く場所として、「モジュール」(Module)というものがあります。
一般機能でいうワークシートみたいなものです。

1つのモジュールに複数のマクロを書くこともできます。


他にもマクロを書ける場所はあるのですが、
「基本的にモジュールに書く」と覚えてしまっていいでしょう。


作成したばかりのブックですと、モジュールが1つもない状態ですので
まずはモジュールを作ってみましょう。


モジュールの追加方法>

VisualBasicEditorの左側のプロジェクトエクスプローラから、
モジュールを作成したいブックを右クリックして、
[挿入(N)]→[標準モジュール(M)]を選びます。
ExcelVBAの準備04

VBAProject(Book1)の下に、モジュールが作られ、
その中にModule1というものが追加されました。
ExcelVBAの準備05

モジュールを削除したい場合は、
削除したいモジュールを右クリックして、[モジュールの解放(R)]をクリックします。
ExcelVBAの準備06

1つ1つのマクロの事を「プロシージャ」といいます。
モジュールの情報はブックに保存されますので、ブックを削除すると
そのブックに保存したプロシージャはすべて消えてしまいます。

<< 1 2 3 4 >>


Powered by Seesaa
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。