- ベストアンサー
FileListBoxでの複数ファイル選択
FileListBoxコントロールのMultiSelectプロパティを「2-拡張」にして、 CtrlやShiftを併用することでファイルを複数選択できるようにしました。 とりあえず動作確認段階なので、ファイル選択状態でCommandButtonを押下することで、ファイル名を表示するようにしたいのですが、 Msgbox (File1.FileName) ※File1はFileListBoxコントロール名 では、当たり前の事ながら、(複数選択したうちの)1ファイルしか表示されません。FileNameプロパティにインデックスを付けるなど素人考えで色々当たってみたのですが、どうも上手くいきません。 選択した全てのファイル名をフルパスで取得したいのですが、何かいいテクニックはないでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
k_o_j_iさん、こんばんは! Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub File1_PathChange() Dir1.Path = File1.Path End Sub Private Sub Command1_Click() For I = 0 To File1.ListCount - 1 If File1.Selected(I) Then Debug.Print Dir1.Path & "\" & File1.List(I) Next I End Sub でフルパスで選択したファイル名が表示されます。
その他の回答 (3)
- tinu 2000(@tinu2000)
- ベストアンサー率40% (147/367)
k_o_j_iさん、おはようございます。 選択ファイル数のプロパテイがあるかどうか、しりませんので、専門家の方、教えて下さい。 ReDim TBL(File1.ListCount) とその時の最大配列ではマズイのでしょうか? 選択した数の分だけの配列にしなくてはいけない理由がわかりませんが、 どうしてもそうであれば、2回ループでしょうね。 ループ処理を少なくしたいのであれば、 ReDim TBL(j) とループの中で ReDim する方法もあるけど、何か本末転倒のような気がします。
お礼
おはようございます!(もうすっかり晩ですが 笑) >ReDim TBL(File1.ListCount) >とその時の最大配列ではマズイのでしょうか? 割り当てられるメモリ量などは大したこと無いでしょうから、 それでもいいのですが、出来れば一旦配列変数に全選択ファイル名を格納して、 処理の前に「○個のファイルを処理します」といったメッセージを 入れたかったんです。 >ループ処理を少なくしたいのであれば、 >ReDim TBL(j) >とループの中で ReDim する方法もあるけど、何か本末転倒のような気がします。 ループ2回まわしか、ループ内でRedim Preserveを使うか、の二者択一ですね。 とりあえず今回は後者採用でいってみたいと思います。 どうも色々とありがとうございました。
- KojiS
- ベストアンサー率46% (145/312)
> ところでここで取得したファイル名を1つずつ配列変数に格納したいのですが、 > 配列変数を宣言するときにはあらかじめ選択ファイル数がわかっている必要があります。 > こういう場合は、やはりFor~Next文2回まわし(1回目で選択ファイル数取得、Redimでその数字を変数の次元に指定、2回目で配列変数に各ファイル名を格納)しかないのでしょうか? > 出来ればループ処理は少なくしたいのですが…… > これもヘルプの Redimにのっていると思うのですが、preserveという宣言方法があります。
お礼
ご教授いただきどうもありがとうございます。 Redim preserve 変数(idx) で、変数の内容を保持したまま、再定義が出来るんですね。 となると、やはり Option Base 1 Dim strFileName() As String j = 1 For I = 0 To File1.ListCount - 1 Redim Preserve strFileName(j) If File1.Selected(I) Then strFileName(j) = Dir1.Path & "\" & File1.List(I) j = j + 1 End If Next I の様にループ内部でRedim Preserveを使うのが良さそうですね。
- KojiS
- ベストアンサー率46% (145/312)
たぶんVB6だと思いますが、ヘルプに書かれていませんか?キーワードは「Selected」です。 VB6は内容は全てヘルプに書かれています。 ヘルプに書かれていない内容は「サポート情報」を別にして誰にもわかりません。
補足
おっしゃるとおり、HELPに書かれていました。 下にも書きましたが、Selectedプロパティの例文が ListBox主体に書かれていたので、気が付きませんでした。 >ヘルプに書かれていない内容は「サポート情報」を別にして >誰にもわかりません。 VisualStudio6.0のHELPは確かに充実していますが、 「こういう処理をやりたい」という場合、 キーワードがわからないとかなり難渋するのが玉に瑕です……。
お礼
即座の回答どうもありがとうございます。 >For I = 0 To File1.ListCount - 1 >If File1.Selected(I) Then Debug.Print Dir1.Path & "\" & File1.List(I) >Next I ListBoxと同じやり方なのですね。 FileNameプロパティに拘泥しすぎてしまったようです。 実行してみたところ上手くいきました。 ところでここで取得したファイル名を1つずつ配列変数に格納したいのですが、 配列変数を宣言するときにはあらかじめ選択ファイル数がわかっている必要があります。 こういう場合は、やはりFor~Next文2回まわし(1回目で選択ファイル数取得、Redimでその数字を変数の次元に指定、2回目で配列変数に各ファイル名を格納)しかないのでしょうか? 出来ればループ処理は少なくしたいのですが……