
No.3ベストアンサー
- 回答日時:
#1-2、cjです。
#2お礼欄を読みました。> シート上に設定した文字列を誤って変更してしまわないように注意しようと思います。
ハイパーリンクの表示文字列 ≒ セルの値
が、仮に変更されてしまったとしても
Case "Hoge"
Call Hoge
の "Hoge" など、指定した文字列とマッチしなければ、
期待するマクロが動作しない、という結果なので、比較的軽い問題で済みますが、
偶然、他のマクロを実行させるキーワードにマッチしてしまうと、
全く期待しないマクロが実行されてしまい、こちらの場合は重篤なトラブルになりかねません。
場合によっては、Excel一般機能の、データの入力規則、等が防衛策に役立つかも知れません。
例えば、文字列値でハイパーリンクを設定した後に、
データの入力規則を新たに設定し、数値(最小値~最大値)を指定しておく、
(勝手に文字列値を設定出来なくなる)とか。
(データの入力規則を設定したセルをコピーし、他のセルの書式のみ貼り付けることで
手数を減らして設定できます)
これに因んだ情報として、以下。
ハイパーリンクの表示文字列 はあくまでも文字列ですから、
仮に、数値を設定したセルの値を拾ってマッチングするには
Select Case Target.Range.Value
と書き換えてやれば可能です。
次のサンプル7では、
セル値が、
数値 123
数字文字列値 "123"
プレフィクス付の数字文字列 "'123"
3つの場合にマッチします。
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Select Case Target.Range.Value
Case "Hoge"
Call Hoge
Case "Piyo"
Call Piyo
Case "Fuga"
Call Fuga
Case "123"
Call Hogera
End Select
Application.EnableEvents = False
Application.Goto
Application.EnableEvents = True
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
または
Select Case Target.TextToDisplay
と書き換えると
数字文字列値 "123"
プレフィクス付の数字文字列 "'123"
にだけマッチして、数値には反応しません。
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Select Case Target.TextToDisplay
Case "Hoge"
Call Hoge
Case "Piyo"
Call Piyo
Case "Fuga"
Call Fuga
Case "123"
Call Hogera
End Select
Application.EnableEvents = False
Application.Goto
Application.EnableEvents = True
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
正確には、セルの値に数値を設定すると、
ハイパーリンクの表示文字列の実態は空の文字列になる、ということです。
こういった特性を利用した設計を考えるなどすれば、
何かの役に立つかも知れませんね。
有難うございます。
数値、数字文字列値、プレフィクス付の数字文字に反応せせるようにしておけば、ハイパーリンクしようとする文字全体をコードに入力する必要はないのですね。
その方法を使い、作ってみようと思います。
ご親切に回答頂きありがとうございます。
No.2
- 回答日時:
#1、cjです。
#1補足欄へのレスです。> もう1点分からないことは、そのハイパーリンクは、Case "C3"とあるように、セルに設定するものなのですか。
> 例えば、ハイパーリンクを設定した後、並び替えをしてセル番地が異なることとなった場合は、Case "C3"のC3部分のの変更が必要なのですか。
#1で示した例では仰る通りです。
ハイパーリンクと実行したいマクロとを、セルの移動とは無縁に
常に関連付けを維持したいということでしたらば、
ハイパーリンクの表示文字列で関連付けするのが比較的簡単です。
例えば、
予め、ハイパーリンクの表示文字列を実行したいマクロ名にしておけば、
以下のように書くことが出来て、
セル番地変更の影響を受けないようになります。
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Private Sub Worksheet__FollowHyperlink(ByVal Target As Hyperlink)
Select Case Target.Name
Case "Hoge"
Call Hoge
Case "Piyo"
Call Piyo
Case "Fuga"
Call Fuga
End Select
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
もう少しシンプルに書くと
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Select Case Target.Name
Case "Hoge", "Piyo", "Fuga"
Application.Run (Target.Name)
End Select
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
これでも同じ結果になります。
ただ、ハイパーリンクのジャンプ先をどうするか、という問題は残ります。
(どこに飛んで行くか解らなくなるので)
ひとつの方法としてハイパーリンクの参照先はすべて、
当該シートのA1セル等に統一しておいて、
ジャンプした後に、元のハイパーリンクが設定されたセルに戻してやるような
使い方もあります。
その場合は、
Application.EnableEvents = False
Application.Goto
Application.EnableEvents = True
この3行を
End Sub
行の直前に挿入してください。
また、
ハイパーリンクの表示文字列 と、実行するマクロ との
関連付けさえ書いておけばよいので、
"Alpha" と表示された ハイパーリンクがクリックされたら、
マクロ: Hoge を
"Bravo" と表示された ハイパーリンクがクリックされたら、
マクロ: Piyo を
"Charlie" と表示された ハイパーリンクがクリックされたら、
マクロ: Fuga を
という対応関係を明確にしておけば、
自在に応用できることと思います。
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Private Sub Worksheet__FollowHyperlink(ByVal Target As Hyperlink)
Select Case Target.Name
Case "Alpha"
Call Hoge
Case "Bravo"
Call Piyo
Case "Charlie"
Call Fuga
End Select
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
ハイパーリンクの表示文字列 について
気を付けて欲しいのは、
シート上で容易に変更可能なことや、
Case "Alpha"
Case "alpha"
Case "Alpha"
のように大文字小文字、全角半角、を区別する、ということと、
数字のみで指定してしまうと、数字文字列なのか数値なのかの区別が複雑になってしまうことです。
紹介した、ハイパーリンクの表示文字列 の例の他に、
ハイパーリンクの参照先アドレスで振り分けることなど、
ここには書きませんが、他にも方法はあります。
念の為、
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
から
End Sub
までで一連のイベントプロシージャですが、
ひとつのシートモジュールに同じ目的同じ名前のプロシージャを重複して設定することはできません。
ハイパーリンク自体は簡単に編集出来てしまうものですから、
セル番地に限らず、VBAが前提にしている条件が崩される場面は、
容易に想像できます。
なので、他者による利用を想定する場合は、シートの保護なども検討に入れるか、
ハイパーリンク以外のオベジェクト(ボタンコントロールや各種シェープなど)などと
うまく使い分け出来ると好いと思います。
補足欄へのレスは以上です。
よく分かりました。
実際に考えているのは、並び替えを頻繁に行い、コードを設定する文字列の長さも違います。
Case "Alpha"
Call Hoge
のように、例えばその文字列をクリックするとマクロ名"a1"、"a2"、"a3"を実行するというように、マクロの名前とシート上の文字列をを別々に設定する方法があるのですね。
Application.EnableEvents = False
Application.Goto
Application.EnableEvents = True
も試してみでうまく出来ました。
シート上に設定した文字列を誤って変更してしまわないように注意しようと思います。
マクロ名を記号や、数値を使うことで、今後の整理がしやすいように思います。
この方法を元にして、実際に作ってみようと思います。
丁寧なご回答ありがとうございます。
No.1
- 回答日時:
シートモジュールで_FollowHyperlink イベントを使います。
シートモジュールに以下を貼り付けます。
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Select Case Target.Range.Address(0, 0)
Case "C3"
Call Hoge
Case "D4"
Call Piyo
Case "E5"
Call fuga
End Select
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
以上の例では、
C3 の ハイパーリンクがクリックされたら、マクロ: Hoge を
D4 の ハイパーリンクがクリックされたら、マクロ: Piyo を
E5 の ハイパーリンクがクリックされたら、マクロ: fuga を
実行します。
パターンとして
Case "C3"
Call Hoge
の2行で一組、
"C3" … セル範囲
Hoge … マクロ名
の部分を、そちらでの必要に合わせて。編集します。
この2行一組のパターンを適宜増やすことで、
> 1つのシートで複数のハイパーリンクに、異なるコードを設定する
ことが可能です。
なお、呼び出すマクロは標準モジュールに登録してあるものとします。
無論、
Call Hoge
のようにマクロを呼び出す代わりに、直接、コードを記入しても構いません。
ハイパーリンクの登録は
[このドキュメント内]
[セル参照を入力してください]と書かれたボックスに
ハイパーリンクを設定するセルのアドレス(C3 など)を指定して
[OK]
自セルにジャンプするように設定し、
見かけ上は何もしないように設定しておくのがベターです。
この回答への補足
ご回答ありがとうございます。
複数のハイパーリンクに異なるコードを割り当てることが出来ました。
FollowHyperlink イベントで1つのシートの複数のハイパーリンクをすべて設定すればよいのですね。
もう1点分からないことは、そのハイパーリンクは、Case "C3"とあるように、セルに設定するものなのですか。
例えば、ハイパーリンクを設定した後、並び替えをしてセル番地が異なることとなった場合は、Case "C3"のC3部分のの変更が必要なのですか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/11 12:55
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Excel(エクセル) Excel ハイパーリンク設定について 教えてください 例なんですが、 VBAにてファイル1の列Gに 2 2022/11/04 17:52
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- Excel(エクセル) エクセルのハイパーリンクで別BOOKを開く 3 2022/10/26 18:48
- HTML・CSS ウェブサイトにアップされているPDFファイルのハイパーリンク先に飛ぶ時、新しいタブを開きたい 3 2022/12/13 13:57
- Excel(エクセル) ハイパーリンクの削除について 2 2022/11/10 07:32
- Excel(エクセル) エクセルの図形にハイパーリンクとマクロ登録について教えてください 1 2022/06/11 11:29
- Excel(エクセル) 画像のようなチェックボックスとハイパーリンクがありますが、 ハイパーリンクを押すと、チェックボックス 1 2023/04/07 12:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルvbaで、別シートの最下...
-
Excelで指定した日付から過去の...
-
ExcelVBAを使って、値...
-
セルに貼り付けた画像の上から...
-
特定のセルが空白だったら、そ...
-
VBA初心者です。結合セルを保持...
-
エクセルvbaのワークシート関数...
-
最後のデータ行の任意のセルの...
-
【VBA】シート上の複数のチェッ...
-
【Excel VBA】指定行以降をクリ...
-
TODAY()で設定したセルの日付...
-
指定文字以外のカウント
-
【Excel】指定したセルの名前で...
-
エクセルvba:自己セルの情報取...
-
VBA実行後に元のセルに戻りたい
-
Excelに保存されているユーザー...
-
excelで置換をしたいんですが
-
”戻り値”が変化したときに、マ...
-
Excle VBA Findメソッドについて
-
Excel2003 複数セル1列の入力済...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
Excelで指定した日付から過去の...
-
エクセルvbaで、別シートの最下...
-
i=cells(Rows.Count, 1)とi=cel...
-
特定のセルが空白だったら、そ...
-
Excelのプルダウンで2列分の情...
-
【Excel VBA】指定行以降をクリ...
-
任意フォルダから画像をすべて...
-
VBAでセルをクリックする回...
-
”戻り値”が変化したときに、マ...
-
VBA実行後に元のセルに戻りたい
-
Excel vbaで特定の文字以外が入...
-
【VBA】シート上の複数のチェッ...
-
Excel VBA マクロ ある列の最終...
-
Excel VBAで、 ヘッダーへのセ...
-
DataGridViewの各セル幅を自由...
-
VBからEXCELのセルの値を取得す...
-
EXCELのVBA-フィルタ抽出後の...
-
VBAでセル同士を比較して色付け
-
Application.Matchで特定行の検索
おすすめ情報