Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1881 / 13645 ツリー ←次へ | 前へ→

【71275】Hypaerlinkをマクロで実行する方法 hiros2048 12/2/17(金) 9:04 質問[未読]
【71276】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 9:23 発言[未読]
【71277】Re:Hypaerlinkをマクロで実行する方法 UO3 12/2/17(金) 10:04 発言[未読]
【71278】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 10:37 発言[未読]
【71279】Re:Hypaerlinkをマクロで実行する方法 UO3 12/2/17(金) 10:58 発言[未読]
【71280】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 11:10 発言[未読]
【71282】Re:Hypaerlinkをマクロで実行する方法 hiros2048 12/2/17(金) 11:17 質問[未読]
【71284】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 11:27 発言[未読]
【71285】Re:Hypaerlinkをマクロで実行する方法 UO3 12/2/17(金) 11:27 発言[未読]
【71281】Re:Hypaerlinkをマクロで実行する方法 UO3 12/2/17(金) 11:13 発言[未読]
【71283】Re:Hypaerlinkをマクロで実行する方法 UO3 12/2/17(金) 11:24 発言[未読]
【71286】Re:Hypaerlinkをマクロで実行する方法 hiros2048 12/2/17(金) 14:28 質問[未読]
【71288】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 17:06 発言[未読]
【71291】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 20:04 発言[未読]
【71292】Re:Hypaerlinkをマクロで実行する方法 hiros2048 12/2/17(金) 22:03 質問[未読]
【71295】Re:Hypaerlinkをマクロで実行する方法 hint 12/2/17(金) 22:56 発言[未読]
【71298】Re:Hypaerlinkをマクロで実行する方法 hiros2048 12/2/18(土) 8:43 お礼[未読]

【71275】Hypaerlinkをマクロで実行する方法
質問  hiros2048  - 12/2/17(金) 9:04 -

引用なし
パスワード
   Hypaerlink関数でリンク先(同一ブック内の他のシートのセル)にジャンプするとき、セル選択後エンターでジャンプする方法がないでしょうか? この機能はoffice2000までは使えていました。
office2000以降のExcelではセルを選択してクリックすればリンク先にジャンプできるのですが、エンターでジャンプしたいのです。

マクロを使ってoffice2000の機能(エンターでジャンプ)を実現できないでしょうか?
以下のマクロでできるというページを見つけましたが、これではエラーとなりうまくいきませんでした。
多分、同じブック内の他のシートを参照する場合はこのマクロでは駄目なようです。
どなたか、いい方法をご教授ください。

Sub Auto_Open()
'起動時 キー設定 On
Call SettingKeys(True)
End Sub
Sub Auto_Close()
'終了時 キー設定 Off
Call SettingKeys(False)
End Sub
Sub SettingKeys(flg As Boolean)
If flg Then
Application.OnKey "{Enter}", "JumpHyperLink"
Application.OnKey "~", "JumpHyperLink"
Else
Application.OnKey "{Enter}"
Application.OnKey "~"
End If
End Sub
Sub JumpHyperLink()
If TypeName(Selection) = "Range" Then
If ThisWorkbook.Worksheets(Selection.Parent.Name) Is ActiveSheet Then
Selection.Hyperlinks(1).Follow NewWindow:=False
End If
End If
End Sub

このマクロでは、
Selection.Hyperlinks(1).Follow NewWindow:=False
を実行すると、「インデックスが有効範囲にありません」というエラーになります。
セルには次のような関数が書いてあります。
=IF(B4="","",HYPERLINK("#sheet2!B4","sheet2 B4へ"))

【71276】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 9:23 -

引用なし
パスワード
   SelectionのFormula中に"HYPERLINK"があったら、
そのなかからジャンプ先を取り出し、
Application.Goto
でジャンプすればいいと思います。

【71277】Re:Hypaerlinkをマクロで実行する方法
発言  UO3  - 12/2/17(金) 10:04 -

引用なし
パスワード
   ▼hiros2048 さん:

すでにhintさんからお答えが出ているので蛇足ですが、以下のコードで
選択セル(複数領域選択なら、その最初のセル)にハイーパーリンクが設定されていれば
そのリンク先アドレスを表示します。

Sub Sample()
  If TypeName(Selection) = "Range" Then
    With Selection(1).Hyperlinks
      If .Count > 0 Then
        MsgBox .Item(1).SubAddress
      Else
        MsgBox "選択セルには、ハイパーリンクが設定されていません"
      End If
    End With
  End If
End Sub

【71278】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 10:37 -

引用なし
パスワード
   UO3さん、はじめまして。
