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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
Hyperlink関数をクリックしてくれるマクロ
Excel(エクセル)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
押したボタンの位置取得(共通のマクロ)
Excel(エクセル)
-
5
VBAからのHYPERLINK関数のアドレス取得法
その他(Microsoft Office)
-
6
セルをマクロのボタンにしたい。
Visual Basic(VBA)
-
7
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
8
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
9
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
10
Excelでセルに名前を定義したいのですが
Excel(エクセル)
-
11
ExcelのVBAでフォームが表示されない
Excel(エクセル)
-
12
ExcelからPDF文書の特定ページにリンクを貼る方法について
Excel(エクセル)
-
13
エクセル マクロでリンク先を開く方法
Excel(エクセル)
-
14
VBA 数式を残して値をクリアについて
Excel(エクセル)
-
15
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
16
別のシートから値を取得するとき
Visual Basic(VBA)
-
17
Excel VBAで自動的にハイパーリンクを設定する方法について教えて
Excel(エクセル)
-
18
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
19
Excelのセルの色指定をVBAから配列を用いて効率的に行う方法はあり
Visual Basic(VBA)
-
20
VBAでダブルコーテーション入りの数式をセルにセットしたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
特定のセルが空白だったら、そ...
-
【Excel VBA】指定行以降をクリ...
-
TODAY()で設定したセルの日付...
-
【Excel】指定したセルの名前で...
-
エクセルVBAで結合セルの真ん中...
-
vba 隣のセルに値がある行だけ...
-
ExcelVBA データを消去すると罫...
-
VBAでセルをクリックする回...
-
Excle VBA Findメソッドについて
-
指定した条件で行セルを非表示...
-
DataGridViewで列、行、セルの選択
-
VBA ユーザーフォーム ボタンク...
-
vbsのセル値の取得について
-
任意フォルダから画像をすべて...
-
エクセルvba:自己セルの情報取...
-
結合セルを含む列の非表示方法
-
エクセルVBAでコピーして順...
-
EXCELで変数をペーストしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
i=cells(Rows.Count, 1)とi=cel...
-
ExcelVBAを使って、値...
-
【Excel VBA】指定行以降をクリ...
-
特定のセルが空白だったら、そ...
-
EXCELで変数をペーストしたい
-
Excelで指定した日付から過去の...
-
VBAの間違い教えて下さい
-
【Excel】指定したセルの名前で...
-
Excelのプルダウンで2列分の情...
-
エクセルVBAでコピーして順...
-
Excel vbaで特定の文字以外が入...
-
Excel VBA、 別ブックの最終行...
-
【VBA】指定したセルと同じ値で...
-
特定の文字を条件に行挿入とそ...
-
TODAY()で設定したセルの日付...
-
screenupdatingが機能しなくて...
-
VBA初心者です。次のVBAコード...
-
指定した条件で行セルを非表示...
-
VBAでセルをクリックする回...
-
DataGridViewの各セル幅を自由...
おすすめ情報