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

少し前にも同じコードの他の点についてアドバイスをいただいたのですが、新たな問題点が生じたので改めて質問させてほしいです。
具体的な問題点が分からなかったのでコードをそのまま載せました。

シート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

A 回答 (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
でもいいか。
    • good
    • 0
この回答へのお礼

SubAddress:="繁殖牛データ!" & "R" & kennsaku & "C3"と
SubAddress:="データ!" & "R" & kennsaku & "C1"
にしたところうまくいきました。

重複チェックに次いでまたしても助けていただき、本当に感謝しています。
"R" & kennsaku & "C1"の部分はや、SubAddressのあたりは理解していないです。
今回は、値を入力した結果を眺めてだいたいの意味を想像した結果、たまたまいきましたが、本やウェブページで学ぶとしたら、何かお勧めはあるでしょうか?

お礼日時:2008/03/13 00:56

こんにちは。



解決済みのようではありますが、ちょっと割り込ませていただきます。

>今回は、値を入力した結果を眺めてだいたいの意味を想像した結果、たまたまいきましたが、本やウェブページで学ぶとしたら、何かお勧めはあるでしょうか?

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のあたりは理解していないです。

こういう瑣末なプロパティについては、私も理解していないです。(^^; しょせん人の作ったオブジェクトですから、こういうのは、決まったように入れるしかありませんね。
    • good
    • 0
この回答へのお礼

ありがとうございます!
皆さんのおかげで、今作っているファイルもそろそろ完成しそうです。

一通り思惑通りに動くようになったら、さらに理解を深めたいと思っていたのです。本屋に行っても書籍の多さに圧倒されるばかりでなかなか選べないですね。

実は、今回のアドバイスもちんぷんかんぷんです。
薦められた本も参考書の候補に入れて学んでみます。

完成しそうと書きつつも、再び作成中のファイルについて質問するかもしれませんが、その際も気が向いたらアドバイスお願いします。

お礼日時:2008/03/13 18:09

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