初心者オサムシがExcelのマクロと戦う戦闘ブログである
by オサムシ
タグ:VBAエキスパート ( 8 ) タグの人気記事
試験メモ【イベントプロシージャ】/VBAエキスパート

イベントプロシージャ



イベントプロシージャとはExcel上で何か操作が行われたときに、それをマクロが感知してプロシージャを起動するという事

Excel上で変化が起こる事をイベントという訳だけど、もちろん変化が起こっただけじゃ、別に何の意味もない

そこに仕掛けをしておくからこそ効果があるんだよね

例えば、どこかのセルを書き換えたとか、右クリックをしたとか、Excelファイルを開いた(つまりWorkbookを開いた)とか

それを全て「イベントが起こった」という訳

いろいろ使い道はあるけど、シートにマクロボタンを設けて、それをクリックすれば別にイベントで反応させなくても良いんだけど、例えば、絶対に書き換えてはいけない書類ファイルがあったとする

それを上書き保存しちゃったらマズいから、「上書き保存をしようとしたら別名保存させるようにする」なんてのはどうだろう

上書き保存はマクロではSaveだけど、Saveというイベントが起こったら、BeforeSaveつまり「Saveの前に」別名保存させるのでオリジナルは上書きされないで済む

こんな風に「あったらマズイ」ときと「あったら便利」なときにも使える

イベントには以下リンク先のモノがある(全てではありません)

ワークシートに対するイベント/Excel マクロ
https://docs.google.com/spreadsheet/ccc?key=0Aq3SC7WlgWhMdHg2TGxGcnAzVXZ0cV9YSUtoVWRtWUE&usp=sharing

ブックに対するイベント/Excel マクロ
https://docs.google.com/spreadsheet/ccc?key=0Aq3SC7WlgWhMdEVBM3JaRGhiZlRjVWRaUHdCdjVZN2c&usp=sharing

書き方は、まずコードウィンドウでオブジェクトモジュールをダブルクリックで選択する

すると下画像の様なウィンドウになる
d0285354_2254519.jpg

左のセレクトボタンでWorksheetを選択すると、右のセレクトボタンに候補がでるので、そこから選択すればベースを打ち込んでくれる

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub


この書式がデフォで、最初から引数Targetまで用意してくれてる

Targetはともかく、書式に関してはこれじゃないとダメみたいですね

ちなみにイベントプロシージャ内で、イベントを起こさせたくない部分にはEnableEvensを使います

Application.EnableEvents = False
命令
Application.EnableEvents = True


イベントに関してはもう少し裏がありそうだけど、そんなに追及するとこじゃないのでこの程度でよし

あと一つ言うなら、イベントはオブジェクトモジュールでないと使えない

更にブックのイベントはオブジェクトモジュール内の「ThisWorkbook」モジュールでしか使えない

イベントプロシージャは乱用するととんでもない事になりかねないから、ほどほどにしようね。


オサムシじゃーなる
[PR]
by 03musi | 2013-02-11 22:55 | 試験メモ/VBAエキスパート
試験メモ【動的変数と配列のお話し】/VBAエキスパート

動的変数と配列のお話し



配列

変数宣言時に配列であることを指定すると、一つの変数に配列として複数の値を格納できます

配列の要素には、インデックス番号がつけられます

Sub sample1()
Dim zoo(2) As String
zoo(0) = "ゴリラ"
zoo(1) = "ペンギン"
zoo(2) = "カバ"
MsgBox zoo(0)
End Sub


上記の構文ではzoo(2)と指定していますが正式には下記となります

Dim zoo(0 To 2) As String
範囲を指定しない場合は「0」を指定したとみなされます

0が扱いにくい場合は
Dim zoo(1 To 3) As String
のように指定しても要素が3つであることは同じです

動的配列

マクロで要素数を取得するようなときは、マクロを書く時点では配列の要素数がわかりませんよね

そんなときは、動的配列を使います
Dim zoo() As String
要素数を指定しないで、動的配列である事を()で表します

要素数がわかった時点でReDimを使って要素数を指定します

ただし、ReDimをする度に格納されていた値は全てリセットされてしまいます

これを避けるためには、ReDimの後にPreserveを付加します

Sub sample2()
Dim a As Variant
Dim n As Variant
Dim i As Integer
Dim zoo() As String 'zooの後に()をつけて動的配列に指定
n = 1
ReDim Preserve zoo(n)
a = Cells(n, 1) 'aにセル値を代入
Do Until IsEmpty(a) 'aが空でなかったら処理を続ける
zoo(n) = Cells(n, 1) '現在インデックス配列にセル値を代入
n = n + 1 '1つ下のセルへ
a = Cells(n, 1) 'aにセル値を代入
ReDim Preserve zoo(n)
Loop 'Loopここまで
dobutu = InputBox("動物の名前を入力")
zoo(n) = dobutu
For i = 1 To n
hyouji = hyouji & zoo(i) & vbCrLf
Next i
MsgBox hyouji
End Sub


