• 締切済み

GetOpenFilename(MultiSelect)が配列を返さない

下記のIf行で配列を返したいのですが、うまくいかずに Stopステートメントで止まってしまいます(デバッグ用です)。 特に、下記コードを記述したブックを非表示にし、 ダイアログ内でファイルの場所を変更した時に 配列を返さないようです。 どなたか解決方法をご存知の方がいらっしゃったら、 よろしくお願いいたします。 なお、WindowsXP Pro. SP2、Excel2003 SP2です。 Dim OpenFileName As Variant OpenFileName = Application.GetOpenFilename _ (FileFilter:="dsc,*.dsc,すべてのファイル,*.*", MultiSelect:=True) If IsArray(OpenFileName) Then ・・・コード・・・ ElseIf OpenFileName <> False Then Stop End If

みんなの回答

  • osa__p
  • ベストアンサー率0% (0/0)
回答No.7

わたしのところでこの現象が発生する前、VSTOからAPIを呼び出していたら サイズ変更の出来ないファイル選択ダイアログが生成されてしまいました。 そのため頭の中でAPIは使えないと思い込んでいたのですが、 試してみるとAPIでもサイズ変更のできるウィンドウが生成されますね。 今のところ、やりたいことは実現できているので、わたしが改めてスレッドを立てるつもりはないです。 ただこのスレッドが解決しないまま放置状態だったので、もし同じ現象が発生した人が居れば何かの助けになるんじゃないかと思って書き込んだ次第です。 というわけで、ここまでたどり着いた方はAPIかFileDialogを使えばよいかと。 ># このサイトでは質問を新たに設けて、その中に関連スレッドとして ># リンクを張った方が良いですよ。削除されるかも、、、 あ、OKWaveってそういうシステムだったんですか? 同じ質問が何度もされるより、一カ所に集約されてる方が良いかと思ったのですが。質問掲示板で同じ質問が何度もされることにうんざりするタイプなので(^^; というか、このスレッドが削除されるんなら、関連スレッドとしてリンクを張っても意味ないですよね。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

不具合とするくらいなら API でコモンダイログを呼び出してみては?   GetOpenFileName api   GetSaveFileName api このキーワードでWEB 検索すればサンプルソースはすぐ見つかります。 VBA の「ファイルを開く」ダイアログは、私の環境では本ご質問のような 現象は再現しないのですが、別の症状で不安定に感じていて信頼してません。 # このサイトでは質問を新たに設けて、その中に関連スレッドとして # リンクを張った方が良いですよ。削除されるかも、、、

  • osa__p
  • ベストアンサー率0% (0/0)
回答No.5

代用方法が見つかったので、書いておきます。 あれから調べていたところ、海外でも同じ現象で悩んでいる人がいました。 その方はFileDialogを使って回避したようです。 http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.programming/2007-06/msg01399.html ただしFileDialogはExcel2002以降でしか使えませんので、 わたしは他の環境でも動く必要があったため 以下のようにしました。 複数選んだのに1枚しか返ってこなかった場合は、 その1枚だけでも処理するようにしています。 あとはお客様にExcelの不具合であると説明するしかないかなと。 If CInt(Application.Version) >= 10 Then ' Excel 2002以上ならFileDialogを使用する Call GetImageFiles2002Over Else ' Excel 2000以下ならGetOpenFilenameを使用する ' ただし複数ファイルが拾えない場合がある(VBAのサイズが大きいとき?) Call GetImageFiles2000Under End If Private Sub GetImageFiles2002Over() Dim Filename As Variant Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogOpen) Call fd.Filters.Add("画像ファイル(*.jpg)", "*.jpg") fd.Title = "商品画像の指定" fd.AllowMultiSelect = True If fd.Show = -1 Then ' 選択した場合 For Each Filename In fd.SelectedItems ' 1枚ごとに処理 Next Else ' キャンセルした場合 End If End Sub Private Sub GetImageFiles2000Under() Dim idx As Long Dim Filename As Variant Filename = Application.GetOpenFilename(filefilter:="画像ファイル(*.jpg),*.jpg" _ , Title:="商品画像の指定" _ , MultiSelect:=True) If IsArray(Filename) Then For idx = LBound(Filename) To UBound(Filename) ' 1枚ごとに処理 Next idx Else If Filename = False Then Exit Sub ' キャンセルした場合 ' 配列で返ってこなかったときの救済処理 End If End Sub

  • osa__p
  • ベストアンサー率0% (0/0)
回答No.4

