Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2002)
ハイパーリンクをマクロで実行したい
投稿日時: 20/04/02 15:07:48
投稿者: hira_506

A1セルに人、B1セルに番号を入力して
C1セルにそれを取り込んだ式で誰のパソコンのどのデータを開くか指定しています。
D1セルに 式 =HYPERLINK($C$1,"開く") とするとそのデータが開きます。
A1、B1セルは都度違うものが入ります。
 
それを、マクロで実行したいのですが、初めからVBAを作るのが難しいので
開発のマクロの記録〜記録終了で手順を作ったうえで修正しようと思ったのですが
D1セルのハイパーリンクを使うとVBAの中にC1の式が取り込まれてしまいます。
毎回そのセルの式を実行させるにはどのようにしたらよいのでしょうか。
 

回答
投稿日時: 20/04/02 16:00:11
投稿者: WinArrow
投稿者のウェブサイトに移動

要するに
C1の値が変更できればよいのでしょうか?

投稿日時: 20/04/02 16:07:49
投稿者: hira_506

ありがとうございます。
 
マクロの中のC1の式をA1,B1に合わせて変更してもよいのですが、
単純にD1のハイパーリンクを実行させることができないでしょうか?

回答
投稿日時: 20/04/02 16:40:10
投稿者: WinArrow
投稿者のウェブサイトに移動

A1とB1の値は、どのようになっているのですか?

投稿日時: 20/04/02 16:52:22
投稿者: hira_506

A1はsuzukiやtanaka 人の名前でどのパソコンかを判断
B1は1,2… ファイル名
C1はA1,B1を入れたデータのフルパスの式です。 
IF関数を使ってsuzukiの10のファイルを開きたい時は \\SUZUKI\〇〇\△△\10.xlsm#入力2!AG1
              tanakaの20のファイルを開きたい時は \\TANAKA\〇〇\△△\10.xlsm#入力2!AG1
のようになるようにしてあります。

回答
投稿日時: 20/04/02 17:16:42
投稿者: WinArrow
投稿者のウェブサイトに移動

hira_506 さんの引用:
A1はsuzukiやtanaka 人の名前でどのパソコンかを判断
B1は1,2… ファイル名
C1はA1,B1を入れたデータのフルパスの式です。 
IF関数を使ってsuzukiの10のファイルを開きたい時は \\SUZUKI\〇〇\△△\10.xlsm#入力2!AG1
              tanakaの20のファイルを開きたい時は \\TANAKA\〇〇\△△\10.xlsm#入力2!AG1
のようになるようにしてあります。

 
C1セルは、フルパスで表示されているんですよね?
D1のセルをクリックすると、当該ファイルが開くますよね?
 
このような運用ではダメなんでしょうか?
マクロで対応する意味はあるのでしょうか?

投稿日時: 20/04/02 17:26:23
投稿者: hira_506

ファイルを開くのは他のデータにリンクをしていて内容を取り込みたいだけなのです。
開かずにリンクさせると時間がかかるのでファイルを開いています。
データ自体をいじるわけではないので、開いたら画面を元のデータに戻したり、
データの取り込みが終わればファイルを閉じたり、
いづれは一件ずつではなく連続してファイルを開いたりしたいと思っています。
マクロを作れると他のマクロと組み合わせたりして便利になるなと。
 

回答
投稿日時: 20/04/02 17:58:10
投稿者: WinArrow
投稿者のウェブサイトに移動

hira_506 さんの引用:

ファイルを開くのは他のデータにリンクをしていて内容を取り込みたいだけなのです。
開かずにリンクさせると時間がかかるのでファイルを開いています。
データ自体をいじるわけではないので、開いたら画面を元のデータに戻したり、
データの取り込みが終わればファイルを閉じたり、
いづれは一件ずつではなく連続してファイルを開いたりしたいと思っています。
マクロを作れると他のマクロと組み合わせたりして便利になるなと。

 
>開かずにリンクさせると時間がかかる
 これは、数式で他ブックを参照しているからだと思います。
 数式がたくさんで、他ブックが複数あると、確かの時間はかかりますね。
 だから、ハイパーリンクで、複数のブックを開いて・・・・・
 という発想になると想像しています。
 でも、セルA1+B1の方式(ハイパーリンク)の運用では、一度に複数のブックを開くことはできません。
 
仮に、セルの中に、外部ブックを参照する数式が存在sるのでしたら
その数式を解析して、当該ブックを開いたとき、同期して開く方が
いちいちパスを入力する手間が省けると思いますが・・・・
 
 