最後にFor…Nextステートメントで、配列を取り出し、Msgboxで表示しています

Preserveを指定したおかげで、Loop内で配列に格納した値が保持されています

ReDimステートメント

配列の宣言で要素数を指定した場合、動的配列にならないので、ReDimで要素数を変更できません

また、動的配列では要素数の開始番号を指定できないようです
つまり「0」から始めるしかないようです。

例の様にセル番号と関連性を持たせたいような場合は、「0」は欠番にするか、配列のときだけ「n - 1」のように1を引いて扱うしかありません。たぶん。。

上記例を「n - 1」として「0」から使えば、最後のFor文はFor…Eachにすることで、インデックス番号を気にすることなく、配列のすべての値を取り出せます

Sub sample2()
Dim a As Variant
Dim n As Variant
Dim i As Integer
Dim zoo() As String
n = 1
ReDim Preserve zoo(n)
a = Cells(n, 1)
Do Until IsEmpty(a)
zoo(n - 1) = Cells(n, 1)
n = n + 1
a = Cells(n, 1)
ReDim Preserve zoo(n - 1)
Loop
dobutu = InputBox("動物の名前を入力")
zoo(n - 1) = dobutu
For Each hairetu In zoo
hyouji = hyouji & hairetu & vbCrLf
Next hairetu
MsgBox hyouji
End Sub


実際やってみますかぁ

まずはシートに下準備
d0285354_23344550.jpg


実行するとセルの内容を配列に格納して、空白セルに到達するとLoopをやめてInputBoxを開きます
「ライオン」と入力しました
d0285354_23345723.jpg


最後にFor…Eachで配列を取り出しMsgBoxで表示
d0285354_2335795.jpg

ちなみにこの方法で配列を抽出する場合、Variant型で宣言しないとダメです

つまり型を省略すればVariant型宣言とみなされるから、それでOK

上記例の程度ならセルで扱っても問題ないね

配列のメリットを体感するような出来事があったら実例で紹介します。osamushi

オサムシじゃーなる
[PR]
by 03musi | 2013-02-10 23:47 | 試験メモ/VBAエキスパート
試験メモ【引数渡しをもう少し詳しく】/VBAエキスパート

引数渡しをもう少し詳しく



複数の引数を渡す

Sub sample8()
Call sample9("渡します", 5)
End Sub

Sub sample9(msg As String, n As Long)
Dim i As Long, a As String
For i = 1 To n
a = a & msg & i & vbCrLf
Next
MsgBox a
End Sub

d0285354_16155013.jpg



引数を省略する

省略可能な引数前にOptionalを付ける
Sub sample9(msg As String, Optional n As Long)


省略した場合の対処

①あらかじめ初期値を設定しておく
Sub sample9(msg As String, Optional n As Long = 5)


②省略された事を調べる/IsMissing関数

Sub sample8()
Call sample9("渡します") 'nに渡す引数を省略
End Sub

Sub sample9(msg As String, Optional n) '変数nはバリアントなので型省略
Dim i As Long, a As String
If IsMissing(n) = True Then n = 5
For i = 1 To n
a = a & msg & i & vbCrLf
Next
MsgBox a
End Sub

気を付けなきゃいけないのが、IsMissing関数で判定する引数はバリアント型でなければダメ
型を宣言しないとバリアント型になるので、宣言しなければOK

オサムシじゃーなる
[PR]
by 03musi | 2013-02-10 16:15 | 試験メモ/VBAエキスパート
試験メモ【プロシージャ】/VBAエキスパート

プロシージャ



プロシージャ名の右に付く()はプロシージャ同士で値を渡す時に使う
詳しくは後の記事で。。

他のプロシージャを呼び出す
Call

Callは省略できますが明示的にした方が良いと思う

Sub sample1()
Range("A1").Value = "山田"
Call sample2
End Sub
Sub sample2()
Range("B1").Value = Range("A1").Value & "太郎"
End Sub

d0285354_0523532.jpg



Functionプロシージャ

SubではじまるプロシージャをSubプロシージャと言いますが、End Subで終わった後は何もしません

Functionプロシージャは、End Functionで終わった後、実行結果を呼び出し元に返します

Function プロシージャ名(受け取る値) As 返すデータ型

