
下記の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件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
わたしのところでこの現象が発生する前、VSTOからAPIを呼び出していたら
サイズ変更の出来ないファイル選択ダイアログが生成されてしまいました。
そのため頭の中でAPIは使えないと思い込んでいたのですが、
試してみるとAPIでもサイズ変更のできるウィンドウが生成されますね。
今のところ、やりたいことは実現できているので、わたしが改めてスレッドを立てるつもりはないです。
ただこのスレッドが解決しないまま放置状態だったので、もし同じ現象が発生した人が居れば何かの助けになるんじゃないかと思って書き込んだ次第です。
というわけで、ここまでたどり着いた方はAPIかFileDialogを使えばよいかと。
># このサイトでは質問を新たに設けて、その中に関連スレッドとして
># リンクを張った方が良いですよ。削除されるかも、、、
あ、OKWaveってそういうシステムだったんですか?
同じ質問が何度もされるより、一カ所に集約されてる方が良いかと思ったのですが。質問掲示板で同じ質問が何度もされることにうんざりするタイプなので(^^;
というか、このスレッドが削除されるんなら、関連スレッドとしてリンクを張っても意味ないですよね。
No.6
- 回答日時:
不具合とするくらいなら API でコモンダイログを呼び出してみては?
GetOpenFileName api
GetSaveFileName api
このキーワードでWEB 検索すればサンプルソースはすぐ見つかります。
VBA の「ファイルを開く」ダイアログは、私の環境では本ご質問のような
現象は再現しないのですが、別の症状で不安定に感じていて信頼してません。
# このサイトでは質問を新たに設けて、その中に関連スレッドとして
# リンクを張った方が良いですよ。削除されるかも、、、
No.5
- 回答日時:
代用方法が見つかったので、書いておきます。
あれから調べていたところ、海外でも同じ現象で悩んでいる人がいました。
その方は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
No.4
- 回答日時:
実はわたしの環境でも同じ現象が発生していて、
この質問にたどり着きました。
どうしても配列ではなく1つだけしか返ってこないのです。
新規ブックに該当コードだけを抜き出すと問題なく動作するのですが・・・。
ただ、その再現するコードもいつの間にか再現しなくなったり、また再発したり・・・。
どうしたものかと、解決方法が見えずに困っています。
気になる点と言えば、VBAのコードが大量で、シート部分はほとんど入力されていないのですが、VBAコードだけで保存した状態で900KB以上になってるぐらいです。
VBA部分が大きすぎると変になる?とか。こあ、あり得ないとは思いつつも。
環境はXP(x64)SP2 + Office Pro Excel 2003 SP3です。
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
ご確認ありがとうございます。
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 を先頭に書いてみてください。
あとはモジュール レベルの変数名と被ってるとか。
ダメな場合は新規ブックで私が提示したコードを試してみてください。
ご確認ありがとうございます。
いろいろと試している内に再現しなくなってしまいました。
以下、その経緯です。
1.temtecomai2さんのコードを試す→再現無し
2.私のコードを試す→再現無し
3.特定のブック(ワークシートにデータや式は書かれていますが、コードは書かれていません)を開いている時に→再現有り
4.Excel再起動→再現しなくなる
※3,4の前後で他のブックを開いたり閉じたり、コードの実行をしています。
なお、Option Explicitはオプションで変数の宣言を強制しています。
モジュール レベル変数も調べてみましたが、ありませんでした。
当方で再現しなくなってしまい申し訳ありませんが、暫く様子をみてみます。

No.1
- 回答日時:
> 特に、下記コードを記述したブックを非表示にし、
> ダイアログ内でファイルの場所を変更した時に
この状況がよくわかりません。
回答者が追試できるように説明してください。
それと、特に変なことをせず、普通に複数ファイルを選択したときは Array として判断してもらえるのですよね?
この回答への補足
説明不足で申し訳ありません。
> それと、特に変なことをせず、普通に複数ファイルを選択したときは Array として判断してもらえるのですよね?
その通りです。下記操作以外では Array として判断しているようです。
> 特に、下記コードを記述したブックを非表示にし、
> ダイアログ内でファイルの場所を変更した時に
マクロを記述したブックを、Excelのメニューバーで、
ウィンドウ>表示しない
にした上でマクロを実行し、
GetOpenFilenameのダイアログ内の左上にあるエクスプローラ風のリストボックスを使ってフォルダ移動後に
ファイル選択をすると Array として判断しないようです。
また、単一ファイル選択か複数ファイル選択かは関係無いようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中の最大値とそのインデ...
-
VBA 変数名に変数を使用したい。
-
EXCELを使って、アクセスログを...
-
Dir関数で読み取り順を操作でき...
-
Excel2010のinputboxで複数デー...
-
VBScriptでCSVファイルを読み出...
-
C#でbyte配列から画像を表示さ...
-
VB6のメモリ解放に関して
-
バイナリエディタ
-
定数配列の書き方
-
VB.NETの配列にExcelから読み込...
-
レコードセットの中身を配列に...
-
配列の中から最大値だけ取り出...
-
エクセルの列一括書き込み
-
VBで組み合わせのプログラム...
-
VBでの配列をEXCELに出力する方法
-
c++ 乱数生成について
-
VBAにて、配列のデータを一度に...
-
空白を埋めるマクロについて
-
C#で作成したdllをVBScriptで使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列のペースト出力結果の書式...
-
定数配列の書き方
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
Redim とEraseの違いは?
-
複数のtextboxの処理を一括で行...
-
VB.NETの配列にExcelから読み込...
-
COBOLの基本的な事なので...
-
Excel2010のinputboxで複数デー...
-
VBAでMODE関数をつくる
-
レコードセットの中身を配列に...
-
ReDim PreserveよりもReDimが遅い
-
EXCELを使って、アクセスログを...
-
配列の中の最大値とそのインデ...
-
VB6のメモリ解放に関して
おすすめ情報