ハイパーリンクされているファイルの更新日付を取得するユーザー関数

このQ&Aのポイント
  • リンク先のファイルから更新日付の情報を取ってくるため、エクセルを自動計算にしても自動計算されず、「CTRL+SHIFT+ALT+F9」を押さないと反映されません。
  • ハイパーリンクの設定をしたセルに対して、ハイパーリンクの変更(別のファイルをリンクする)しても、変更後のファイルに対しての日付取得ができません。
回答を見る
  • ベストアンサー

ハイパーリンクされているファイルの更新日付を取得するユーザー関数

ハイパーリンクされているファイルの更新日付を取得するユーザー関数 環境:WindowsXpSp3 MS-Excel2003Sp2 ハイパーリンクされているファイルの更新日付を取得するユーザー関数を以下の様に作成しました。 これを、標準モジュールへ登録し、添付画像の様にセルから呼び出すようにしています。 2つ質問があります。 1.リンク先のファイルから更新日付の情報を取ってきているので、   エクセルを自動計算にしていても自動計算されず、"CTRL+SHIFT+ALT+F9"を押さないと   反映されません。   これを、自動計算に対応させる方法は無いでしょうか。 2.1度ハイパーリンクの設定をしたセルに対して、ハイパーリンクの変更   (別のファイルをリンクする)しても、変更後のファイルに対しての日付取得ができません。   試しに、LinkFileName関数で"Hyperlinks(1).Address"を表示してみると、   セルへは変更後のファイル名が表示されているのですが、"Hyperlinks(1).Address"の内容は   変更前のままで変わっていませんでした。   変更後のリンクアドレスを取得する方法は無いでしょうか。   (ユーザー定義関数の実行タイミングの問題なのでしょうか。) よろしくお願いします。 ----------------------------------------------------------------------------- リンク先の更新日付を取得する関数 ----------------------------------------------------------------------------- Function LastModifiedTime(targetRange As Range) As Double Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") LastModifiedTime = FSO.GetFile(targetRange.Hyperlinks(1).Address).DateLastModified Set FSO = Nothing End Function ----------------------------------------------------------------------------- リンク先のファイル名(パス名)を取得する関数 ----------------------------------------------------------------------------- Function LinkFileName(targetRange As Range) As String LinkFileName = targetRange.Hyperlinks(1).Address End Function -----------------------------------------------------------------------------

  • elec2
  • お礼率61% (105/171)

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

[ハイパーリンク]クリックイベントを捉まえる方式で、 'ThisWorkbookModule Option Explicit Private WithEvents cLink1 As Office.CommandBarButton Private WithEvents cLink2 As Office.CommandBarButton Private Sub cLink1_Click(ByVal Ctrl As Office.CommandBarButton, _              CancelDefault As Boolean)   Application.OnTime Now, "fCalculate" End Sub Private Sub cLink2_Click(ByVal Ctrl As Office.CommandBarButton, _              CancelDefault As Boolean)   Application.OnTime Now, "fCalculate" End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean)   Set cLink1 = Nothing   Set cLink2 = Nothing End Sub Private Sub Workbook_Open()   Set cLink1 = Application.CommandBars.FindControl(ID:=1576)   Set cLink2 = Application.CommandBars.FindControl(ID:=1577) End Sub '----------------------------------------------------------- '標準Module Option Explicit Sub fCalculate()   ThisWorkbook.Sheets("sheet1").Range("B1:B2").Dirty End Sub Sub kLink()   Dim x As Long      If ActiveCell.Hyperlinks.Count = 0 Then     x = 1576   Else     x = 1577   End If   With Application     .OnTime Now, "fCalculate"     .CommandBars.FindControl(ID:=x).accDoDefaultAction   End With End Sub こんな感じでいけるかもしれません。 ショートカットキー[Ctrl]+[k]対策は Sub kLink にキーを割り当てます。 手作業もしくは Application.MacroOptions Macro:="kLink", ShortcutKey:="k" これを1回実行です。 ただし、 >MS-Excel2003Sp2 の環境までです。 2007の[挿入]-[リンク]-[ハイパーリンク]には反応しません。

elec2
質問者

お礼

回答、ありがとうございます。 遅くなってしまい申し訳ありません。 この方法を採用させていただきました。

その他の回答 (2)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

