- ベストアンサー
エクセルマクロによるハイパーリンクの方法
- エクセルマクロを使用して、セルに書かれた文字列に対応するハイパーリンクを作成する方法について質問します。
- 質問者は、マクロ.xlsファイルとdataフォルダ内にある複数のPDFファイルがあり、マクロを使ってセルに書かれた文字列をクリックすると対応するPDFファイルが開くようにしたいと考えています。
- 現在、質問者はセルに書かれた文字列を変数に代入し、ワイルドカードを使って対応するPDFファイル名を取得することに問題があるようです。ご解答をお待ちしています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> マクロ.xlsのセルA1~A10に適当な英数字の文字列(A123,B243,C072 …など)が書かれていて セルの文字列がすべて4桁という前提ですが。 ' Sub AAA() Dim i As Integer, N As Integer, TargetFile As String i = 1 Do While Cells(i, 1) <> "" N = 0 TargetFile = Dir$("C:\_Anns\file\data\*.pdf") Do While TargetFile <> "" If Left(TargetFile, 4) = Cells(i, 1) Then ActiveSheet.Hyperlinks.Add Anchor:=Range(Cells(i, 1).Address), _ Address:="C:\_Anns\file\data\" & TargetFile GoTo Nxt End If TargetFile = Dir$ Loop Nxt: i = i + 1 Loop End Sub
その他の回答 (4)
- misatoanna
- ベストアンサー率58% (528/896)
> セルへの入力ミスやファイルの欠如がありえる ということですので、リンク対象のファイルを次のようにしました。 a.ファイルの"("までの文字列とセルの文字列が同じ。 b."("がつかないファイルは、ファイル名の先頭数文字がセルと同じ。 c.PDFに限らず、すべての拡張子が対象。 限定が必要な場合は、 myDir & "*.*" を myDir & "*.pdf" に 書き換えます。 ' Sub BBB() Dim myDir As String Dim i As Integer, N As Integer, TargetFile As String myDir = "C:\_Anns\Zone_2\data\" '←実際のフォルダ名に書換え i = 1 Do While Cells(i, 1) <> "" N = 0 TargetFile = Dir$(myDir & "*.*") Do While TargetFile <> "" Select Case InStr(TargetFile, "(") - 1 Case Is > 0 If Left(TargetFile, InStr(TargetFile, "(") - 1) = Cells(i, 1) Then GoTo Lnk End If Case Else If Left(TargetFile, Len(Cells(i, 1))) = Cells(i, 1) Then GoTo Lnk End If End Select TargetFile = Dir$ Loop GoTo Nxt Lnk: ActiveSheet.Hyperlinks.Add Anchor:=Range(Cells(i, 1).Address), _ Address:=myDir & TargetFile Nxt: i = i + 1 Loop End Sub これから出かけてしまいますが、最後に―― > エクセルマクロを始めたばかり と書かれていたことに、いま気づきました。 マクロのお勉強中のようですが、私の記述はまったくの我流で、「動けばいいや」と いうものです。(無責任!) VBAの正しい文法や記述につきましては、書物やVBA専門のサイトを見てください。
お礼
重ね重ねご回答ありがとうございます。 If Left(TargetFile, InStr(TargetFile, "(") - 1) = Cells(i, 1) Then 今までの作成したプログラムの一部に上の一行を利用させて頂きました。 misatoannaさんには何度も回答いただき本当にありがとうございました。 これをつかってデータベースの方を作成して行こうと思います。
- misatoanna
- ベストアンサー率58% (528/896)
> このプログラムで一応ハイパーリンクできました。 よかったですね。 (^^) > セルの文字数は9~15文字でランダムに書かれています。 > PDFファイル名="Cell(i,1)"と*と& ".pdf"を使って完全一致させる。 dataフォルダ内にあるファイルは、A列のセルに書かれている不定長の 文字列に少し文字が追加された名前のPDFファイル。――ということで したら、 If Left(TargetFile, 4) = Cells(i, 1) Then の部分を If Left(TargetFile, Len(Cells(i, 1))) = Cells(i, 1) Then と置き換えればよいでしょう。 ファイル名の左(先頭)から「セルの文字列と同じ長さ分」が同じなら、 という、LEFTワークシート関数の考え方です。
お礼
またしても回答ありがとうございます。 こんなやり方があるなんて知りませんでした。 経験や発想やセンスの問題ですかね…。 核となる部分はmisatoannaさんに教えていただいたので後は自分の方で膨らませようと思います。 重ね重ね質問をお願いして申し訳ないのですが、 もし時間があるようでしたらお答えいただけると助かります。 仮にセルA1にA123、B1にA1234が入力されていたときに dataフォルダ内にA123(OK).pdfファイルが存在せず A1234(OK).pdfファイルのみ存在していた場合、 セルA1、B1ともにA1234(OK).pdfファイルがリンクされますよね? こういった場合にセルA1は本来A123(OK).pdfファイルがリンクされるべきなので、 セルA1にはA1234(OK).pdfはリンクさせず、セルB1のみにリンクさせるようにはできないでしょうか? (セルへの入力ミスやPDFファイルの欠如があると起こりえると思いましたので…) 参考になるかは分かりませんが、 PDFファイルにはセルの文字列の後に括弧"()"がついておりますので PDFファイルの"("までの文字列とセルの文字列が同じなら If文の処理をするという事はできないですかね…? misatoannaさんのお手数をおかけしない程度に考えていただけると非常に助かります。
- misatoanna
- ベストアンサー率58% (528/896)
#2です。 > Dir$("C:\_Anns\file\data\*.pdf") テスト用で使用したディレクトリ名をそのまま記述してしまいました。(^^ゞ 実際のディレクトリ名に置き換えてください。
- get3
- ベストアンサー率25% (2/8)
どのような場合にしようされるのでしょうか? マクロでないとだめですか? 挿入-ハイパーリンクが簡単ですが?
お礼
早速のお返事ありがとうございます。 エクセルシートにいろいろな情報が書かれてありまして セルに書かれているファイルをすぐに参照したいと考えています。 データ量は今後増えていく予定で現在でも1000件以上あるので 今後のことを考えるとマクロで一発でリンクさせてもらえると効率的と考えました。 ご回答ありがとうございました。
お礼
早速のご回答ありがとうございます。 このプログラムで一応ハイパーリンクできました。 ありがとうございます。 重ねてお願いなのですが、セルの文字数は9~15文字でランダムに書かれています。 したがってPDFファイル名="Cell(i,1)"と*と& ".pdf"を使って完全一致させたいのですがどうすればいいでしょうか? 質問は締め切っておりませんので、ご回答いただけると非常に助かります。 よろしくお願い致します。 P.S 教えて!gooをはじめて使うので御礼のポイントを差し上げたいのですがどうすればよいでしょうか?