
エクセルのセル範囲(結合セル)にいろいろな名前を定義してあります。
名前の定義されたセル範囲を変更した場合、マクロが動くようにしたいのです。
ところが、名前の定義のないセルを変更すると
「実行時エラー1004、アプリケーション定義またはオブジェクトの定義のエラーです」
になってしまいます。
一応、下記のような方法で解決はできましたが、エラーで判断するのではなく、名前の定義の有無を取得して分岐させるのが正しい?やりかたなのではと思います。
ご教示いただけましたら幸いです。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As String
On Error Resume Next
x = Target.Cells(1).Name.Name
On Error GoTo 0
If x = "" Then Exit Sub
Select Case Target.Cells(1).Name.Name
Case "住所"
Range("送付先住所").Value = Target.Value
Case "氏名"
Range("送付先氏名").Value = Target.Value
End Select
End Sub
No.1ベストアンサー
- 回答日時:
エラーで判断するのが正しいやり方ではないなどとは言えないと思います。
それで安全に動けばいいのではないですか。
nameを調べるなら、全部のnameにあたるしかないでしょう。
次のようなコードでどうでしょう。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As String, ad As String, lad As Integer
ad = Target.Address
lad = Len(ad)
For Each nm In ActiveWorkbook.Names
If ad = Right(nm.RefersTo, lad) Then
x = Target.Name
End If
Next
If x = "" Then Exit Sub
Select Case Target.Name.Name
Case "住所"
Range("送付先住所").Value = Target.Value
Case "氏名"
Range("送付先氏名").Value = Target.Value
End Select
End Sub
さっそくありがとうございます。
全部の「名前の定義」に総当りしなければいけないということは、ある任意のセルに名前が定義されているかどうかを直接取得する方法はないということなのでしょうか。
No.4
- 回答日時:
>「名前の定義」の有無を取得
するわけではないですが、提示の例題に限って言えば、
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
With Target
Select Case True
Case Not Intersect(.Item(1), Range("住所")) Is Nothing
Range("送付先住所").Value = .Value
Case Not Intersect(.Item(1), Range("氏名")) Is Nothing
Range("送付先氏名").Value = .Value
End Select
End With
Application.EnableEvents = True
End Sub
このように、とにかくIntersectメソッド実行してNothing判定という方法もあるかもしれません。
ただ、
Range("住所")とRange("氏名")を含めたセル範囲を同時に選択してクリアしたり、
などはどういう対応になりますか?
そのケースも考慮するなら、
それぞれIntersectメソッドの結果を取得して処理する必要があります。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Application.EnableEvents = False
Set r = Intersect(Target, Range("住所"))
If Not r Is Nothing Then
Range("送付先住所").Value = r.Value
End If
Set r = Intersect(Target, Range("氏名"))
If Not r Is Nothing Then
Range("送付先氏名").Value = r.Value
End If
Application.EnableEvents = True
End Sub
でも提示のケースはあくまで例題なのですよね?
それだけの用途なら関数をセットしておくほうが簡単な気がします。
No.2
- 回答日時:
以下の様な記述でもいいです。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As String
Dim N As Name
For Each N In ActiveWorkbook.Names
If Not Intersect(Target, Range(N.RefersToLocal)) Is Nothing Then
x = N.Name
Exit For
End If
Next N
If x = "" Then Exit Sub
Select Case x
Case "住所"
Range("送付先住所").Value = Target.Value
Case "氏名"
Range("送付先氏名").Value = Target.Value
End Select
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大学の事務に書類を渡しに行っ...
-
郵便局で郵便物を出すときに 備...
-
どこの郵便局から出したか、わ...
-
封筒を折っても、定形郵便扱い...
-
A4サイズの封筒を半分に折って...
-
職場の先輩からもらったタクシ...
-
退職済みの社員宛てに届く郵便...
-
切手にセロテープを貼ってしまった
-
さきほど電車で飲み物をこぼし...
-
届いた郵便物を差出人に返すこ...
-
友達の家の住所に自分の名前宛...
-
「おせんにキャラメルー」のあ...
-
封筒にシールや紙を貼っていい...
-
通学定期は途中の区間まででも...
-
証紙切手引受とは切手を貼って...
-
窓口発送の場合は切手は貼らな...
-
転送届けを出した状態で転送不...
-
電車で吐く人なぜ多い?
-
佐川急便の配達員があり得ない...
-
郵便受けのない家への郵便配達
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大学の事務に書類を渡しに行っ...
-
郵便振込の「依頼人」欄の内容
-
お店等で氏名・住所を書かされ...
-
VBAでセル範囲の「名前の定義」...
-
高校願書の保護者欄記入につい...
-
ネット友達に個人情報を教えて...
-
メルカリについて。 「本人情報...
-
その人がまだその住所に住んで...
-
オークションで定形外でお願い...
-
意見する場合、名前を名乗らな...
-
夜行バスなどのオンライン予約...
-
カードを作るのに現住所と本籍...
-
社会と情報のテストで、学園祭...
-
封筒を折っても、定形郵便扱い...
-
切手は余分に貼ってもいいもの...
-
どこの郵便局から出したか、わ...
-
郵便局で郵便物を出すときに 備...
-
退職済みの社員宛てに届く郵便...
-
証紙切手引受とは切手を貼って...
-
友達へ手紙を送りたいのですが...
おすすめ情報