1−5 作ったマクロを使いやすくする |
前回、記録して作成したマクロをよく見てみましょう。内容は、以下に示すようなものでした。
Sub ドロップ1_Change()
'
' ドロップ1_Change Macro
'
Sheets("DB").Select
Range("B2").Select
Selection.Copy
Sheets("Sheet1").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Subまず1行目は、「DB」シートに移動するコード。
2行目でセルB2をアクティブセルにして、3行目でセルのデータをコピーします。
4行目では「Sheet1」に戻ってきて、5行目でB3セルをアクティブセルにします。
6行目はわかりずらいですが、形式を指定して貼り付け(値の貼り付け)を行います。
(なお、コンポボックスはドロップダウンリストボックスとも言います。ドロップ1_Change()というのは、ドロップダウンリストボックスのテキスト部分が変更された時に実行されるマクロということです。−つまり値が変わらないとマクロは起動されません。)
ここで、このRangeプロパティについて考えてみます。2行目と3行目で行っていることは つまり「DB」シートの「B2」セルの内容を取得することです。これをもっと別なコードで書き換えられないでしょうか?VisualBasicの編集画面で Rangeプロパティのヘルプを参照してみます。Rangeを選択してF1キーを押し下げると説明が見れます。ここで、関連項目を調べると、WorksheetオブジェクトとRangeプロパティを使用すると良いのではないかと思います。そこで、このマクロの1行目に値の取得をテストする目的で
MsgBox Worksheets("DB").Range("B2").Value
を挿入してみます。Msgboxは指定の値をポップアップで表示させてくれるので どのような値になるかわかります。
Sheet1でコンボボックスの内容を変更してみると、変更した内容がメッセージとして表示され、値が取得出来ることがわかります。次に、この選択した値をどこに貼り付けるかを考えてみましょう。シートには必ず一つ以上のアクティブなセルが存在します。このアクティブなセルに 値を入れられないでしょうか?
それを実現するのは、Activecell.Valueプロパティです。つまり、Sheet1(家計簿のあるワークシート)の選択しされたセルにコンボボックスの値を入れるのは 次の命令であることがわかります。Sub ドロップ1_Change()
'
' ドロップ1_Change Macro
'
ActiveCell.Value = Worksheets("DB").Range("B2").Value
End Sub上に示した記録によって作成されたマクロは、1行で置き換えられ しかも家計簿シートの選択されたセルに自動的に書き込まれるように直すことが出来ました。自動で記録されるマクロは 確かに便利です。コマンドなど一切わからなくても ある程度のマクロが書けてしまうからです。でも、少し手を加えれば、もっと便利に出来るものなのです。大いに利用しましょう。
ところで これで完璧なのでしょうか?ちょっと待ってください。データを入力する人が 必ずB列の特定行がアクティブな状態でコンボボックスを選択してくれるでしょうか?既に入力したデータを誤って書き換えてしまったりはしないでしょうか?
次は、そんな疑問に対する答えを書いてみます。