ご指摘の手法ですが、
Hyperlink関数で作成したものは、
Hyperlinks コレクションでは捕捉できないんじゃないでしょうか。
質問者さんのコードも同じことが言えるのですけど。

【71279】Re:Hypaerlinkをマクロで実行する方法
発言  UO3  - 12/2/17(金) 10:58 -

引用なし
パスワード
   ▼hint さん:

ご指摘ありがとうございます。
そうなんですねぇ、今、確認しました。

ということですと、やはり

・HasFormulaプロパティがTrueであることを確認して
・Formulaプロパティ文字列の中の、HyperLinkを検索して
・その後の( )内のアドレス文字列を取得

こういったことが必要になるわけですね。

【71280】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 11:10 -

引用なし
パスワード
   ▼UO3 さん:
>ということですと、やはり
>・HasFormulaプロパティがTrueであることを確認して
>・Formulaプロパティ文字列の中の、HyperLinkを検索して
>・その後の( )内のアドレス文字列を取得
>こういったことが必要になるわけですね。
ありがとうございました。そう思います。
HasFormulaプロパティはご指摘のとおりですね。

【71281】Re:Hypaerlinkをマクロで実行する方法
発言  UO3  - 12/2/17(金) 11:13 -

引用なし
パスワード
   ▼hiros2048 さん:

hintさんのご指摘をベースに先ほどアップした確認コードをリバイスします。

Sub Sample2()
  Dim fm As String
  Dim ad As String
  Dim p1 As Long, p2 As Long
  
  If TypeName(Selection) = "Range" Then
    If Selection(1).HasFormula Then
      fm = Selection(1).Formula
      p1 = InStr(UCase(fm), "HYPERLINK(")
      If p1 > 0 Then
        p1 = p1 + 10
        p2 = InStr(p1, fm, ")")
        If p2 > 0 Then
          ad = Mid(fm, p1, p2 - p1 - 1)
        End If
      End If
    End If
  End If
  
  If Len(ad) > 0 Then
    MsgBox "リンク先は" & ad & "です"
  Else
    MsgBox "HYPERLINK関数がありません"
  End If

End Sub

【71282】Re:Hypaerlinkをマクロで実行する方法
質問  hiros2048  - 12/2/17(金) 11:17 -

引用なし
パスワード
   質問者のhiros2048です。
回答ありがとうございます。
>>Hyperlinks コレクションでは捕捉できないんじゃないでしょうか。

hyperlinks(1)というマクロは使えないということでしょうか?
セルの内容から関数の式を解読してそのリンク先を調べ
そこにジャンプさせるということでしょうか?

【71283】Re:Hypaerlinkをマクロで実行する方法
発言  UO3  - 12/2/17(金) 11:24 -

引用なし
パスワード
   ▼hiros2048 さん:

訂正です
HYPERLINK関数の第2引数があると(実際の例では指定がありましたね)アップしたものでは
不具合がでます。
以下で、第2引数の有無によらずアドレス取得ができます。

Sub Sample3()
  Dim fm As String
  Dim ad As String
  Dim p1 As Long, p2 As Long
  Dim v As Variant
  
  If TypeName(Selection) = "Range" Then
    If Selection(1).HasFormula Then
      fm = Selection(1).Formula
      p1 = InStr(UCase(fm), "HYPERLINK(")
      If p1 > 0 Then
        p1 = p1 + 10
        p2 = InStr(p1, fm, ")")
        If p2 > 0 Then
          ad = Mid(fm, p1, p2 - p1 - 1)
        End If
      End If
    End If
  End If
  
  If Len(ad) > 0 Then
    v = Split(ad, ",")
    MsgBox "リンク先は" & v(0) & "です"
  Else
    MsgBox "HYPERLINK関数がありません"
  End If

End Sub

【71284】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 11:27 -

引用なし
パスワード
   ▼hiros2048 さん:
>hyperlinks(1)というマクロは使えないということでしょうか?
はい、Hyperlink関数で作ったものについては、そうです。
Dim a
set a = Selection(1).Hyperlinks
をステップ実行して、ローカルウインドウで a の中身を見て下さい。
実感できると思います。

>セルの内容から関数の式を解読してそのリンク先を調べ
>そこにジャンプさせるということでしょうか?
はい。
UO3さんが、アップして下さっています。

【71285】Re:Hypaerlinkをマクロで実行する方法
発言  UO3  - 12/2/17(金) 11:27 -

引用なし
パスワード
   ▼hiros2048 さん:

>セルの内容から関数の式を解読してそのリンク先を調べ
>そこにジャンプさせるということでしょうか?

