none
VBA ファイル参照ダイアログで.html.url.lnkを非表示に RRS feed

  • 質問

  • ファイル参照ダイアログを下記のコードで表示すると、FileFilterで指定していない「インターネットショートカット」ファイルなどが表示されます。
    これが仕様なのかもしれませんが、目的以外の「.html.url.lnk」が表示されているため、間違って選択してしまいます。
    「.html.url.lnk」を非表示にする方法をご教授よろしくお願いいたします。それとも非表示にする事は不可能でしょうか?

    Option Explicit

    Sub File参照DialogA()
       
        '▽ファイル参照ダイアログ
        Dim mySelectFile As Variant
        mySelectFile = Application.GetOpenFilename( _
            FileFilter:="All Files (*.*),*.*,Text Files (*.txt;*.log),*.txt;*.log,Excel Files (*.xlsx;*.csv;*.prn),*.xlsx;*.csv;*.prn", _
            FilterIndex:=2, _
            Title:="ファイルを指定してください", _
            MultiSelect:=True)

        '▽Cancel判定
        If Not IsArray(mySelectFile) Then Exit Sub

        '▽指定ファイル表示
        Dim str As String, i As Integer
        For i = LBound(mySelectFile) To UBound(mySelectFile)
                str = str & mySelectFile(i) & vbCrLf
        Next i
        Debug.Print str
       
    End Sub


    sakuraxx



    • 編集済み sakuraxx 2019年7月7日 16:59
    2019年7月6日 17:39

回答

  • sakuraxxさん、こんにちは。

    失礼しました。言うまでもない話でした。ごめんなさい。

    なお、これも言うまでもないような気はしますが、次のようなユーザーフォームを作成して、Dir()やGetAttr()やFSOなど使えば、GetOpenFilenameと同じような、しかし、sakuraxxさんの目的に合致したものができるような気がしてきました。ただ、そこまでやるかどうか…です。それから、IEの<input type=file>を利用できないかと思ったのですが、これもエクセルのGetOpenFilenameと同じで、ショートカットが表示されてしまうようでしたので、断念しました。

    2019年7月10日 1:45

