...

AutoOpenプロパティマクロエクセル

by user

on
Category: Documents
3

views

Report

Comments

Transcript

AutoOpenプロパティマクロエクセル
Excel2000VBA
L e a r n i n g S c h o o l
第
1
日付処理と
コントロールを使
ったマクロの作成
日
応用教室の第 1 日は、オフィスでちょっと使える 2 つの応用マクロを作成します。
1 つは、スケジュールを管理するマクロです。ワークシートに入力した日程が近づ
くと、セルの色を変えて教えてくれるマクロです。もう 1 つは、リストボックスか
ら今日 1 日に食べた食事内容を選択し、それをもとに摂取したカロリー・栄養価を
自動計算して、グラフで栄養素の比率を表示するマクロを作成します。
日付処理とセルの移動、ループによる処理の自動化、グラフをコードから操作する
テクニックを組み合わせているのがポイントです。
今日のレッスンで解説する項目
■ Date 関数による日付の取得
■ 2 つの日付を比較する方法
■ セルの塗りつぶしを使った点滅効果の作成
■ セルの移動による項目の整理
■ Do...Loop ステートメントによるセルの値のチェック
■ 引数と戻り値を持った Function プロシージャを使う
■ For...Each...Next ステートメントを使ったオブジェクトの取得
■ If ステートメントのネスト
■ Cells プロパティを使用した、変数によるセル番地の指定
■ ChartObjects オブジェクトの追加とグラフ要素の設定
■ コンボボックスコントロールの Change イベントの活用
■ ワークシート関数を VBA のコードから使用する
Lesson
1
スケジュール管理マクロの作成
このマクロは、ワークシートに入力したスケジュールの内容と日付を自
動的に読み込んで、セルの色を変えて表示します。
今 回 作 成 す る マ ク ロ
第1日
1 時限目
日付処理とコン
トロールを使っ
たマクロの作成
EXVBA2000
Lesson01
Lesson01.xls
マクロを実行した日の 3 日後の
スケジュールを色別に教えてく
れる
こ の レ ッ ス ン の ね ら い
このレッスンでは、スケジュール管理マクロを作成します。人間、
忙しかったりぼんやりしていると、なにかと物忘れをしがちです。ど
うでもいいようなことなら忘れてもかまいませんが、これが大事な会
議や打ち合わせ、待ち合わせなどであれば、「ついうっかり忘れた」で
はすみません。そこで、ワークシートに入力したスケジュールが近づ
いてきたら、きちんと教えてくれる「備忘録」マクロを作成します。
2
❏ Lesson 1
スケジュール管理マクロの作成
操 作 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
※新しいブックを用意します。VB Editor を起動し、プロジェクトに
「標準モジュール」を挿入します。
新しいブックを作成するには、Excel を起動し、ツールバーの[新規
作成]ボタンをクリックします。
プロジェクトに「標準モジュール」を挿入するには、Excel で[ツー
ル]メニュー→[マクロ]→[Visual Basic Editor]を順にクリッ
クして VB Editor を起動し、[挿入]メニューの[標準モジュール]
をクリックします。
コ ー ド の 記 述 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
3 Module1:(General)-備忘録
Public Sub 備忘録()
Dim
Dim
Dim
Dim
Dim
WS As Object
DiffDate As Integer
MaxRows As Integer, CopyRows As Integer
StartRow As Integer
i As Integer
Set WS = Worksheets(1)
WS.Range("B1") = Date
CopyRows = GetRows(2) + 1
If CopyRows = 0 Then
MsgBox "存在しないワークシートが参照されています"
Exit Sub
End If
StartRow = 3
Do
If WS.Cells(StartRow, 1) = "" Then
MsgBox "予定が入力されていません"
Exit Sub
End If
DiffDate = WS.Cells(StartRow, 1) - WS.Range("B1")
3
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
If DiffDate < 0 Then
With WS.Range(Cells(StartRow, 1), _
Cells(StartRow, 3))
.Copy Destination:=Worksheets(2). _
Cells(CopyRows, 1)
.Delete
End With
CopyRows = CopyRows + 1
End If
Loop While DiffDate < 0
MaxRows = GetRows(1)
If MaxRows = -1 Then
MsgBox "存在しないワークシートが参照されています"
Exit Sub
End If
For StartRow = 3 To MaxRows
DiffDate = WS.Cells(StartRow, 1) - WS.Range("B1")
Select Case DiffDate
Case 3
With WS.Cells(StartRow, 3)
.Value = "当日まであと " & DiffDate & " 日です"
.Interior.ColorIndex = 4
End With
Case 2
With WS.Cells(StartRow, 3)
.Value = "当日まであと " & DiffDate & " 日です"
.Interior.ColorIndex = 6
End With
Case 1
With WS.Cells(StartRow, 3)
.Value = "この予定は明日です"
.Interior.ColorIndex = 7
.Font.ColorIndex = 2
End With
Case 0
With WS.Cells(StartRow, 3)
.Value = "本日の予定です"
For i = 0 To 200
.Interior.ColorIndex = 3
4
❏ Lesson 1
スケジュール管理マクロの作成
.Interior.ColorIndex = 1
.Font.ColorIndex = 2
Next
.Interior.ColorIndex = 3
End With
Case Is >= 4
WS.Cells(StartRow, 3).Clear
End Select
Next
End Sub
3 Module1:(General)-GetRows
Public Function GetRows(ByVal SheetNo As Integer) As Long
Dim i As Long
Dim Result
i = 2
On Error GoTo FAIL
Set WS = Worksheets(SheetNo)
Do
i = i + 1
Result = WS.Cells(i, 1)
Loop While Result <> ""
GetRows = i - 1
Exit Function
FAIL:
'エラー発生の場合は、戻り値「-1」を返す
GetRows = -1
End Function
5
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
解 説 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
1
マクロが起動すると、最初に現在の日付を取得します。次に、ワークシート「予
定表」のセルを順番にサーチし、入力されている日付を 1 つ 1 つ現在の日付と比較し
ます。そして、その日付が現在の日付に対し、3 日前から当日になっていれば、セ
ルの色を塗りつぶすことで、スケジュールが近づいていることを知らせます。
このマクロの動作を整理すると次のようになります。
①ワークシート「予定表」に、スケジュールの内容と日付を順番に入力します。
入力したスケジュール
②マクロを実行します。マクロを実行した現在の日付と、入力されているスケジュ
ールの日付を比較します。
③最初に、すでに日付が過ぎたスケジュールがあるかどうかをチェックします。あ
れば、ワークシート「予定表」から外して、ワークシート「実施記録」に履歴と
して転送しておきます。
すでに実行されたスケ
ジュールは別のワーク
シートに転送
6
❏ Lesson 1
スケジュール管理マクロの作成
④ 3 日後のスケジュールは、セルを緑色で塗りつぶして表示します。
⑤ 2 日後になると、セルを黄色で表示します。
⑥翌日のスケジュールは、セルをマジェンタで表示します。
⑦当日のスケジュールがあると、セルが点滅して赤色で塗りつぶされます。
セルの塗りつぶしでスケ
ジュールが近づいている
ことを知らせる
2
では実際の作成手順を説明していきます。まず、ワークシート「予定表」を、画
面のような様式で作成します。
①セル「A2」にスケジュールの日付を、「B2」にスケジュール内容を、「C3」に予
定までの期限を入力するので、その表題を作成します。
ワークシート
「予定表」
②ワークシート「実施記録」は、実行した予定を記録しておくために使用します。
内容が「予定表」とまったく同じ物を作成します。
ワークシート
「実施記録」
このワークシート「予定表」にスケジュールを入力しますが、このとき以下の要
領で入力するようにします。
7
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
・ワークシート「予定表」に入力されているスケジュールは、空白のセルが間に入
らないように詰めて入力する
・日付は昇順(古い日付から新しい日付の順)で入力する
ランダムに入力されたスケジュールを処理させるには、プロシージャの組み立て
が複雑になるため、今回のマクロでは上記のような条件で処理するように、プロシ
ージャを作成しています。
3
次に、Excel から VB Editor を起動して、標準モジュール「Module1」を挿入しま
す。そしてこのモジュールに、マクロ用のプロシージャ「備忘録」を作成します
(このプロシージャ名は、あとで変更します)。
プロシージャを作成したら、最初に変数の宣言をプロシージャの先頭で行います。
Dim
Dim
Dim
Dim
Dim
WS As Object
DiffDate As Integer
MaxRows As Integer, CopyRows As Integer
StartRow As Integer
i As Integer
それぞれの変数は、以下の目的で使用します。
変数名
目的
WS
ワークシートを格納するオブジェクト変数
DiffDate
2 つの日付の差を格納する
MaxRows
データが入力されているセルの最下行の番号
CopyRows
コピー先セルの行番号
StartRow
検索開始セルの行番号
i
ループ処理のカウンタ用変数
セルの行番号を格納する 3 つの変数は、いずれも Integer(整数)型で宣言してい
る点に注意してください。このデータ型では、最大「32767」行までしか格納できま
せん。これを超える行を使用する場合は(まずありえないと思いますが)、Long 型
で宣言してください。
変数を宣言したら、最初に現在の日付を取得し、ワークシート「予定表」のセル
4 「B1」に代入して表示します。このとき、ワークシート名は、Set
ステートメントで
オブジェクト変数「WS」に格納しておきます。
8
❏ Lesson 1
スケジュール管理マクロの作成
Set WS = Worksheets(1)
WS.Range("B1") = Date
現在の日付を取得するには、Date 関数を使用します。この関数は、実行すると現
在の日付をシステム(Windows)から取得し、返してきます。
どのような形式で返してくるのかは、VB Editor でイミディエイトウィンドウを
表示し、次のように入力してください。
?date
[Enter]キーを押すと、現在の日付が表示されます。
00/01/17
これが、現在システムに設定されている日付の表示形式です。
イミディエイトウィンドウに
表示されたシステムの日付
ワ ン ポ イ ン ト ア ド バ イ ス
ワークシートのセルの書式設定を、この日付の表示形式になるように設定しておか
なくても、このプロシージャではきちんと日付計算が行われます。しかし、見た目が
おかしいのであれば、セルの書式をシステムの表示形式に合わせておくといいでしょ
う。セルの日付の書式設定は、Excel の[書式]メニューの[セル]で行えます。
セルの日付の書式設定
ダイアログボックス
9
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
5
今度は、ワークシート「実施記録」に、どこまで実施済みのスケジュールが入力
されているのか、入力済みのセル範囲を求めます。ここでは、専用の Function プロ
シージャ「GetRows」を作成して、引数にワークシートの番号を与えて実行すると、
入力されている最大行の番号を返すようにしています(この Function プロシージャ
GetRows は、あとで説明します)。
ワークシート「実施記録」に、何行までスケジュールが入力されてるのかを把握
します。この時、コピー先の行番号を求めるため、入力範囲の最下行の次の番号を
変数「CopyRows」に格納します。
CopyRows = GetRows(2) + 1
この GetRows プロシージャの引数に、存在しないワークシート番号を設定したり、
設定したワークシートが削除されてしまった場合は、「GetRows」は「-1」を返して
きます。この場合は、以降のコードは実行できませんから、エラーのメッセージを
表示して、プロシージャの実行を中止します。
If CopyRows = 0 Then
MsgBox "存在しないワークシートが参照されています"
Exit Sub
End If
そして、変数「StartRow」に、実際にデータが入力されている範囲の先頭の行番
号「3」を代入しておきます。
StartRow = 3
6
2 つのワークシートの、入力されているセル範囲が把握できたら、まず現在の日
付よりも古い日程をチェックし、ワークシート「実施記録」に転送します。チェッ
クは、Do...Loop ステートメントを使用します。
最初に、予定がきちんとワークシートに入力されているかどうかをチェックしま
す。これは、セル「A3」の値をチェックし、もし空白であればスケジュールが入っ
ていないので、ここでこのプロシージャを終了させます。
Do
If WS.Cells(StartRow, 1) = "" Then
MsgBox "予定が入力されていません"
Exit Sub
End If
10
❏ Lesson 1
スケジュール管理マクロの作成
次に、日付の差をチェックします。セルに日付が入力されてる場合は、直接セル
の値を引き算すれば、日付の差を把握できます。現在の日付は先にセル「B1」に転
送してありますから、入力されている最初のスケジュールの日付を取り出して引き
算し、結果を変数「DiffDate」に格納します。たとえば、現在の日付が「2000/3/19」
で、入力されている最初のスケジュールが「2000/3/3」であれば、変数「DiffDate」
には「-16」が格納されます。入力されているスケジュールが「2000/1/3」であれば、
変数「DiffDate」には「-76」が格納されます。
DiffDate = WS.Cells(StartRow, 1) - WS.Range("B1")
ワ ン ポ イ ン ト ア ド バ イ ス
この日付計算であれば、各月ごとの 1 か月の日数の違いもきちんと計算されます。
7
日付のチェックができたら、現在の日付よりも古いスケジュールだけを、ワーク
シート「実施記録」に転送します。
まず、If ステートメントを使って、変数「DiffDate」の値が「0」未満であるかど
うかを調べます。もし、「0」未満であれば、それは現在よりも前の日付なので、古
いスケジュールになります。
そのスケジュールのある行を、Range オブジェクトの Copy メソッドで、もう 1 つ
のワークシートの、入力可能な最初の行にコピーします。このとき、コピー元とコ
ピー先の行番号の指定に、すでに入力済みセル範囲を把握して行番号が代入されて
いる、変数「StartRow」と「CopyRows」を使用します。
If DiffDate < 0 Then
With WS.Range(Cells(StartRow, 1), _
Cells(StartRow, 3))
.Copy Destination:=Worksheets(2). _
Cells(CopyRows, 1)
現在よりも古いスケジュール
がワークシート「実施記録」
にコピーされる
11
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
8
コピーが終了したら、Range オブジェクトの Delete メソッドを使って、古いスケ
ジュールを削除します。
.Delete
ここで注意するのは、Excel では行が削除されると、以降の行がその行まで繰り
上がってしまうことです。この行の移動を計算に入れておかないと、これからのス
ケジュールまでも削除してしまいます。
この行が削除される
と...
5 行目以降が上に詰
められてしまう
削除したら、コピー先の行番号を 1 つ増やし、次のコピーに備えます。
CopyRows = CopyRows + 1
そして、変数「DiffDate」の値が引き続き「0」未満の値であれば、もう一度 3 行
目をチェックし、古いスケジュールであれば、コピーと削除の処理を繰り返します。
Loop While DiffDate < 0
行が削除されると、以降の行が繰り上がってきますから、このループは常に 3 行
目の日付だけをチェックすることになります。こうして、現在以前の古い日付が入
ったスケジュールだけを、ワークシート「実施記録」に転送します。
12
❏ Lesson 1
9
スケジュール管理マクロの作成
古いスケジュールの転送が終了したら、今度はこれからのスケジュールのチェッ
クを行います。
すでに古いスケジュールは削除されていますから、今後の予定は 3 行目から始ま
っています。そこで、再度 Function プロシージャ「GetRows」を使用して、入力済
みセル範囲を把握し直します。そして、存在しないワークシートを参照した場合に
備えて、エラー処理を組み込んでおきます。
MaxRows = GetRows(1)
If MaxRows = -1 Then
MsgBox "存在しないワークシートが参照されています"
Exit Sub
End If
入力済みセル範囲
入力されている最下行の行番号を取得したら、これを使って For...Next ループを
実行し、現在の日付と入力されているスケジュールの日付の差を求めます。
For StartRow = 3 To MaxRows
DiffDate = WS.Cells(StartRow, 1) - WS.Range("B1")
そして、Select Case ステートメントを用いて、日付の差で処理を分岐します。
まず、変数「DiffDate」の値が「3」であれば(すなわち 3 日前であれば)、スケ
ジュールの内容が入力されているセルの隣のセルを緑色に塗りつぶし、「当日まであ
と 3 日です」という表示をします。
Select Case DiffDate
Case 3
With WS.Cells(StartRow, 3)
.Value = "当日まであと " & DiffDate & " 日です"
.Interior.ColorIndex = 4
End With
13
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
変数「DiffDate」の値が「2」であれば、「当日まであと 2 日です」という表示を、
「1」であれば「この予定は明日です」という表示をします。なお、「この予定は明日
です」という表示のあるセルは、マジェンタで塗りつぶしますから、Font オブジェ
クトの ColorIndex プロパティを使って、文字色を白色に変えて見やすくしていま
す。
Case 2
With WS.Cells(StartRow, 3)
.Value = "当日まであと " & DiffDate & " 日です"
.Interior.ColorIndex = 6
End With
Case 1
With WS.Cells(StartRow, 3)
.Value = "この予定は明日です"
.Interior.ColorIndex = 7
.Font.ColorIndex = 2
End With
そして、「DiffDate」の値が「0」であれば、もう 1 つ For...Next ループを使って、
セルの背景色を赤色(3)と黒色(1)で交互に塗りつぶす処理を行い、セルが点滅
するような効果を与えています。
Case 0
With WS.Cells(StartRow, 3)
.Value = "本日の予定です"
For i = 0 To 200
.Interior.ColorIndex = 3
.Interior.ColorIndex = 1
.Font.ColorIndex = 2
Next
.Interior.ColorIndex = 3
End With
入力されている日付が、現在よりも 4 日以上差があれば、「予定までの期限」のセ
ルの内容をクリアします。これは、前の表示が残っていた場合に、これを削除する
ためです。
Case Is >= 4
WS.Cells(StartRow, 3).Clear
14
❏ Lesson 1
スケジュール管理マクロの作成
ワ ン ポ イ ン ト ア ド バ イ ス
このとき、Case 節で変数「DiffDate」の値を比較するのに、「Is」演算子を使って
います。
Is 演算子は、2 つのオブジェクト変数を比較する演算子で、Case 節で条件に設定
した式の値を比較する場合は、Is 演算子と組み合わせて使用します。
VB Editor では、「Case >= 4」と入力すると、Enter キーを押した時点で自動的
に「Is」という文字が入力されます。
このループは、変数「StartRow」の値が、「3」から「MaxRows」に達するまで
繰り返されます。すなわち、入力されている今後のスケジュールすべてに対し、こ
の日付のチェックと表示が行われます。
そして、現在の日付よりも 3 日前から、日付ごとに別々の表示がされ、スケジュ
ールが近づいていることを知らせてくれます。
3 日前から日付ごとに
別々の表示がされる
10
今度は、ワークシートに入力されているセル範囲を取得する Function プロシージ
ャ「GetRows」を作成します。そこで、このプロシージャを作成する前に、
「Function プロシージャ」について説明しておきます。
Function プロシージャとは、実行するとある値を返してくるプロシージャのこと
で、「関数」と同じような動作をします。
「Sub」プロシージャは、処理を 1 つのルーチンにまとめて実行したり、あるいは
引数を持たせて実行することができますが、実行した結果を値として返してくるこ
とはできません。
これに対し、Function プロシージャは、引数を持つことができ、更に実行結果を
戻り値として返すように設定できます。
Function プロシージャを作成する場合は、「Function」ステートメントを使用し
て、以下のように記述します。
15
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
【Function プロシージャの使い方】
Public Function FuncName(ByVal Var As Integer) As Long
End Function
Public
Function プ ロ シ ー ジ ャ の 有 効 範 囲 ( ス コ ー プ ) を 指 定 し ま す 。
「Public」を指定すると、すべてのモジュールのすべてのプロシージ
ャから参照可能になります。Private は、モジュール内のすべてのプ
ロシージャから参照可能になります。
Function
必ず「Function」ステートメントを記述します。「Sub」ではありま
せんから注意してください。
FuncName
Function プロシージャの名前を記述します。変数の名前付き規則に
従って作成します。
ByVal Var As Integer
引数がある場合は、ここに引数リストを記述します。引数を実データ
で渡す場合は「ByVal」を、参照渡しの場合は「ByRef」を変数の先
頭につけ、変数のデータ型を記述します。ここで宣言することで、引
数の変数をプロシージャ内部で使用できるようになります。
As Long
この Function プロシージャはどういう値を返すのか、戻り値のデー
タ型を指定します。
End Function
11
Function プロシージャは必ず「End Function」で終了します。
このマクロでは、Function プロシージャを使用して、引数に設定した番号のワー
クシートの、すでに入力されているセル範囲をチェックして、範囲の最下行の行番
号を返してくるような Function プロシージャを作成します。
まず、セルの行番号を格納する変数「i」を宣言し、「2」を代入して初期化してお
きます。これは、いずれのワークシートも、行番号「3」からデータの入力が始まっ
ているためです。また、セルの値を格納する変数「Result」を、データ型指定なし
で宣言します。なぜなら、セルの値が数値なのか文字列なのか、どんな値が格納さ
れるのかわからないので、データ型は指定しないでおきます。
Public Function GetRows(ByVal SheetNo As Integer) As Long
Dim i As Long
Dim Result
i = 2
次に、Set ステートメントで、ワークシートをオブジェクト変数に格納しておき
ます。このとき、Worksheets プロパティの引数には、ワークシート名でなく番号を
入力するようにします。このワークシート番号は、プロシージャの引数から受け取
16
❏ Lesson 1
スケジュール管理マクロの作成
ります。
もし、存在しないワークシート番号が引数に与えられると、Set ステートメント
はオブジェクトを変数に格納できないため、エラーを発生します。これに備えて、
Set ステートメントの前に、On Error GoTo ステートメントを記述し、エラー発生
時はラベル「FAIL」に処理をジャンプさせます。
On Error GoTo FAIL
Set WS = Worksheets(SheetNo)
次に、Do...Loop ステートメントで、セルに値があるかどうかをチェックします。
変数「i」で行番号 3 番から順番に、セルの値を変数に入れます。セルの値が「""」
(空白)であれば、そこがセル範囲の次の行なので、ここでループを終了させます。
Do
i = i + 1
Result = WS.Cells(i, 1)
Loop While Result <> ""
12
変数「i」の値は、空白のセル行までカウントしていますから、
「1」を差し引けば、
その数字が入力済みのセル範囲の最下行になります。この行番号を、Function プロ
シージャの戻り値として返すようにします。
戻り値をプロシージャ内に設定するには、Function プロシージャの名前と同じ名
前の変数に、返す値を代入します。このプロシージャでは、
「GetRows」がプロシー
ジャ名ですから、これと同じ名前の変数に、行番号を代入します。
戻り値用の変数は、プロシージャ内に宣言する必要はありません。また、変数の
データ型は、プロシージャの宣言時に、
「As Long」と戻り値のデータ型をいっしょ
に宣言しています。
これで、この Function プロシージャが正常に実行されると、行番号が返されま
す。
GetRows = i - 1
Exit Function
また、Set ステートメントの前に、On Error GoTo ステートメントを記述してい
ますので、ここで正常な処理を終了させるために、「Exit Function」を記述してお
きます。くれぐれも、「Exit Sub」ではありませんから、注意してください。
そして、最後に、On Error GoTo ステートメントのジャンプ先である、ラベル
FAIL の処理を作成します。通常のエラー処理であれば、メッセージボックス関数
にエラー番号とエラーメッセージをセットして、プロシージャを終了させます。
17
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
FAIL:
MsgBox Error(Err.Number)
End Function
しかし、Function プロシージャの場合は、このプロシージャでマクロを終了させ
てしまうと、この Function プロシージャの戻り値を使って処理を組み立てている次
のコードが、エラーになってしまいます。具体的にはプロシージャ「備忘録」の次
のコードの部分です。
MaxRows = GetRows(1)
For StartRow = 3 To MaxRows
エラー処理がない場合は、
「GetRows」でプロシージャの実行を中止してしまうと、
「GetRows」の戻り値がないため、次の「For StartRow = 3 To MaxRows」までが
エラーになってしまいます。
エラー処理を実行したために次の行がエラーになる、という変な処理ができ上が
ってしまうので、これを回避するため、
「GetRows」内でエラーが起きた場合は、エ
ラー用の戻り値を用意して、
「GetRows」を実行した時点で(すなわちマクロ用のプ
ロシージャ内で)、エラーの対策を実行するようにします。
このプロシージャでは、エラーの場合の戻り値を「-1」に設定して、プロシージ
ャを終了させます。
FAIL:
GetRows = -1
End Function
13
以上で、マクロ「備忘録」の完成です。付録ディスクに収録してあるワークシー
トに、サンプルの日程を入れてありますので、日付を変えてマクロを実行してくだ
さい。現在の日付から 3 日以内に実行されるスケジュールは、色が塗られて表示さ
れます。
マクロがきちんと動作したら、せっかくですから毎日 Excel を起動したときに、
このマクロを動作させてスケジュールチェックをするようにしましょう。手順は、
至って簡単です。
①まず、マクロ用プロシージャ「備忘録」の名前を、「AUTO_OPEN」に変更しま
す。この名前のプロシージャは、ブックが開くと自動的に実行されます。
②次に、このブックを保存して Excel を終了します。そして、ブックのショートカ
ットを作成して、Excel をインストールしたフォルダにある「XLStart」というフ
ォルダに入れます。
18
❏ Lesson 1
スケジュール管理マクロの作成
フォルダ「XLStart」
これで、Excel を起動するたびに、このブックが読み込まれ、マクロ
「AUTO_OPEN」が自動実行されます。
コンピュータが起動するたびに、このブックを実行したい場合は、ショートカッ
トを[スタート]メニューに入れます。
レ ッ ス ン の ま と め
Date 関数による日付の取得と、セルに入力されている日付との計算は、意外と簡
単にできます。また、データを比較しその結果で処理を振り分けるのは、VBA ならで
はの処理です。日付の関数以外にも、ワークシート関数の日付処理関数を組み合わせ
れば、いろいろな業務処理に応用できると思います。
Function プロシージャでは、エラーの場合の戻り値をきちんと設定し、マクロプ
ロシージャ全体でどういうエラー処理を組み立てていくのかを考える必要があるでし
ょう。
今回は、セルの点滅表示に、For...Next ループを使いました。この方法だと、処理
速度の速いコンピュータでは、点滅が一瞬で終わってしまう場合があります。
Excel VBA では、Visual Basic が持っているタイマーコントロールを使えないの
で、タイマーコントロールを内蔵した ActiveX コントロールを作成するか、
Win32API を呼び出すなどの他の処置が必要になります。
練 習 問 題
Q1
レッスンで作成したブックに、ブックを閉じると自動的に上書き保存
して終了するような処理を追加してください。
解答は巻末に→
19
❏ 第 1 日 1 時限目 日付処理とコントロールを使ったマクロの作成
Fly UP