>回答にあるように、シートモジュールへWorksheet_Changeを追加してみたのですが、 >Changeイベントが発生しません。 失礼しました。 セルの文字列が空白でハイパーリンクだけが設定されているとChangeイベントは発生しますが、両方ある場合はChangeイベントは発生していないようです。 SelectionChangeを使う場合は、Target変数を利用して、移動前のセルがハイパーリンクのセルかどうかを判定する方法があります。 ただし、この方法はハイパーリンクを変更したあとにセルを移動させないとイベントが発生しないのでご注意を。 Public SRow As Integer Public SCol As Integer Private Sub Worksheet_SelectionChange(ByVal Target As Range) If SRow = 1 And SCol = 1 Then Range("B1").Dirty ElseIf SRow = 2 And SCol = 1 Then Range("B2").Dirty End If SRow = Target.Row SCol = Target.Column End Sub 別の方法として、ハイパーリンクのファイル名が変わったかどうかを判定する方法もあります。 Public Filename1 As String Public Filename2 As String Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("A1").Hyperlinks(1).Address <> Filename1 Then Range("B1").Dirty Filename1 = Range("A1").Hyperlinks(1).Address ElseIf Range("A2").Hyperlinks(1).Address <> Filename2 Then Range("B2").Dirty Filename2 = Range("A2").Hyperlinks(1).Address End If End Sub ハイパーリンクを設定している場所がたくさんあったり、場所が不定だったりした場合は、Filename1,Filename2の代わりに別シートを利用する方法もあります。

elec2
質問者

お礼

返事が遅くなってしまい、申し訳ありません。 たびたびありがとうございます。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

>ユーザー定義関数の実行タイミングの問題なのでしょうか。 ハイパーリンクの変更の場合、リンク先を変える前に自動計算しているようです。 そのため、LastModifiedTimeやLinkFileNameで表示される内容は、変更前のリンク先の内容になっています。 ハイパーリンクの変更でもChangeイベントは発生するので、シートモジュールにChangeイベントを設定し、RangeのDirtyメソッドで再計算すれば大丈夫のようです。 Private Sub Worksheet_Change(ByVal Target As Range) Range("B1:B2").Dirty End Sub Rangeの範囲は必要に応じて変えてください。

elec2
質問者

お礼

補足の追記です。 Worksheet_SelectionChangeだと大丈夫なのですが、セルを移動するたびにイベントが発生して、目的の結果を得ることができます。 当然といえば当然なのですが。 ただ、セルを移動するたびに再計算してしまうのもどうかと思っています。 これ以外に方法は無いでしょうか。

elec2
質問者

補足

回答、ありがとうございます。 回答にあるように、シートモジュールへWorksheet_Changeを追加してみたのですが、 Changeイベントが発生しません。 Worksheet_Changeへブレークポイントを設定して試してみました。 「ハイパーリンクの編集」ダイアログを開いて、アドレスのみ変更した場合、このブレークポイントにはヒットしません。 しかし、同ダイアログの「表示文字列」を変更すると、ブレークポイントにヒットします。 (数台のPCで試しましたが、同じ結果でした。) 原因がわかりますでしょうか。 または、別の方法がありますでしょうか。