すべての返信

  • sakuraxxさん、こんにちは。

    前報撤回します。失礼しました。

    確かにショートカット「ほげほげ.url」が表示されてしまう現象を確認しました。

    ほげほげ.urlの拡張子をほげほげ.datに変えると表示されなくなりました。
    そのファイルを再びほげほげ.urlに戻すと表示されるようになりました。
    一方、テキストファイルをtest.urlで保存すると、エクスプローラー上はショートカットのアイコンで表示されますが、GetOpenFilenameのダイアログでは、表示されませんでした。
    どうも、GetOpenFilenameは、ファイルの拡張子とファイルの内容と両方を評価して表示したりしなかったり区別しているような感じですね。

    2019年7月8日 6:14
  • sakuraxxさん初めまして

    >「.html.url.lnk」を非表示にする方法をご教授よろしくお願いいたします。

    確かに、ショートカットや、階層下のフォルダを出さないように出来ませんでした。
    色々調べてみましたが、Application.GetOpenFilenameの仕様だと思います。(自信がある訳ではありませんが)

    代替え案としては、UserFormで作成し対応する形になると思います。


    • 編集済み Takumi_Q 2019年7月8日 7:23 誤字訂正
    2019年7月8日 7:21
  • KokemomoYamamomoさん
    色々と試みていただき有難うございます。
    GetOpenFilename「FileFilter」の弱点をを凌ぐ裏技が有るかと切望しています。


    sakuraxx

    2019年7月9日 2:11
  • Takumi_Qさん
    評価していただき有難うございます。
    これが仕様と言うことであれば遺憾ともし難いことですが止むをえません…辛い。
    Application.FileDialogも試してはみたものの同様の現象でした。
    非力にてこれらに代わるものを自作する能力はなく断念するしかなさそう…
    誰かサンプルコードを提示していただけないでしょうか?

    sakuraxx

    2019年7月9日 2:16
  • sakuraxxさん、こんばんは。

    ご返事、ありがとうございます。

    私も非力で、GetOpenFilenameの代替品を組む能力は無いのが残念です。

    動作確認したところでは、フォルダのショートカットの.lnkは、これ1つだけ選択するとそのリンク先のフォルダが開きます。このような動作からすると、ショートカット.lnkは、目的のファイルに到達するための手掛かりとして、サブフォルダの表示と同様、有益なのかもしれません。また、そのほかのアイテム等と合わせて2つ以上選択すると、mySelectFile には何も出力されません。GetOpenFilenameのダイアログの見た目はごちゃごちゃしますが、.lnkは間違って選択しても大して実害はないかもしれません。

    .urlについては、リンク先のファイルのフルパスがmySelectFile に出力されるようです。

    非力な私の考える解決策としては、もうお考えになっていると思いますが、GetOpenFilenameで得られるmySelectFileの拡張子をチェックして、目的外のファイルを排除する/目的に合致するファイルを選択する、という方策がよろしいかと存じます。

    2019年7月9日 13:08
  • KokemomoYamamomoさん、ご提案有難うございます。
    質問の時に次の様に目的外のファイルを排除する(馬鹿除け)コードも記載しておけば良かった…申し訳ない。
    現状は馬鹿除けで凌いでいるのですが、「品質は前工程で作り込め」と言う格言に基づき「FileFilter:=」があるべきフイルタの役割を果たしてくれればと切望しています。が、これが仕様なら仕方ありません…残念。大変お世話になりました。
    Sub File参照DialogB()
        '▽ファイル参照ダイアログ
        Dim mySelectFile As Variant
        mySelectFile = Application.GetOpenFilename( _
            FileFilter:="All Files (*.*),*.*,Text Files (*.txt;*.log),*.txt;*.log,Excel Files (*.xlsx;*.csv;*.prn),*.xlsx;*.csv;*.prn", _
            FilterIndex:=2, _
            Title:="ファイルを指定してください", _
            MultiSelect:=True)
        '▽Cancel判定
        If Not IsArray(mySelectFile) Then Exit Sub
        '▽指定ファイル表示
        Dim str As String, i As Integer
        Dim vArray As Variant: vArray = LCase(Trim(".txt.log.xls.xlsx.csv.prn."))
        Dim eName As String
        Dim FSO As Object
        Set FSO = CreateObject("Scripting.FileSystemObject")
        For i = LBound(mySelectFile) To UBound(mySelectFile)
            eName = FSO.GetExtensionName(mySelectFile(i))
            eName = "." & eName & "."
            If Not Trim(InStr(vArray, LCase(eName))) = 0 Then '←馬鹿除け
                str = str & mySelectFile(i) & vbCrLf
            End If
        Next i
        Debug.Print str
    End Sub

    sakuraxx

    2019年7月9日 16:14
  • sakuraxxさん、こんにちは。

    失礼しました。言うまでもない話でした。ごめんなさい。

    なお、これも言うまでもないような気はしますが、次のようなユーザーフォームを作成して、Dir()やGetAttr()やFSOなど使えば、GetOpenFilenameと同じような、しかし、sakuraxxさんの目的に合致したものができるような気がしてきました。ただ、そこまでやるかどうか…です。それから、IEの<input type=file>を利用できないかと思ったのですが、これもエクセルのGetOpenFilenameと同じで、ショートカットが表示されてしまうようでしたので、断念しました。

    2019年7月10日 1:45
  • API関数のGetOpenFileNameをサブクラス化すれば何とかなりそうな気もしますが、確認していない&もしできるとしても大変そうです。

    下記URLで、API関数のサンプルがありました。サブクラス化については、ぐぐってください。

    https://www.moug.net/tech/acvba/0020007.html

    ちなみに、OFN_NODEREFERENCELINKS フラグを指定しても、フィルタには反映されないようでした。

    (=このフラグの有無に関わらず、ショートカットファイルは表示されました)




    • 編集済み minmin312 2019年7月10日 6:37
    2019年7月10日 6:34
  • minmin312さん、助言どうも有難うございます。
    ご紹介のhttps://www.moug.net/tech/acvba/0020007.html
    コモンダイアログを使用する(API)、を試行…
    Excel-VBE標準モジュールにコピーペして試みたのですが次のヶ所でコンパイルエラーが発生しました。
    'Accessアプリケーションのハンドルを取得
     pOpenFileName.hwndOwner = Application.hWndAccessApp '←コンパイルエラー発生
    この行をコメント化することで動作確認には成功しました。
    しかし非力な私には「API関数のGetOpenFileNameをサブクラス化」するとか、
    ぐぐってはみたもののMFCのラッパーなどを理解することはとても無理…ギブアップ。。。
    何方か実用的なサンプルコードを提供して頂ければ大変有難いのですが宜しくお願いいたします。

    sakuraxx

    2019年7月12日 3:05
  • KokemomoYamamomoさん、助言を有難うございます。
    掲題の件は元をただせば一昔前に次のサイトからダウンロードしたものを、
    http://www.asahi-net.or.jp/~ef2o-inue/download/sub09_020_110.html
    改良しつつ運用してきたのですが、ショートカットが表示され今だ未解決のまま運用しています。
    しかし最も気に入ったダイアログにて現在も大活躍しています。
    参考:Excel64bit対応のヘルプをした際のコードは次のサイトに在ります。
    https://social.msdn.microsoft.com/Forums/ja-JP/eaf2b8bc-d84f-4b98-9890-fdad67c852c3/vba?forum=vbajp
    浅い知識で改良を試みてはみるもののショートカット群を非表示にする壁を超えることができません…ギブアップ

    sakuraxx

    2019年7月12日 5:30