プロが教えるわが家の防犯対策術!

エクセルのマクロで、標準モジュール1に下記のようなコードを記述し、
各シートから「call 住所等自動分割()」を呼び出してみましたが、
実行時に「オブジェクトが必要です。」とエラーが出てしまい、
デバッグを実行ボタンを押したところ「If Intersect(Target, ActiveSheet.Range("AD3:AD303")) Is Nothing Then」部分でエラーが出ていました。
調べてみましたが、解決用法がわかりません。
お力をお貸しください。
シートは1月から12月までの、12シートあります。
--------------------------------------------------

Public Sub 住所等自動分割()
Dim tmp() As String
Dim d As Integer

If Intersect(Target, ActiveSheet.Range("AD3:AD303")) Is Nothing Then
'Exit Sub
Else

For d = 3 To 303
If Cells(d, "AD") = "" Then
Exit For
Else


tmp = Split(Cells(d, "AD"), vbLf)
If UBound(tmp) >= 6 Then

Application.EnableEvents = False

'Cells(行, 列)

Cells(d, "AD") = Mid(tmp(5), 2, 7) '郵便番号
Cells(d, "AE") = tmp(6) '住所
Cells(d, "AG") = tmp(2) '氏名

Application.EnableEvents = True
End If

End If

Next d

End If
End Sub


--------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

Call 住所等自動分割

End Sub

A 回答 (2件)

こんにちは



>実行時に「オブジェクトが必要です。」とエラーが出てしまい、
直接の原因は、変数 Target がいきなり未定義で使用されているからです。
(それぞれのプロシージャは、基本的に独立していますので、共通変数を宣言していない限りは明示的に受け渡す必要があります。)

ChangeイベントのTargetを受け渡したいのではないかと想像しますので、
・「住所等自動分割側」は引数を受け取れる形式にする。
・呼び出し側からは、引数を渡すようにする。
のようにすれば宜しいと思います。


なお、ご質問には直接関係がありませんけれど・・
もしも、各シートで同じ処理を行いたいのであるなら、それぞれのシートに記述しなくても、ThisWorkbookモジュールの SheetChange イベントに記述することで、全シートに対しての処理をまとめて記述することが可能です。
(除外するシートがあるような場合には、その内容を追記する必要はありますけれど)
そうすることで、各シートモジュールに同じ内容を何度も記述しなくても済むようになるでしょう。
    • good
    • 1
この回答へのお礼

無事解決しました。
標準モジュールの呼び出される側に
Public Sub 住所等自動分割(ByVal Target As Range)と記述し
呼び出す側に
Private Sub Worksheet_Change(ByVal Target As Range)
Call 住所等自動分割(Target)
End Sub
と記述したところ無事に動きました。
ありがとうございます!

お礼日時:2022/09/10 22:27

Intersectの使い方は、下記のサイトに分かりやすく書かれています。


http://officetanaka.net/excel/vba/tips/tips118.htm

エラーが出ている箇所ですと、TargetとActiveSheet.Range("AD3:AD303")の重なるセルが無いとき、Nothingを返します。

しかし、住所等自動分割マクロでは、Targetに何も入れていないため、エラーになっています。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/09/10 22:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています