- ベストアンサー
実行時エラー'1004'で困っています。
少し前にも同じコードの他の点についてアドバイスをいただいたのですが、新たな問題点が生じたので改めて質問させてほしいです。 具体的な問題点が分からなかったのでコードをそのまま載せました。 シート1に値を入力すると、繁殖牛データ。データ。という2個のシートから検索し、リンクをつけたいです。 繁殖牛データシートに入っている値を入力した時は ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'繁殖牛データ'!" & Range(Cells(kennsaku, 3)) データシートに入っている値を入力した時は ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'" & データ & "'!" & Range(Cells(kennsaku, 1)) で「'Range'メソッドは失敗しました:'_Worksheet'オブジェクト」とでます。 試験的にどちらのシートにも入っていない値を入力すると、思惑通りに"見つからないのでリンクは貼りません"と帰ってきます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim kennsaku, y, z If Target.Count > 1 Then Exit Sub 'セルを二つ以上選択した場合 If Target.Value = "" Then Exit Sub 'データが空の場合 If Application.CountIf(Range("A1:Z80"), Target.Value) > 1 Then MsgBox Target.Value & "は既に入力されています", vbOKOnly + vbExclamation Target.Clear Exit Sub End If Set y = Worksheets("繁殖牛データ").Range("$C$1:$C$1003") Set z = Worksheets("データ").Range("$A$1:$A$65536") kennsaku = Application.Match(Target.Value, y, 0) If IsNumeric(kennsaku) Then ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'繁殖牛データ'!" & Range(Cells(kennsaku, 3)) Else kennsaku = Application.Match(Target.Value, z, 0) If IsError(kennsaku) Then MsgBox "見つからないのでリンクは貼りません", vbOKOnly + vbExclamation Exit Sub Else ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'" & データ & "'!" & Range(Cells(kennsaku, 1)) End If End If Range("A1:Z80").Font.Underline = False End Sub
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'繁殖牛データ'!" & Range(Cells(kennsaku, 3)) これはエラーになるよ。 1.sheet名の指定の仕方が変だ。 2.&の後はcellを参照していない。cellの値を参照している。これはhyperlinkをクリックしたときにエラーになる。 ActiveSheet.Hyperlinks.Add Anchor:=Target, Address:="", SubAddress:="繁殖牛データ!" & "R" & kennsaku & "C1" としたいのではないか。 "R" & kennsaku & "C1" は "A" & kennsaku でもいいか。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 解決済みのようではありますが、ちょっと割り込ませていただきます。 >今回は、値を入力した結果を眺めてだいたいの意味を想像した結果、たまたまいきましたが、本やウェブページで学ぶとしたら、何かお勧めはあるでしょうか? Webページには、癖の多いものがあるので、お勧めできませんね。このぐらい書けるレベルにると、書籍のほうがよいです。大村あつしさんの『かんたんプログラミング Excel VBA』(シーリーズ3部)がありますから、辞書代わりに使ってもよいと思います。あまりに内容的に細かすぎるのに難がありますね。最後まで全部理解するのには、1年以上かかってしまいます。全部を覚える必要はありませんが。 ただ、そのコードから受ける印象としては、中級から上級のレベルのもの、つまり、入門編や初級編では歯が立たないと思っているオブジェクトの概念自体を学んだほうが、よりはっきり分かってくると思います。 例えば、Range オブジェクトのCells プロパテイというのは、何年も経っている私自身も、未だにスッキリとして理解しているわけではありません。RangeオブジェクトとCellsプロパティは、親子の関係のようで、他人なのです。今回は、だから反乱を起こしてしまうわけです。 VBAでコードを書く場合は、Rangeの方が、Application という大親との関係は親密です。こんな、説明は訳が分からないと思いますが。 それと、ご質問のコードですが、単に、 SubAddress:="'繁殖牛データ'!" & Cells(kennsaku, 3).Address SubAddress:="'データ'!" & Cells(kennsaku, 1).Address とすればよいのではありませんか?実際に見つけたセルのアドレスとは違いますが、文字化するなら、これで十分のはずです。あえて換えたければ、.Address(1, 1, xlR1C1) とすればよいですが、古い種類のブジェクトでなければ、必要ないと思います。 後は、今回は、問題が発生していないのですが、以下の場所は、イベントが、二重に発生していますから、本来は、 Application.EnableEvents = False Target.Clear Application.EnableEvents = True としたほうがよいです。 >SubAddressのあたりは理解していないです。 こういう瑣末なプロパティについては、私も理解していないです。(^^; しょせん人の作ったオブジェクトですから、こういうのは、決まったように入れるしかありませんね。
お礼
ありがとうございます! 皆さんのおかげで、今作っているファイルもそろそろ完成しそうです。 一通り思惑通りに動くようになったら、さらに理解を深めたいと思っていたのです。本屋に行っても書籍の多さに圧倒されるばかりでなかなか選べないですね。 実は、今回のアドバイスもちんぷんかんぷんです。 薦められた本も参考書の候補に入れて学んでみます。 完成しそうと書きつつも、再び作成中のファイルについて質問するかもしれませんが、その際も気が向いたらアドバイスお願いします。
お礼
SubAddress:="繁殖牛データ!" & "R" & kennsaku & "C3"と SubAddress:="データ!" & "R" & kennsaku & "C1" にしたところうまくいきました。 重複チェックに次いでまたしても助けていただき、本当に感謝しています。 "R" & kennsaku & "C1"の部分はや、SubAddressのあたりは理解していないです。 今回は、値を入力した結果を眺めてだいたいの意味を想像した結果、たまたまいきましたが、本やウェブページで学ぶとしたら、何かお勧めはあるでしょうか?