マクロで操作するセルをユーザーに選択してもらうには、いくつかの方法があります。
たとえば「選択してからマクロを実行してもらう」のでしたら、次のようにSelectionを使えばいいでしょう。
ここでは、文字の太字(ボールド)を反転する例で解説します。
Sub Sample1()
Dim Target As Range
For Each Target In Selection
Target.Font.Bold = Not Target.Font.Bold
Next Target
End Sub
ユーザーが、Ctrlキーを押しながら選択した非連続のセル範囲でも対応できます。
あるいは「マクロを実行してから選択してもらう」のでしたら、たとえば、次のような方法が考えられます。
Sub Sample2()
Dim Target As Range, SelectCell As Range
On Error Resume Next
Set SelectCell = Application.InputBox _
("対象セルを選択してください", Type:=8)
If Err.Number <> 0 Then Exit Sub ''[キャンセル]ボタンがクリックされた
For Each Target In SelectCell
Target.Font.Bold = Not Target.Font.Bold
Next Target
End Sub
では、前回ユーザーが選択したセルを覚えておくには、どうしたらいいでしょう。
普通に考えれば、ユーザーがセルを選択したセルを処理した直後あたりで、どこかに記録しておけばいいですね。
モジュールレベル変数に格納しておくと、何かのタイミングでクリアされるかもしれませんから、作業用シートのセルとか、あるいはレジストリやテキストファイルに書き込んでおけば、消える心配もありません。
もちろん、それらの方法でもいいですが、今回はちょっと変わった方法を紹介します。
セルに印をつけておくやり方です。
ここでは便宜的に、セル範囲A1:E20にデータが入力されていて、任意の複数セルをユーザーが選択するものとします。
RangeオブジェクトにはIDプロパティというプロパティがあります。
IDプロパティは、ワークシートをWebページとして保存するとき、ハイパーリンクの参照先ターゲットを設定するプロパティです。
HTMLでいうNameタグのような機能です。
ワークシートをWebページとして保存しないのなら、このIDプロパティは通常では使用されません。なので、せっかくですから有効活用しましょう。
Sub Sample3()
Dim Target As Range, SelectCell As Range
On Error Resume Next
Set SelectCell = Application.InputBox _
("対象セルを選択してください", Type:=8)
If Err.Number <> 0 Then Exit Sub ''[キャンセル]ボタンがクリックされた
For Each Target In SelectCell
Target.Font.Bold = Not Target.Font.Bold
Target.ID = "Selected"
Next Target
End Sub
上のSample3は、先のSample2と同じように、ユーザーが選択したセルの太字属性を反転させます。
そのとき、反転させたセルのIDプロパティに文字を書き込みます。
前回ユーザーが選択したセルを再利用するには、次のようなマクロを使います。
Sub Sample4()
Dim c As Range, buf As String
For Each c In Range("A1:E20")
If c.ID = "Selected" Then
buf = buf & c.Address & ","
c.ID = ""
End If
Next c
If buf <> "" Then
buf = Left(buf, Len(buf) - 1)
Range(buf).Select
MsgBox "前回選択されたセルは" & buf & "です"
End If
End Sub
データが入力されているセル範囲A1:E20内のセルを1つずつチェックしてIDプロパティに"Selected"という文字が書き込まれているかを調べます。
見つかった場合、ここではIDプロパティをクリアしています。
ぜひ、実際にマクロを実行して動作を確認してください。
なお、IDプロパティの値は、通常のブック形式では保存されません。
ブックを開いている間は有効ですが、ブックを閉じると消えてしまいます。