重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

下記の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

A 回答 (7件)

わたしのところでこの現象が発生する前、VSTOからAPIを呼び出していたら


サイズ変更の出来ないファイル選択ダイアログが生成されてしまいました。
そのため頭の中でAPIは使えないと思い込んでいたのですが、
試してみるとAPIでもサイズ変更のできるウィンドウが生成されますね。

今のところ、やりたいことは実現できているので、わたしが改めてスレッドを立てるつもりはないです。
ただこのスレッドが解決しないまま放置状態だったので、もし同じ現象が発生した人が居れば何かの助けになるんじゃないかと思って書き込んだ次第です。

というわけで、ここまでたどり着いた方はAPIかFileDialogを使えばよいかと。

># このサイトでは質問を新たに設けて、その中に関連スレッドとして
># リンクを張った方が良いですよ。削除されるかも、、、
あ、OKWaveってそういうシステムだったんですか?
同じ質問が何度もされるより、一カ所に集約されてる方が良いかと思ったのですが。質問掲示板で同じ質問が何度もされることにうんざりするタイプなので(^^;
というか、このスレッドが削除されるんなら、関連スレッドとしてリンクを張っても意味ないですよね。
    • good
    • 0

不具合とするくらいなら API でコモンダイログを呼び出してみては?



  GetOpenFileName api
  GetSaveFileName api

このキーワードでWEB 検索すればサンプルソースはすぐ見つかります。

VBA の「ファイルを開く」ダイアログは、私の環境では本ご質問のような
現象は再現しないのですが、別の症状で不安定に感じていて信頼してません。

# このサイトでは質問を新たに設けて、その中に関連スレッドとして
# リンクを張った方が良いですよ。削除されるかも、、、
    • good
    • 0

代用方法が見つかったので、書いておきます。


あれから調べていたところ、海外でも同じ現象で悩んでいる人がいました。
その方はFileDialogを使って回避したようです。
http://www.tech-archive.net/Archive/Excel/micros …

ただし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
    • good
    • 0

実はわたしの環境でも同じ現象が発生していて、


この質問にたどり着きました。
どうしても配列ではなく1つだけしか返ってこないのです。

新規ブックに該当コードだけを抜き出すと問題なく動作するのですが・・・。

ただ、その再現するコードもいつの間にか再現しなくなったり、また再発したり・・・。
どうしたものかと、解決方法が見えずに困っています。
気になる点と言えば、VBAのコードが大量で、シート部分はほとんど入力されていないのですが、VBAコードだけで保存した状態で900KB以上になってるぐらいです。
VBA部分が大きすぎると変になる?とか。こあ、あり得ないとは思いつつも。

環境はXP(x64)SP2 + Office Pro Excel 2003 SP3です。
    • good
    • 0

こんにちは。



> ウィンドウ>表示しないにした上でマクロを実行し、~
> ファイル選択をすると 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
    • good
    • 0
この回答へのお礼

ご確認ありがとうございます。

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

お礼日時:2006/11/16 14:59

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 を先頭に書いてみてください。
あとはモジュール レベルの変数名と被ってるとか。
ダメな場合は新規ブックで私が提示したコードを試してみてください。
    • good
    • 0
この回答へのお礼

ご確認ありがとうございます。

いろいろと試している内に再現しなくなってしまいました。
以下、その経緯です。
1.temtecomai2さんのコードを試す→再現無し
2.私のコードを試す→再現無し
3.特定のブック(ワークシートにデータや式は書かれていますが、コードは書かれていません)を開いている時に→再現有り
4.Excel再起動→再現しなくなる
※3,4の前後で他のブックを開いたり閉じたり、コードの実行をしています。

なお、Option Explicitはオプションで変数の宣言を強制しています。
モジュール レベル変数も調べてみましたが、ありませんでした。

当方で再現しなくなってしまい申し訳ありませんが、暫く様子をみてみます。

お礼日時:2006/11/16 14:51

> 特に、下記コードを記述したブックを非表示にし、


> ダイアログ内でファイルの場所を変更した時に

この状況がよくわかりません。
回答者が追試できるように説明してください。

それと、特に変なことをせず、普通に複数ファイルを選択したときは Array として判断してもらえるのですよね?

この回答への補足

説明不足で申し訳ありません。

> それと、特に変なことをせず、普通に複数ファイルを選択したときは Array として判断してもらえるのですよね?
その通りです。下記操作以外では Array として判断しているようです。

> 特に、下記コードを記述したブックを非表示にし、
> ダイアログ内でファイルの場所を変更した時に

マクロを記述したブックを、Excelのメニューバーで、
ウィンドウ>表示しない
にした上でマクロを実行し、
GetOpenFilenameのダイアログ内の左上にあるエクスプローラ風のリストボックスを使ってフォルダ移動後に
ファイル選択をすると Array として判断しないようです。
また、単一ファイル選択か複数ファイル選択かは関係無いようです。

補足日時:2006/11/13 15:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!