Excelのマクロで、Private Sub Worksheet_Change(ByVal Target As Range)の部分を実行すると、「オブジェクト変数またはwithブロック変数が設定されていません」というエラーが出る。Targetをプロシージャをまたいで使用する方法について質問。
試した2つの方法の内訳と正常動作の結果について説明。
他にもTargetをプロシージャをまたいで使用するための一般的な手法について教えてほしい。
Excel 関数をまたいだTargetの使用
excel2013 OS はwindows8を使用しています。
Excelのマクロで、以下のコードについて質問です。(コード内の・・・は省略の意)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ・・・・・・・
・
・
If Target.Value = ・・・・・
Call myfunction
End If
End Sub
Sub myfunction()
If 条件 Then
Target.Offset(0,1).Value = "aaa"
End If
End Sub
このマクロのPrivate Sub Worksheet_Change(ByVal Target As Range)を実行するとエラーが
出ます。エラーの内容は「オブジェクト変数またはwithブロック変数が設定されていません」
となり、 Target.Offset(,1).Value = "aaa" の行が黄色く表示されます。
myfuncton内で使用しているTargetが何なのかがわからないというエラーだと理解しています。
そこで私は以下の2つを試しました。
1つめはうまくいかず、2つめは何か2度手間のような感じがするのですが、正常動作する
ようです。
そこで質問なのですが、Targetをプロシージャをまたいで利用したい場合に一般的に用いら
れている手法などがあれば教えて頂きたいです。
1つめ・・Targetをプロシージャをまたいで使えるようにコードの一番上の部分
、つまり、Private Sub Worksheet_Change(ByVal Target As Range)の一行上の
部分にDim Target As Range と宣言してみました。が、これはうまくいきませんでした。
2つめ・・適当な(この場合e)変数を宣言し、プロシージャをまたいで使用する。
Dim e As Range
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ・・・・・・・
・
・
If Target.Value = ・・・・・
Set e = Target
Call myfunction
End If
End Sub
Sub myfunction()
If 条件 Then
e.Offset(0,1).Value = "aaa"
End If
End Sub
以上何か良い方法があれば教えて頂きたいです。また不明な点があれば
ご質問ください
Priavateで宣言する必要はありません。
myfunctionを呼び出すときに引数付にすればよいです。
以下の様にすればよろしいかと思います。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ・・・・・・・
・
・
If Target.Value = ・・・・・
Call myfunction(Target)
End If
End Sub
Sub myfunction(Target As Range)
If 条件 Then
Target.Offset(0, 1).Value = "aaa"
End If
End Sub
お礼
ありがとうございました。このような方法があったのですね!初めて知りました。今後の役にも立ちそうです。