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