実はわたしの環境でも同じ現象が発生していて、 この質問にたどり着きました。 どうしても配列ではなく1つだけしか返ってこないのです。 新規ブックに該当コードだけを抜き出すと問題なく動作するのですが・・・。 ただ、その再現するコードもいつの間にか再現しなくなったり、また再発したり・・・。 どうしたものかと、解決方法が見えずに困っています。 気になる点と言えば、VBAのコードが大量で、シート部分はほとんど入力されていないのですが、VBAコードだけで保存した状態で900KB以上になってるぐらいです。 VBA部分が大きすぎると変になる?とか。こあ、あり得ないとは思いつつも。 環境はXP(x64)SP2 + Office Pro Excel 2003 SP3です。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 > ウィンドウ>表示しないにした上でマクロを実行し、~ > ファイル選択をすると Array として判断しないようです。 当方でも問題ないです。再現しないですね... 余談ですが、MultiSelect:=True の時は単一ファイルを選択しても戻り値は 配列になるので ElseIf OpenFileName <> False Then は意味がないですよ。 Sub Sample()   Dim OpenFileName As Variant   Dim vFname    As Variant   OpenFileName = Application.GetOpenFilename( _           FileFilter:="dsc,*.dsc,すべてのファイル,*.*", _           MultiSelect:=True)   If IsArray(OpenFileName) Then     ' 単一ファイル選択時でも配列で返ります     ' ・・・コード・・・     For Each vFname In OpenFileName       Debug.Print vFname     Next   Else '<--- ElseIf で判定する必要なし     ' キャンセル時     Stop   End If End Sub

15th
質問者

お礼

ご確認ありがとうございます。 KenKen_SPさんのコードも試してみましたが、再現しませんでした。 temtecomai2さんへのお礼のとおり、当方で再現しなくなってしまったので、暫く様子をみてみます。

回答No.2

Book1.xls の標準モジュールに -------------------------------------------- Option Explicit Sub TestFileDialog() Dim openFileName As Variant openFileName = Application.GetOpenFilename(FileFilter:="*.txt,*.txt", MultiSelect:=True) If IsArray(openFileName) Then MsgBox "配列" ElseIf openFileName <> False Then MsgBox "配列じゃない" Else MsgBox "キャンセルとか" End If End Sub -------------------------------------------- と書いて保存。 [ウィンドウ]-[表示しない] にして Excel のウィンドウだけが表示されるようにする。 [Alt]+[F8] でマクロ実行のダイアログを出し、「Book1.xls!TestFileDialog」を実行。 初期フォルダが My Documents になっているので D ドライブの aaa フォルダに移動して、そこにあるテキストファイルを複数選択して [開く] をクリック。 メッセージボックスが「配列」を表示。 テキストファイルを 1つしか選ばなくても「配列」を表示。 [キャンセル] を押すと「キャンセルとか」を表示。 というように私の環境では何の問題も出ませんでした。 一応 Option Explicit を先頭に書いてみてください。 あとはモジュール レベルの変数名と被ってるとか。 ダメな場合は新規ブックで私が提示したコードを試してみてください。

15th
質問者

お礼

ご確認ありがとうございます。 いろいろと試している内に再現しなくなってしまいました。 以下、その経緯です。 1.temtecomai2さんのコードを試す→再現無し 2.私のコードを試す→再現無し 3.特定のブック(ワークシートにデータや式は書かれていますが、コードは書かれていません)を開いている時に→再現有り 4.Excel再起動→再現しなくなる ※3,4の前後で他のブックを開いたり閉じたり、コードの実行をしています。 なお、Option Explicitはオプションで変数の宣言を強制しています。 モジュール レベル変数も調べてみましたが、ありませんでした。 当方で再現しなくなってしまい申し訳ありませんが、暫く様子をみてみます。

回答No.1

> 特に、下記コードを記述したブックを非表示にし、 > ダイアログ内でファイルの場所を変更した時に この状況がよくわかりません。 回答者が追試できるように説明してください。 それと、特に変なことをせず、普通に複数ファイルを選択したときは Array として判断してもらえるのですよね?

15th
質問者

補足

説明不足で申し訳ありません。 > それと、特に変なことをせず、普通に複数ファイルを選択したときは Array として判断してもらえるのですよね? その通りです。下記操作以外では Array として判断しているようです。 > 特に、下記コードを記述したブックを非表示にし、 > ダイアログ内でファイルの場所を変更した時に マクロを記述したブックを、Excelのメニューバーで、 ウィンドウ>表示しない にした上でマクロを実行し、 GetOpenFilenameのダイアログ内の左上にあるエクスプローラ風のリストボックスを使ってフォルダ移動後に ファイル選択をすると Array として判断しないようです。 また、単一ファイル選択か複数ファイル選択かは関係無いようです。

関連するQ&A

専門家に質問してみよう