ですね。
なので、たとえばSample3で取得した v(0) を使って
Application.Goto Range(v(0))
これでジャンプさせましょう。

【71286】Re:Hypaerlinkをマクロで実行する方法
質問  hiros2048  - 12/2/17(金) 14:28 -

引用なし
パスワード
   U03さん
短時間の内にこれほど親切に教えて頂けて大変感謝しています。
ご指示いただいと方法も一つの方法として、リンク先を抽出して
直接そのセルを選択するマクロを作れば実現できそうな目処が付きました。
ありがとうございます。

さらにもっと楽な方法として、このセルのHyperlink関数を
直接実行する方法は無いでしょうか?
hyperlink関数は以下のようなもので、実際の参照セルアドレスを求めるのはかなり面倒なマクロが必要です。
=IF(B4="","",HYPERLINK("#sheet2!"&CHAR(64+COLUMN(D$3) )&ROW(A4),B4&"sheet2リンクへ"))

このような方法を調べている理由は視覚障害の方がセルを選択した後そのセルから別シートのセルにジャンプするとき、そのセルにきた時(セル位置は読み上げてくれるの音声で判ります)エンターを押してジャンプするようのしたいためです。クリックしてジャンプする現在のHyperlink関数の方法では、目で見てマウスでポイントしてクリックする必要があるため、見えない人にはクリックできないからです。
もし何かもう少し簡単にできる方法があればよろしくお願いします。

【71288】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 17:06 -

引用なし
パスワード
   ▼hiros2048 さん:
>さらにもっと楽な方法として、このセルのHyperlink関数を
>直接実行する方法は無いでしょうか?
Hyperlink関数は、リンクを内部的に設定するもので、
実際のジャンプ命令ではありません。
Hyperlink関数を直接実行する、とうことの意味がわかりません。

>hyperlink関数は以下のようなもので、実際の参照セルアドレスを求めるのはかなり面倒なマクロが必要です。
>=IF(B4="","",HYPERLINK("#sheet2!"&CHAR(64+COLUMN(D$3) )&ROW(A4),B4&"sheet2リンクへ"))
条件の後出しはやめたほうがいいですよ。

そのような規則的なルールがあるのなら、
式の意味を考えれば、ジャンプ先を求めるのは簡単です。
行と列それぞれの、その式が書かれているアドレスに対する相対位置が
決まっているのですから、文字列を解析しなくても導き出せます。
シートも可変なら、そこは""の中を調べなければならないかもしれませんが、
それは提案のあった方法を少し変えるだけです。

>このような方法を調べている理由は視覚障害の方がセルを選択した後そのセルから別シートのセルにジャンプするとき、そのセルにきた時(セル位置は読み上げてくれるの音声で判ります)エンターを押してジャンプするようのしたいためです。クリックしてジャンプする現在のHyperlink関数の方法では、目で見てマウスでポイントしてクリックする必要があるため、見えない人にはクリックできないからです。
>もし何かもう少し簡単にできる方法があればよろしくお願いします。
今の
Application.OnKey "{Enter}", "JumpHyperLink"
を使う方式の代案ということですか?
もう少し「簡単にできる」ということの意味を明記してください。
キー操作だけで行うなら、Enterが適当かどうかは別として、
なんらかのショートカットに割り当てるのが自然だと思います。

【71291】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 20:04 -

引用なし
パスワード
   例えば、C4に
= IF(B4="","",HYPERLINK("#sheet2!"&CHAR(64+COLUMN(D$3) )&ROW(A4),・・・))
が入力されていて、同様な式が複数箇所にあるとすれば、
次のようなもので対応できるでしょう。

