[[20200730114154]] 『VBAで自動生成したハイパーリンクが効かない』(dk22) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAで自動生成したハイパーリンクが効かない』(dk22)

こんにちは。

VBAでSheet1からSheet2へのハイパーリンクを自動生成したいのですが、
リンクが機能しません。

Found_1,Found_2はFindメソッドで特定の文字列を検索し、その文字列が存在するセルをAnchor,Adressに指定しています。

どなたかご伝授お願いします。

//コード

With Worksheets("Sheet1")

.Hyperlinks.Add Anchor:=.Range("B" & Found_1.Row), Address:=Worksheets("Sheet2").Range("A" & Found_2.Row)

End With

< 使用 Excel:Excel2019、使用 OS:Windows10 >


別シートへのハイパーリンクなら、Addressは空欄を指定して、SUbAddressに "シート名!A1" のように文字列指定では?
(???) 2020/07/30(木) 12:00

回答ありがとうございます。

リンク先のセルは不定なので、A1のように文字列指定はできません。
SubAddressでRangeメソッドやCellsメソッドを使ってリンク先を指定することはできないのでしょうか?
(dk22) 2020/07/30(木) 13:11


文字列指定はできない、って、既に「"A" & Found_2.Row」のように文字列指定してるじゃないですか?

セルが可変、といっても、飛び先のシートはSheet2固定ですよね? シート名だけ固定で、セル位置は現状通り & でくっつければ良いだけでしょう?

RangeやCellsはオブジェクトであり、メソッドじゃないですし、何か大きな勘違いをしているように思えます。
(???) 2020/07/30(木) 13:48


 ■ ハイパーリンク先の指定はRangeで代用できるか → (結論)できません。
 すでに指摘いただいているとおりです。

 HyperlinksオブジェクトのAddメソッドの引数は
 ヘルプによると、
 ・Addressが String型と規定されていることから、
 ・SubAddressはVariant型とされているものの、
   実質的には文字列でないと受け付けない。(内部はString型のVariantと推測)

 実際に、Rangeオブジェクトでやるとエラーになるので、
 ユーザーが頑張っても無駄に終わります。(また、MS社に翻意を促すのは非現実的。)

 ■そこで、「Rangeオブジェクト」から「セル範囲文字列」を作成する小道具を作ってみました。
 (1)まず、SubAddressにセットするセル範囲文字列は、
    Rangeオブジェクト.Address(external:=True)
    をそのまま利用することにします。
 (2)難点は、セルへの表示です。(1)の文字列にはブック情報が含まれているので、
    それをリンク元のセルに表示すると、ブック名が冗長、邪魔になります。
    これは表示だけの話でリンクそのものには影響ないので、修正して問題ありません。

 ==== 以下は参考コードです。

 Sub ハイパーリンクの設定()
     Dim anchor As Range
     Dim target As Range
     Dim adrs   As String

     ' サンプル
     Set anchor = Range("A1")                        'Hyperlinkをセットするセル
     Set target = Worksheets("Sheet3").Range("A1")   'リンク先のセル

     adrs = target.Address(external:=True)

     ' Hyperlinkの設定
     ActiveSheet.Hyperlinks.Add anchor:=anchor, Address:="", _
           SubAddress:=ads, TextToDisplay:=setTextToDisplay(target)

 End Sub

 'Hyperlink先を表示する文字列の設定(ブック名を除く処理)
 Function setTextToDisplay(target As Range) As String
     Dim adrs$, bookname$

     adrs = target.Address(external:=True)
     bookname = target.Parent.Parent.Name

     setTextToDisplay = Replace(adrs, "[" & bookname & "]", "")

         ' もし"'"で始まる場合は、それがセルに表示されないので、重複させます。
     If Left(setTextToDisplay, 1) = "'" Then setTextToDisplay = "'" & setTextToDisplay
 End Function

(γ) 2020/07/30(木) 18:15


思わず力みが入ったが、
HYPERLINK関数を使うほうが簡単かもしれません。
=HYPERLINK("#SHEET3!A1")
などと。
簡単に設定、コピーペイストできますし。

(γ) 2020/07/30(木) 18:24


 ActiveSheet.Hyperlinks.Add anchor:=anchor, Address:="", _
           SubAddress:=ads, TextToDisplay:=setTextToDisplay(target)
 のadsはadrsの間違いです。(修正もれです)
 訂正願います。
(γ) 2020/07/30(木) 23:31

肝心の部分のコードが書かれていないのですが、Found_2というのが、おそらく文字列をFindして得たRange型オブジェクトなのだと思うのです。 でも、コード例ではその行位置しか使っていないので、検索してヒットしたセルのある行のA列に飛ばしたいのだろう、と読み取れます。

見つけたセルそのものに飛ばしたいなら、Subaddressに Found_2.Address(True, True, xlA1, True) を指定するだけ。 ブック名は付いたままで構いません。 でも、A列に飛ばしたいなら、行位置だけ使って、"Sheet2!A" & Found_2.Row で良いと思う訳ですよ。 こんなに簡単な話なのに、なんでRangeやCellで指定したい、なんて無理を言うのかが判らなかったです。
(???) 2020/07/31(金) 10:01


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.