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も見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
Hyperlink関数をクリックしてくれるマクロ
Excel(エクセル)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
VBAからのHYPERLINK関数のアドレス取得法
その他(Microsoft Office)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
セルをマクロのボタンにしたい。
Visual Basic(VBA)
-
6
押したボタンの位置取得(共通のマクロ)
Excel(エクセル)
-
7
エクセル マクロでリンク先を開く方法
Excel(エクセル)
-
8
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
9
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
10
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
11
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
12
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
13
ExcelからPDF文書の特定ページにリンクを貼る方法について
Excel(エクセル)
-
14
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
15
エクセルファイルを開く時、常に同じシートから開くようにするには?
Windows Vista・XP
-
16
VBAでダブルコーテーション入りの数式をセルにセットしたい
Visual Basic(VBA)
-
17
VBA 数式を残して値をクリアについて
Excel(エクセル)
-
18
括弧があるとHYPERLINKで飛べない?
Excel(エクセル)
-
19
エクセルで「特定の文字を含むファイルへのリンク」or「特定の文字を含むファイルの検索の実行」
Excel(エクセル)
-
20
Excelでセルに名前を定義したいのですが
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のセルが空白だったら、そ...
-
ExcelVBAを使って、値...
-
【Excel VBA】指定行以降をクリ...
-
エクセルVBAでコピーして順...
-
i=cells(Rows.Count, 1)とi=cel...
-
【VBA】指定したセルと同じ値で...
-
Excelで指定した日付から過去の...
-
VBA コピーして次の値まで貼り...
-
screenupdatingが機能しなくて...
-
EXCELで変数をペーストしたい
-
Excel vbaで特定の文字以外が入...
-
VBAでセルをクリックする回...
-
連続する複数のセル値がすべて0...
-
Excel2003 複数セル1列の入力済...
-
Excel VBA、 別ブックの最終行...
-
【Excel VBA】セルの色によって...
-
セル色なしの行一括削除
-
実行時エラー438 オブジェクト...
-
セルに画像挿入すると、右セル...
-
VBAコマンドボタンを押すたびに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAを使って、値...
-
特定のセルが空白だったら、そ...
-
i=cells(Rows.Count, 1)とi=cel...
-
【Excel VBA】指定行以降をクリ...
-
Excelで指定した日付から過去の...
-
【Excel】指定したセルの名前で...
-
TODAY()で設定したセルの日付...
-
EXCELで変数をペーストしたい
-
Excel VBA、 別ブックの最終行...
-
Excelのプルダウンで2列分の情...
-
VBA コピーして次の値まで貼り...
-
screenupdatingが機能しなくて...
-
エクセルVBAでコピーして順...
-
VBA初心者です。結合セルを保持...
-
セル色なしの行一括削除
-
VBAでセルをクリックする回...
-
Excel vbaで特定の文字以外が入...
-
DataGridViewの各セル幅を自由...
-
特定の文字を条件に行挿入とそ...
-
【VBA】指定したセルと同じ値で...
おすすめ情報