Sub Sample4()
  Dim fm As String
  Dim r As Range
  Dim p1 As Long, p2 As Long
  Dim myRow As Long, myColumn As Long, mySheet As String
  
  If TypeName(Selection) = "Range" Then
    Set r = Selection
    If r(1).HasFormula Then
      fm = r(1).Formula
      p1 = InStr(UCase(fm), "HYPERLINK")
      If p1 > 0 Then
        myRow = r.Row
        myColumn = r.Column + 1
        p2 = InStr(p1 + 11, fm, """")
        mySheet = Mid$(fm, p1 + 12, p2 - (p1 + 13))
        Application.Goto Worksheets(mySheet).Cells(myRow, myColumn), True
      End If
    End If
  End If
End Sub

あとは、HYPERLINKの第二引数に、
ジャンプ先を取り出せるように忍ばせておく手があるでしょう。
そうすれば、単にSelection.Value(に簡単な置換をしたもの)を使って
ジャンプすることができるでしょう。

【71292】Re:Hypaerlinkをマクロで実行する方法
質問  hiros2048  - 12/2/17(金) 22:03 -

引用なし
パスワード
   hintさん
詳しい説明ありがとうございます。
関数からジャンプ先を抽出するマクロまで考えていただき感謝します。
いろいろ繰り返しで厚かましく、申し訳ないのですが、Hyperlink関数の
第一変数(ジャンプ先)は先に提示した記述式以外にもいろいろな形式を使っておりジャンプ先をその都度解析するのが難しい状況です。
ショートカットキーマクロを作って解決できれば一番いいと思います。
Office2000以降のExcelでは、Hyperlink関数はその式があるセルを「クリック」すると関数が実行されて、Hyperlink関数の第一変数で指定したジャンプ先に画面表示が変わり、ジャンプ先のセルが選択状態になります。
ショートカットキーマクロで、この「クリック」に変わる操作を実行できればいいと思います。Hyperlink関数が書いてあるセルを選択したのち、「そのセルをマウスがポイントしてから、クリックする」と同じことができるマクロはどう書けばいいのでしょうか? 視覚障害者はこの関数が書いてあるセルまでを矢印キーで順にたどって選択することはできるのですが、そのセルの位置にマウスのポインターを当てて、クリックする操作ができないのです。(見えないため)
office2000ではセル選択後、エンターを押せばこの関数が実行でき、ジャンプ先にジャンプできましたが、新しいExcelに移行した場合、エンターではジャンプできなくなり困っています。
hyperlink関数を使う理由は、この関数があるセルから、別のシートの必要とするセル位置に選択を一気に移したいために使いたいのです。
もし、方法があったらよろしくお願いします。

【71295】Re:Hypaerlinkをマクロで実行する方法
発言  hint  - 12/2/17(金) 22:56 -

引用なし
パスワード
   > Office2000以降のExcelでは、Hyperlink関数はその式があるセルを
>「クリック」すると関数が実行されて、Hyperlink関数の第一変数で指定した
> ジャンプ先に画面表示が変わり、ジャンプ先のセルが選択状態になります。
承知しています。

> ショートカットキーマクロで、この「クリック」に変わる操作を実行できればいいと思います。
> Hyperlink関数が書いてあるセルを選択したのち、「そのセルをマウスがポイントしてから、
> クリックする」と同じことができるマクロはどう書けばいいのでしょうか?

残念ながら、Hyperlink関数で作ったリンクにはそういう機能はありません。
(すでに説明した方法以外で)
Hyperlink関数を使わないハイパーリンクを使えば可能です。
あなたのExcelバージョンが不明(こちらの見落とし?)なので、操作手順は書けませんが、
これを使って作成されたHyperlinkオブジェクトには、Followメソッドがあり、
これをショートカットに割り当てたマクロから実行することで、
クリックと同じ動作をさせることが可能です。

(Hyperlink関数というものは、簡易版と言っていいでしょう。
FollowHyperlinkイベントにも感応しません。
規則的なリンクを簡易に使用するためのもの、と考えていいでしょう。)

> 第一変数(ジャンプ先)は先に提示した記述式以外にもいろいろな形式を使っており
普通は規則的に作るか、個々にリンク先を直接書くか、くらいの2パターンで
使い分けもできそうですが、最初からやる気が湧いてないように見受けられますね。

そういう使い方なら、Hyperlink関数によらないハイパーリンクを使うことをお勧めします。
ヘルプを見て研究してみてください。

【71298】Re:Hypaerlinkをマクロで実行する方法
お礼  hiros2048  - 12/2/18(土) 8:43 -

引用なし
パスワード
   いろいろ何度もしつこく質問を繰り返しそのつど親切な回答をいただきありがとうございます。
もともと使っていたEXCELファイル(関数だけで機能していてマクロは使っていなかった)をExcel2000からExcel2010にそのまま移行しようとしていることに無理があることが判りました。
旧のファイルを見直し、ご指摘のようにHyperlink関数ではなく、Hyperlinkを使うか、セルにジャンプ先だけを書いてそのセルでEnterされたら、その内容を解読してジャンプするなどの方法で改めて作り直すことにします。関数だけではなくマクロを使うことで、解決の方法はあると思います。
このサイトがあることを知り、突然質問したにも関わらずわずか一日の内に何度も回答を頂けたことにネットの素晴らしさと、皆様のご協力の精神に驚きを感じています。
一応この一連の質問を終わりにします。
重ねてありがとうございました。

1881 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free