Sub sample3()
Dim i As Long
For i = 2 To 6
Cells(i, 2).Value = baika(Cells(i, 1).Value)
Next
End Sub

Function baika(genka As Single) As Long
baika = genka * 1.3
End Function

d0285354_17131365.jpg



オサムシじゃーなる
[PR]
by 03musi | 2013-02-09 17:14 | 試験メモ/VBAエキスパート
試験メモ【シートとブック操作】/VBAエキスパート

シートとブック操作



ワークシート

シートの挿入
Worksheets.Add

挿入されたシートはアクティブになります

名前の定義
Worksheets("sheet1").Name = "名前"

削除
Worksheets("名前").Delete

確認メッセージ無しで削除
Application.Displayalerts = False
Worksheets("sheet1").Delete
Applecation.Displayalerts = True

アクティブでないシートのセル操作
Worksheets("sheet1").Range("A1").Copy Worksheets("sheet2").Range("B2")

ワークブック

ブックを開く
Workbooks.Open Filename:=("C:\Users\ユーザー名\Desktop\test.xlsm")

ブックの挿入
Workbooks.Add

ブックの上書き保存
Workbooks("Book1.xlsx").Save

別名保存
ActiveWorkbook.SaveAs "C:\test1.xlsx"

ブックを閉じる
Activebooks.Close

アクティブでないブックのセル操作(ファイルは開いている必要があります)
Sub test()
a = Workbooks("test.xlsm").Worksheets("Sheet6").Range("A1")
MsgBox a
End Sub


オサムシじゃーなる
[PR]
by 03musi | 2013-02-09 14:25 | 試験メモ/VBAエキスパート
試験メモ【VBA基礎構文】/VBAエキスパート

VBA基礎構文



①オブジェクト式
(A)対象.様子 = 値
(B)対象.命令 オプション(引数名) := 値
②ステートメント
③関数

様子、状態=プロパティ
命令=メソッド
オプション=引数

変数

①Dim 変数名 As 変数の型 プロシージャ内で使用
②Private 変数名 As 変数の型 モジュール内で使用
③Public 変数名 As 変数の型 すべてのモジュールで使用

複数の宣言をする場合は「Dim a As String, b As String」の様に変数名をカンマで区切る

セルの操作

Range("A1") 'A1セル
Cells(1,2) 'B1セル

コピー
Range("A1").Copy Destination:=Range("B3") '「Destination:=」は省略可
Range("A1").Copy Range("B3")

ステートメント

If 条件1 Then
処理1
ElseIf 条件2 Then
処理2
Else
処理3
End If

For 変数 初期値 To 終了値 Step 2
処理
Next 変数

オサムシじゃーなる
[PR]
by 03musi | 2013-02-09 13:35 | 試験メモ/VBAエキスパート
下方修正/VBAエキスパート受験
教科書も8割がた、すすんだのでVBAエキスパートの模試をやってみた

ん~~~正直難しい

ってなわけで。。。

下方修正します

2月受験は無理!

調べてみたらオデッセイ直営の"テスティングセンター"でちょくちょくやってるらしいので、来月に延ばします

ダラダラやるのがイヤだったので、ギリギリで受験しようかと思ったけど

思ったより難易度が高い

ベーシックから受ければ良いんだけど、お金も掛かるからね

とにかく1か月延ばします

目標!VBAエキスパート/スタンダード 3月受験一発合格!!よろぴく。osamushi

追記
コードにコメントを付加するとき視認性を考慮して // を使ってきたけど、これからは正式なBASIC流の ' を使います。
ちょっと見にくいけどね。osamushi

オサムシじゃーなる
[PR]
by 03musi | 2013-02-09 12:55 | 日記
Excel VBAエキスパート/日記

Excel VBAエキスパート/日記


Excel VBAエキスパートという資格をとろうと思います

中でもベーシックとスタンダード(後者が上位)というのがあるんですけど、ベーシックは結構簡単そうなので、少しハードルを上げてスタンダードを目指してみようと思う

試験用の勉強方法というのもよくわからないので、主催しているオデッセイさんで販売している試験対策用の参考書を購入してみた。

d0285354_16262532.jpg

年明け2月に受験を予定しております。

がんばって勉強しよ。osamushi

オサムシじゃーなる
[PR]
by 03musi | 2012-12-30 16:28 | 日記


カテゴリ
試験メモ/VBAエキスパート
マクロ 基礎
マクロ 応用
Excel 基礎
Excel 応用
Office
日記
もくじ

ファン

フォロー中のブログ
初心者のためのOffic...
七里ヶ浜だより Lett...
はじめてのMac-Sup...
初心者のためのOffic...

検索

タグ

その他のジャンル