回答
投稿日時: 20/04/03 15:32:58
投稿者: WinArrow
投稿者のウェブサイトに移動

>ファイルを開くのは他のデータにリンクをしていて内容を取り込みたいだけなのです。
 
↑、「データを取込みたい」とは、
取込みたいブックを「Aブック」とすると、
Aブックのセルに「外部ブックのシートとセル」を指定した参照数式を入力する。
その場合、目視で確認しながら数式を入力するために別ブックを開く
という状況を想定しています。
単に、ブックを開くだけならば、ブックのフルパスがわかればよいだけなのに、
セルアドレスまでを、B1セルに入力すると説明されたいます。
果たして、セルアドレスまで必要なんでしょうか?・・・という疑問
 
ハイパーリンクの機能は、
指定ブックを開き、「指定したシートのセルを選択する」までですが、
>開かずにリンクすると時間がかかる
というのは、よく理解できません。
時間がかかるのは、開くときの話で、リンクだけの設定では、時間がかかることはないと思いますが・
という疑問
 
 
 
 
 

回答
投稿日時: 20/04/04 10:18:02
投稿者: WinArrow
投稿者のウェブサイトに移動

最初に戻って、コメントします。
 
セルD1に入力した「HYPERLINK関数」をクリックした操作を
マクロの記録でコードを作成した。
そのコードの中には、
WorkBooks.Open("〇〇.xlsx")
のようになっている、フルパスアイル名のところを
可変にできないか?
という質問でしたね?
 
結論からいうと
フルパスファイル名を可変にすることができたとしても
現状の運用(リンク文字セルをクリックする)では動作しません。
 
このマクロを動作させるには、別の手段(ボタンなど)を用意する必要があります。
せっかくのハイパーリンクが無意味になってしまいます。
 
詳細の理由は書きませんが、
再考をお勧めします。
 
 
それから、外部ファイルが別PCにおいてある場合の運用で、
あなたが、そのファイルを開いているときには
別PCの操作者が当該ファイルを更新しようとしても、更新できないことがある。
その対応についても検討が必要です。
 
 
 
 
 

回答
投稿日時: 20/04/05 09:37:41
投稿者: simple

横から失礼します。十分に読み込んでいないので誤解があるやもしれません。
 
要するに、
C1セルにハイパーリンクのリンク先情報である、
   フルパス + シート情報 + セル情報
があるということですね。
 
>ファイルを開くのは他のデータにリンクをしていて内容を取り込みたいだけなのです。
とのことですが、取り込みたい情報は具体的に何ですか?そこが不明確です。
 
さし当たって、そのリンク先のセルの値を取得できればいいんですか?
ひとつだけなら、リンクする式を元のブックのセルに直接書いても、時間はかからないはずです。
 
それとも、単にそのファイルが開いて、そこにジャンプできればいいんですか?
それなら、C1セルを3つの要素に分解して(これは区切り文字#や!で分離するだけです)、
WorkBooks.Openを使ってファイルを開き、
Application.Gotoでジャンプするだけかと思います。
 
# そのあとの、データ取得する作業を同時にしなければ、
# 単にハイパーリンクをクリックするのとなんら変わりがありません。
# その後続作業が説明されていないので、回答者が困惑する一因となっていると思います。

回答
投稿日時: 20/04/05 22:55:03
投稿者: WinArrow
投稿者のウェブサイトに移動

運用上の話ににrますが、
 
運用に際して
いくつかの懸念すべきことががあります。
 
AAAAさんのファイル名と
BBBBさんのファイル名と
が同一ファイル名の場合、
ハイパーリンクでは、後続するファイルは、開くことができません。
マクロでも同じです。
 
ハイパーリンクとマクロの違い
 
フルパスで、同一ファイル名という条件で
ハイパーリンクは、既に開いているブックの指定場所(シート+セル)にジャンプする
マクロは、既に開いているブックのフルパスを調べて、「開かない」という処理を付け加える必要がある。
 
このようなことを想定しているのでしょうか?
 
 
 

投稿日時: 20/04/06 16:14:28
投稿者: hira_506

皆さんありがとうございます。
 
単純に考えて
Workbooks.Open Filename:=Range("C1").Value
で十分でした。
たまたま最初に作ったのが HYPERLINK関数を使った式だったので、それにこだわってしました。
シートまで指定する必要もなく考えすぎていました。
 
今後、皆さんの回答を参考にさらに便利にしていきたいと思います。