関連するQ&A

  • エクセル2003でハイパーリンクのセルからURLアドレスを取得する関数はありますか?

    エクセル2003でハイパーリンクのセルからURLアドレスを取得する関数はありますか? ハイパーリンクを作成する関数は、=HYPERLINK("URLアドレス", "表示名称")で可能ですが、この逆で、"URLアドレス"を取得する関数を探しています。 例えばこのセルが、A1にあったとして、B1に =A1とすると、B1には「表示名名称」が表示されます。 C1に「URLアドレス」を表示させるVBAでなく関数が知りたいです。 無ければ、VBAでも構いません。 よろしくお願いいたします。

  • Excelユーザー定義関数が書き込まれているセルアドレス

    Excelのユーザー定義関数で、自分自身が書き込まれているセルのアドレスって取得出来るのでしょうか? 例えば、 Function test(MyString As String) As String test = "入力された文字は、「" & MyString & "」です" End Function とユーザー定義関数を作り A1のセルに =test("てすと") と書くと 入力された文字は、「てすと」ですと出てきます。 そこで、ユーザー定義関数のなかで、ユーザー定義関数を呼び出した式が入力されている(上記の例ですと、「A1」)アドレスを取得する方法ってありますか? どなたか、詳しい方いらっしゃいましたら教えてください。

  • Word2002のハイパーリンク更新について

    Word2002を使用しております。 リンク元のファイルの保存場所や名前を変更した際、自動的に ハイパーリンクが更新される方法はありますか? あるドキュメントにハイパーリンクを複数設定しているのですが リンク元のファイルの保存場所や名前を変更すると 当然、リンク切れを起してしまいます。 業務で使っていることもあり、いちいち手動で修正するのは 非効率で、困っています。 是非、ご教授のほど、お願い致します。

  • ファイル名と更新日付の取得について

    Perlを使って、下のようなイメージでディレクトリ内のファイル名と更新日付のみ取得したいと思っております。 (ファイル名)△(更新日付) 最初は、PerlからUNIXコマンドを呼び出してls -ltr の結果を配列に格納し、それから半角スペースを元にsplitして取得しようとしたのですが、 日付が一桁のときと二桁のときでは、配列の位置が異なるため、うまくいかないのです。 また、stat関数を使ったのですが、情報はなにも取得されません。理由は不明です。 他に良い方法をご存知の方、御教示願えないでしょうか? ちなみにPerlのバージョンは4、OSはHP-UXです。 情報不足だったり意味が分からなかったら追記いたします。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • セル色を取得するユーザー関数

    セル色を取得するユーザー定義関数として、 Function CellColor(objCell As Range) As Integer  Application.Volatile  CellColor = objCell.Interior.ColorIndex End Function 上記のコードを標準モジュールに貼り付け、例えばB2セルに「=CellColor(A2)」という計算式を入力すると、B2セルにA2セルの塗りつぶし色のColorIndex値が表示されるようになります。 これをB2セルに例えば「=CellColor()」というように入力すれば B2セルにB2セルの塗りつぶし色のColorIndex値が表示されるようにするには、 どのようなユーザー関数を作ればよいでしょうか? よろしくお願いします。

  • ユーザー定義関数でシート名を取得したい

    例えば、以下のユーザー定義関数で Public Function Test(A As Range) Test=A.Address End Function AにアクティブシートのセルA1~セルB2を指定すると「$A$1:$B$2」という値が帰ってきますが、 別のシートのセルA1~セルB2を指定しても、「$A$1:$B$2」という値が帰ってきます。 シート名が抜けてしまっているのですが、シート名はどのようにしたら取得できますか?

  • VBA関数の使い方がわからないです

    A1にはハイパーリンクとしてhttp://www.yahoo.co.jp/ が入っていて、標準モジュールで Sub Macro1() MsgBox HyperlinkAddress End Sub Function HyperlinkAddress(target As Range) As String HyperlinkAddress = target.Hyperlinks(1).Address End Function としたら、引数は省略できません。になるのですが、 どうすればいいですか? Sub Macro1() MsgBox Selection.Hyperlinks(1).Address End Sub これと同じような事を、関数を使って表現したいです。

  • ハイパーリンクでのクリックイベントの取得

    任意のセルに対して HYPERLINK 関数でリンクをはったものについては、 マウスからのクリックイベントを Worksheet_FollowHyperlink で 取得できることはわかったのですが図形描画バーのテキストボックスに対して メニューからのハイパーリンクで実施したリンクに対して Worksheet_FollowHyperlink で取得できない状態です。 テキストボックスに対しての HYPERLINK 関数の使用法について 使えるのかすらわからず、メニューからの方法しか わからなかったのですがこの場合のリンクでは取得できない状態のようです。 メニューはツールバー -> 挿入からものかテキストボックスを 選択して右クリックで表示されるメニューからで同じシート内で 任意のセルを指定する形です。 テキストボックスにリンクをはりクリックイベントを取得するには どうしたらいいのでしょうか?

  • エクセルの日付関数について教えてください。

    エクセルの日付関数について教えてください。 上司から、データの修正をかけたごとの表を提出するようにいわれています。 エクセルのToday関数ですと、ファイルを開いた日付に変更されてしまうので 困っています。 ファイルを開いただけでは変更されず、内容を更新したときだけ、その処理日が表示されるような 関数があれば教えてください。 ひとつのファイルに何枚かのシートがあるので できればシートごとにできればよいのですが 無理でしたら、別ファイルを作ります。 よろしくお願いします。

  • ファイルの有無を判定してからリンクをはりたい

    EXCELで、 Function isFileExist(Filename As String) As Boolean Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FileExists(Filename) Then isFileExist = True Else isFileExist = False End If End Function という自作の関数を標準モジュールにVBAでつくっておき、 セルに =IF(isFileExist("aaa.pdf"),HYPERLINK("aaa.pdf","ファイルを見る"),"ファイルはありません") と書いて、ファイルがある場合だけリンクをはるようにしようとしました。 ところが、ファイルがない場合でも、セルをクリックすると、 「指定されたファイルを開くことができません」と出てきてしまいます。 どうしてなのかわかる方がいましたら教えてください。

専門家に質問してみよう