
ダイアログボックスで複数フォルダの複数ファイルの選択がうまくいきません。
単一フォルダ内からの複数ファイルの選択は機能しているのですが、ダイアログボックスで他のフォルダを選択して他のファイルを選択すると最終的に選択したファイルのみが残り、先に選択した分が累積されません。 OpenFileNameが上書きされるのが原因な気がするのですが配列への累積処理が解りません。
その後の処理で選択したファイルを全て開いて加工したいので、累積させる方法を知りたいのです。下記コードはLoop処理で行おうとして累積が解らないままのものです。
一度のダイアログ表示で複数フォルダの複数ファイルを選択出来る方法があればそれでもかまいません。どなたか助けては頂けないでしょうか。お願いします。
'**明細の選択(複数同時)**
Do
BN = Application.InputBox("対象明細書の年月を入力してください。1桁の月は02月のように入力)", , Default:="2009.04", Type:=2)
If BN = False Then '入力なければ
GoTo OWARI
End If
WorkPath = ThisWorkbook.Path & "\明細書一覧" & BN & "月"
ChDrive WorkPath
ChDir WorkPath
OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _
Title:="対象の明細書を選んで下さい。Ctrlキーを押しながら複数ファイルを同時に選択出来ます。", MultiSelect:=True)
Rtn = MsgBox("他にも対象ファイルがありますか?", vbYesNo, "選択")
If Rtn = vbNo Then
Exit Do
End If
Loop
Mypath = ThisWorkbook.Path
MyFile = "\請求制御.xls" 'ここにファイル名記入
If IsArray(OpenFileName) Then
For i = 1 To UBound(OpenFileName)
If OpenFileName(i) = Mypath & MyFile Then
MsgBox "同じファイルが含まれてます。", vbInformation, "同じファイルは選択出来ません"
GoTo OWARI
End If
tmp = tmp & Dir(OpenFileName(i)) & vbCrLf
Next
MsgBox vbCrLf & tmp & vbCrLf & "の全" & i - 1 & "枚です" & vbCrLf & "これらでよろしいですか? ", vbInformation, "選択したファイルは "
No.2ベストアンサー
- 回答日時:
方法はいくつかあるでしょうが、Collectionを使ったサンプル。
但し、質問者提示のコードは動作しているものとする。
'=====================
'●●●変数宣言
Dim myGetFiles As New Collection
Dim mySelectFile
'---------------------
Do
BN = Application.InputBox("対象明細書の年月を入力してください。1桁の月は02月のように入力)", , Default:="2009.04", Type:=2)
If BN = False Then '入力なければ
GoTo Owari
End If
WorkPath = ThisWorkbook.Path & "\明細書一覧" & BN & "月"
ChDrive WorkPath
ChDir WorkPath
'--------------------------------------
'●変数を、mySelectFile に変更
mySelectFile = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls", _
Title:="対象の明細書を選んで下さい。Ctrlキーを押しながら複数ファイルを同時に選択出来ます。", MultiSelect:=True)
'●●●選択ファイルをCollectionに登録
If IsArray(mySelectFile) Then
myGetFiles.Add mySelectFile
End If
'-------------------------------------
Rtn = MsgBox("他にも対象ファイルがありますか?", vbYesNo, "選択")
If Rtn = vbNo Then
Exit Do
End If
Loop
'●●●Collectionの展開
'-----------------------------
If myGetFiles.Count = 0 Then
MsgBox "ファイルがひとつも選択されていないよ!"
GoTo Owari '●ここは適宜修正のこと
End If
Mypath = ThisWorkbook.Path
MyFile = "\請求制御.xls" 'ここにファイル名記入
'●下記のように展開する-------
For Each OpenFIleName In myGetFiles
For i = UBound(OpenFIleName) To UBound(OpenFIleName)
If OpenFIleName(i) = Mypath & MyFile Then
・・・・・以下省略・・・・・・
==========================
なお、質問提示のコードにあった
>If IsArray(OpenFileName) Then
これはここでは不要、Collectionに登録するときチェック済
この回答への補足
myRangeさん ありがとうございます。
Collectionで試してみることにしました。
ご提示の
For i = UBound(OpenFIleName) To UBound(OpenFIleName)を
For i = LBound(OpenFIleName) To UBound(OpenFIleName)に
変えさせて頂き、動いております。
その後の全選択枚数のためにカウンタを加え(上記コードの直下にcnt=cnt+1)枚数を出しているのですが、更にその後の処理で選択したファイルを開く過程があるのですが、OpenFIleName(i)では開けないので、どこの段階でどのような配列に入れればよいかが解りません。つまづいております。助けてはもらえませんか?
No.5
- 回答日時:
>二回目以降の選択ファイルも配列内に組み入れ開けるようにしたい
そのためのコードですよ。。。(^^;;;
>For i = LBound(OpenFileName) To UBound(OpenFileName)は1To3となってしまい(ダイアログ二回目以降のファイルが反映されない)
それは1回目(3個選択)の選択ですからそうなるのは当然です。
1回目と2回目でそこは違ってくるのです。
まだCollectionの中がどうなってるか理解されてないようなので
1回目:ファイルを3個選択
2回目:ファイルを1個選択
全部で4個選択した場合で説明します。
1回目: myGetFiles(1) に、File1,File2,File3 が入る
2回目: myGetFiles(2) に、File4 が入る
この状態で下記のコードは、、
For Each OpenFileName In myGetFiles
For i = LBound(OpenFileName) To UBound(OpenFileName)
●先ず、myGetFiles(1) が OpenFileName に入る
myGetFiles(1) には、File1,2,3が入っているので
For i = LBound(OpenFileName) To UBound(OpenFileName)
これは、
For i= 1 to 3
になる
●次に、myGetFiles(2) が OpenFileName に入る
myGetFiles(2) には、File4 がひとつ入っているので
For i = LBound(OpenFileName) To UBound(OpenFileName)
これは、
For i= 1 to 1
になる
どうですか、ちゃんと4個のファイルを呼び出していますよね。
For Each OpenFileName In myGetFiles
For i = LBound(OpenFileName) To UBound(OpenFileName)
要するに、この2行で、4個のファイルを呼び出しているわけです
●これでも納得がいかない場合は、修正した現在のコードを
---------------------------------
'**明細の選択(複数同時)**
Do
BN = Application.InputBox("対象明細書の年月を入力してください。1桁の月は02月のように入力)", , Default:="2009.04", Type:=2)
この部分からファイルを読み込むところまで全て省略しないでアップしてください。
ここまでくれば完成したようなものです。
myRangeさんへ あれれ本当だ。何度もチェックしたつもりだったのですが、きっと同じ動作の作りかけプロシージャが隣のモジュールにあったのでそちらをチェックしていたのだと思います。
動いてます。ありがとうございました。
何度も、また遅くまでお付き合い下さったこと。そして具体的なコード及び解説まで下さり本当に感謝しております。今回のはまだ作りかけですのでこの先も近々行き詰る気がします。その際は、yokokama46
(本当はyokohama46と入力したかったけどうっかりさんなので)を質問コーナーで見かけたらまた相手して下さい。助かりました。
No.4
- 回答日時:
いま帰宅。
ちょと気になって覗いてみたら。。。(^^;;;
>’●選択したファイル開く
>For i = 1 To cnt
>Workbooks.Open OpenFileName(i) ←ここで実行時エラー 13
> 型が一致しませんとなります
それは当然のことです。
回答2のCollectionの展開にはどう書いてありますか?
For Each OpenFIleName In myGetFiles
For i = UBound(OpenFIleName) To UBound(OpenFIleName)
となってますよね。
そして、質問者は、’●myGetFilesのチェックではちゃんと
cnt = 0
For Each mySelectFile In myGetFiles
For i = LBound(mySelectFile) To UBound(mySelectFile)
こうやってますよね。
なのになぜ、ファイルをオープンするときは、
For i = 1 To cnt
Workbooks.Open OpenFileName(i)
と、For i=1 to cnt とするのでしょうか。
それから変数OpenFileNameは質問者が提示したコードにありますので
それを極力使うようにした方がいい、と当方が考えてのことです。
(変数mySelectFileはCollectionの登録のときのみ使用)
よって、変数も当方の回答のとおり使うようにしてください。
(もちろん今回のエラーは変数の問題ではありませんが)
'---------------------------------------
’●myGetFilesのチェック
▲▲変数mySelectFileをOpenFileNameに変更した▲▲
cnt = 0
For Each OpenFileName In myGetFiles
For i = LBound(OpenFileName) To UBound(OpenFileName)
cnt = cnt + 1
If OpenFileName(i) = Mypath & MyFile Then
MsgBox "同じファイルが含まれてます。", vbInformation, "同じファイルは選択出来ません"
GoTo OWARI
End If
tmp = tmp & Dir(OpenFileName(i)) & vbCrLf
Next i
Next OpenFileName
’●選択したファイルの一覧化及び数量の表示
MsgBox vbCrLf & tmp & vbCrLf & "の全" & cnt & "枚です" & vbCrLf & "これらでよろしいですか? ", vbInformation, "選択したファイルは "
’■■■選択したファイル開く■■■
For Each OpenFileName In myGetFiles
For i = LBound(OpenFileName) To UBound(OpenFileName)
Workbooks.Open OpenFileName(i)
'-----------------------------------------------
これでお分かりでしょうか?
それから、前の回答の質問に答えてないとところがありますよ。
>>どこの段階でどのような配列に入れればよいかが解りません
>また、これも言いたいことが分かりません。
>何を配列に入れるのかそれを提示してもらわないと。。
これにもちゃんと答えてもらわないといけませんね。
●Collectionの中がどうなっているのか理解してますか?
ま、この回答で完璧に理解できたとは思いますが。
理解できない部分があったら、遠慮なく質問すること。
頑張ってください。
この回答への補足
myRangeさん 何度もおつきあい有難うございます。
For Eachで開けということですよね。そうですね。理解しました。
しかし数が合わないのです。ダイアログからのファイル選択をDo Loopでまわして、つど追加という流れなのですが、UBound(OpenFileName)は常にダイアログ1回目の選択ファイル数にしかならないのです。(一回目3ファイル選択で二回目1ファイル選択だと3となり) ←4になってほしい 選択ファイルを開く部分の
For i = LBound(OpenFileName) To UBound(OpenFileName)は1To3となってしまい(ダイアログ二回目以降のファイルが反映されない)
よって開けるファイルは一回目のダイアログでの選択ファイルのみになってしまいます。
(私が間違っているのかもしれませんが)ために今回の例では1To4になるようにさせるために、別途配列に組み入れる必要があるのかなと(ReDim Preserve等で)思い
>どこの段階でどのような配列に入れればよいかが解りません
などと書き込んだのです。何か私が単純なミスでもしているのであればよいのですが。二回目以降の選択ファイルも配列内に組み入れ開けるようにしたいのです。すみませんの連発ですが、何卒見捨てずにお付き合いお願いします。
No.3
- 回答日時:
No2,myRangeです。
タイプミスがあったようですね。
ま、それはご愛嬌ということで。。(^^;;;
>選択したファイルを開く過程があるのですが、OpenFIleName(i)では開けないので
Workbooks.Open OpenFileName(i)
これで開けますよね?
これでは何か拙いことでもあるのでしょうか?
そこらは質問者以外は分かりませんので、補足が必要でしょう。
>どこの段階でどのような配列に入れればよいかが解りません
また、これも言いたいことが分かりません。
何を配列に入れるのかそれを提示してもらわないと。。
何れにしろ、処理の流れ(最初のは解決したので、その後の流れ)が
明確に読者に伝わるように詳しく説明するべきでしょう。
この回答への補足
myRangeさん お手数かけてすみません。
Workbooks.Open OpenFileName(i) で開こうとすると実行時エラー 型が一致しませんとなります。
その後の流れは、
’●myGetFilesのチェック
cnt = 0
For Each mySelectFile In myGetFiles
For i = LBound(mySelectFile) To UBound(mySelectFile)
cnt = cnt + 1
If mySelectFile(i) = Mypath & MyFile Then
MsgBox "同じファイルが含まれてます。", vbInformation, "同じファイルは選択出来ません"
GoTo OWARI
End If
tmp = tmp & Dir(mySelectFile(i)) & vbCrLf
Next
Next
’●選択したファイルの一覧化及び数量の表示
MsgBox vbCrLf & tmp & vbCrLf & "の全" & cnt & "枚です" & vbCrLf & "これらでよろしいですか? ", vbInformation, "選択したファイルは "
’●選択したファイル開く
For i = 1 To cnt
Workbooks.Open OpenFileName(i) ←ここで実行時エラー 13 型が一致しませんとなります。mySelectFile(i)に変更しても同じ結果でした。
なんとなくではありますが、myGetFilesに入れているのでその段階でOpenFileName(i)もmySelectFile(i)も情報を持たなくなっているのかな?と素人ながら思ってる次第です。お願いばかりですが、なんとか教えてはもらえないでしょうか?お願いします。
No.1
- 回答日時:
ダイヤログボックスにはご希望の機能はありません。
ダイアログボックスが開いた時点でバッファーがクリアされるので、その都度別の方法で取得して配列に保存するしか無いと思います。
hana-hana3さん 早速の回答有難うございます。
そうだったんですか。
では、提示コードのようにDo~Loopでダイアログを廻し、複数選択したときは複数を配列に順次累積させて行きたいのですが、また提示コードのようにその選択の結果のファイル名一覧及び件数をMsgBoxで表示させたいのですが、良きコードを教えて頂ければ幸いです。
お礼と共にお願いまでいたしまして恐縮ですが、良ければご教示願えませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
テキストファイルの最終行を削...
-
htmlを置換する方法とjsp表示
-
複数ファイルによる共通の外部...
-
複数のファイルからのデータの...
-
javaで例外エラーが発生した際...
-
画像読み込み時のOutOfMemory
-
Access2010の最適化設定について
-
C言語でテキストファイルに文...
-
処理負荷特定で考えられる要因...
-
VBに、Cのincludeのようなもの...
-
Excelマクロでの再読込み方法
-
マッチング処理
-
ドラッグアンドドロップでファ...
-
symantec社の製品名及び機能の違い
-
2つのファイルを比較するC言語...
-
gccでリソースファイルを使わな...
-
ファイルからサイズ不明の行デ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
バッチで118項目のCSVを処理し...
-
CSVファイルへの保存の際、デー...
-
グローバル変数のよくない使い...
-
テキストファイルの最終行を削...
-
ドラッグアンドドロップでファ...
-
VB.NETによるプロセス間通信
-
VBAにてEXCEL以外のファイル(テ...
-
分割コンパイルの#defineについて
-
ファイルの結合
-
iniファイルに追記がしたいです。
-
VBに、Cのincludeのようなもの...
-
動画処理のライブラリについて
-
Cでのネットワークファイルの読...
-
ダイアログボックスで複数フォ...
-
C言語のfopenについて教えてく...
-
「VBScript」ADODB.Streamにお...
-
マウスポインタの変更
おすすめ情報