トップ回答者
VBA ファイル参照ダイアログで.html.url.lnkを非表示に

質問
-
ファイル参照ダイアログを下記のコードで表示すると、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
回答
-
sakuraxxさん、こんにちは。
失礼しました。言うまでもない話でした。ごめんなさい。
なお、これも言うまでもないような気はしますが、次のようなユーザーフォームを作成して、Dir()やGetAttr()やFSOなど使えば、GetOpenFilenameと同じような、しかし、sakuraxxさんの目的に合致したものができるような気がしてきました。ただ、そこまでやるかどうか…です。それから、IEの<input type=file>を利用できないかと思ったのですが、これもエクセルのGetOpenFilenameと同じで、ショートカットが表示されてしまうようでしたので、断念しました。
- 編集済み KokemomoYamamomo 2019年7月10日 1:46
- 回答としてマーク sakuraxx 2019年7月13日 17:52
すべての返信
-
sakuraxxさん、こんにちは。
前報撤回します。失礼しました。
確かにショートカット「ほげほげ.url」が表示されてしまう現象を確認しました。
ほげほげ.urlの拡張子をほげほげ.datに変えると表示されなくなりました。
そのファイルを再びほげほげ.urlに戻すと表示されるようになりました。
一方、テキストファイルをtest.urlで保存すると、エクスプローラー上はショートカットのアイコンで表示されますが、GetOpenFilenameのダイアログでは、表示されませんでした。
どうも、GetOpenFilenameは、ファイルの拡張子とファイルの内容と両方を評価して表示したりしなかったり区別しているような感じですね。- 編集済み KokemomoYamamomo 2019年7月8日 10:34
-
sakuraxxさん、こんばんは。
ご返事、ありがとうございます。
私も非力で、GetOpenFilenameの代替品を組む能力は無いのが残念です。
動作確認したところでは、フォルダのショートカットの.lnkは、これ1つだけ選択するとそのリンク先のフォルダが開きます。このような動作からすると、ショートカット.lnkは、目的のファイルに到達するための手掛かりとして、サブフォルダの表示と同様、有益なのかもしれません。また、そのほかのアイテム等と合わせて2つ以上選択すると、mySelectFile には何も出力されません。GetOpenFilenameのダイアログの見た目はごちゃごちゃしますが、.lnkは間違って選択しても大して実害はないかもしれません。
.urlについては、リンク先のファイルのフルパスがmySelectFile に出力されるようです。
非力な私の考える解決策としては、もうお考えになっていると思いますが、GetOpenFilenameで得られるmySelectFileの拡張子をチェックして、目的外のファイルを排除する/目的に合致するファイルを選択する、という方策がよろしいかと存じます。
- 編集済み KokemomoYamamomo 2019年7月9日 13:22
-
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 Subsakuraxx
-
sakuraxxさん、こんにちは。
失礼しました。言うまでもない話でした。ごめんなさい。
なお、これも言うまでもないような気はしますが、次のようなユーザーフォームを作成して、Dir()やGetAttr()やFSOなど使えば、GetOpenFilenameと同じような、しかし、sakuraxxさんの目的に合致したものができるような気がしてきました。ただ、そこまでやるかどうか…です。それから、IEの<input type=file>を利用できないかと思ったのですが、これもエクセルのGetOpenFilenameと同じで、ショートカットが表示されてしまうようでしたので、断念しました。
- 編集済み KokemomoYamamomo 2019年7月10日 1:46
- 回答としてマーク sakuraxx 2019年7月13日 17:52
-
API関数のGetOpenFileNameをサブクラス化すれば何とかなりそうな気もしますが、確認していない&もしできるとしても大変そうです。
下記URLで、API関数のサンプルがありました。サブクラス化については、ぐぐってください。
https://www.moug.net/tech/acvba/0020007.html
ちなみに、OFN_NODEREFERENCELINKS フラグを指定しても、フィルタには反映されないようでした。
(=このフラグの有無に関わらず、ショートカットファイルは表示されました)
- 編集済み minmin312 2019年7月10日 6:37
-
minmin312さん、助言どうも有難うございます。ご紹介のhttps://www.moug.net/tech/acvba/0020007.html
コモンダイアログを使用する(API)、を試行…
Excel-VBE標準モジュールにコピーペして試みたのですが次のヶ所でコンパイルエラーが発生しました。
'Accessアプリケーションのハンドルを取得
pOpenFileName.hwndOwner = Application.hWndAccessApp '←コンパイルエラー発生
この行をコメント化することで動作確認には成功しました。
しかし非力な私には「API関数のGetOpenFileNameをサブクラス化」するとか、
ぐぐってはみたもののMFCのラッパーなどを理解することはとても無理…ギブアップ。。。何方か実用的なサンプルコードを提供して頂ければ大変有難いのですが宜しくお願いいたします。sakuraxx
-
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