FileListBoxコントロールのMultiSelectプロパティを「2-拡張」にして、
CtrlやShiftを併用することでファイルを複数選択できるようにしました。

とりあえず動作確認段階なので、ファイル選択状態でCommandButtonを押下することで、ファイル名を表示するようにしたいのですが、

Msgbox (File1.FileName) ※File1はFileListBoxコントロール名

では、当たり前の事ながら、(複数選択したうちの)1ファイルしか表示されません。FileNameプロパティにインデックスを付けるなど素人考えで色々当たってみたのですが、どうも上手くいきません。

選択した全てのファイル名をフルパスで取得したいのですが、何かいいテクニックはないでしょうか?

A 回答 (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

でフルパスで選択したファイル名が表示されます。
    • good
    • 0
この回答へのお礼

即座の回答どうもありがとうございます。
>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回目で配列変数に各ファイル名を格納)しかないのでしょうか?
出来ればループ処理は少なくしたいのですが……

お礼日時:2001/04/12 23:53

k_o_j_iさん、おはようございます。



選択ファイル数のプロパテイがあるかどうか、しりませんので、専門家の方、教えて下さい。

ReDim TBL(File1.ListCount)
とその時の最大配列ではマズイのでしょうか?

選択した数の分だけの配列にしなくてはいけない理由がわかりませんが、
どうしてもそうであれば、2回ループでしょうね。

ループ処理を少なくしたいのであれば、
ReDim TBL(j)
とループの中で ReDim する方法もあるけど、何か本末転倒のような気がします。
    • good
    • 0
この回答へのお礼

おはようございます!(もうすっかり晩ですが 笑)

>ReDim TBL(File1.ListCount)
>とその時の最大配列ではマズイのでしょうか?
割り当てられるメモリ量などは大したこと無いでしょうから、
それでもいいのですが、出来れば一旦配列変数に全選択ファイル名を格納して、
処理の前に「○個のファイルを処理します」といったメッセージを
入れたかったんです。

>ループ処理を少なくしたいのであれば、
>ReDim TBL(j)
>とループの中で ReDim する方法もあるけど、何か本末転倒のような気がします。
ループ2回まわしか、ループ内でRedim Preserveを使うか、の二者択一ですね。
とりあえず今回は後者採用でいってみたいと思います。
どうも色々とありがとうございました。

お礼日時:2001/04/13 21:24

> ところでここで取得したファイル名を1つずつ配列変数に格納したいのですが、


> 配列変数を宣言するときにはあらかじめ選択ファイル数がわかっている必要があります。
> こういう場合は、やはりFor~Next文2回まわし(1回目で選択ファイル数取得、Redimでその数字を変数の次元に指定、2回目で配列変数に各ファイル名を格納)しかないのでしょうか?
> 出来ればループ処理は少なくしたいのですが……
>
これもヘルプの Redimにのっていると思うのですが、preserveという宣言方法があります。
    • good
    • 0
この回答へのお礼

ご教授いただきどうもありがとうございます。
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を使うのが良さそうですね。

お礼日時:2001/04/13 21:22

たぶんVB6だと思いますが、ヘルプに書かれていませんか?キーワードは「Selected」です。


VB6は内容は全てヘルプに書かれています。
ヘルプに書かれていない内容は「サポート情報」を別にして誰にもわかりません。

この回答への補足

おっしゃるとおり、HELPに書かれていました。
下にも書きましたが、Selectedプロパティの例文が
ListBox主体に書かれていたので、気が付きませんでした。

>ヘルプに書かれていない内容は「サポート情報」を別にして
>誰にもわかりません。
VisualStudio6.0のHELPは確かに充実していますが、
「こういう処理をやりたい」という場合、
キーワードがわからないとかなり難渋するのが玉に瑕です……。

補足日時:2001/04/12 23:54
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

QFileListBoxコントロールで扱えるファイル数は?

こんにちは。
いつもお世話になっております。

VBのFileListBoxコントロールで扱えるファイル数はいくつまでなのでしょうか?
6万ファイルがあるフォルダへのパスを「.path」プロパティにセットしたところ、
「.ListCount」に負の値がセットされたので6万ファイルは扱えないようなのですが。
ヘルプなどを見ても明記されていませんのではっきりとした数が分かりません。
ご存知の方がいましたらご教示下さい。

<環境>
Windows 2000, VB6.0

Aベストアンサー

ちと手元に VB 6.0 が無いので推測なんですが、FileListBox コントロールの ListCount プロパティの型は Integer だったと思うので整数は 32,767までしか表せなかったかと思います。

参考URL:http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200208/02080030.txt

QFileListBox で選択したファイルの文字列をコピーしたい

VB6のプログラムを
VB2010にしています。
VB6では
S$ = File1.List(File1.ListIndex)
いいのですが
VB2010ではプレフィックス型にして
strS = FileListBox1.List(FileListbox1.ListIndex)
でエラーになります。

Aベストアンサー

strS = FileListBox1.FileName
でどうでしょうか?

Qダイアログボックスで複数フォルダの複数ファイルの選択

ダイアログボックスで複数フォルダの複数ファイルの選択がうまくいきません。
単一フォルダ内からの複数ファイルの選択は機能しているのですが、ダイアログボックスで他のフォルダを選択して他のファイルを選択すると最終的に選択したファイルのみが残り、先に選択した分が累積されません。  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, "選択したファイルは "

ダイアログボックスで複数フォルダの複数ファイルの選択がうまくいきません。
単一フォルダ内からの複数ファイルの選択は機能しているのですが、ダイアログボックスで他のフォルダを選択して他のファイルを選択すると最終的に選択したファイルのみが残り、先に選択した分が累積されません。  OpenFileNameが上書きされるのが原因な気がするのですが配列への累積処理が解りません。
その後の処理で選択したファイルを全て開いて加工したいので、累積させる方法を知りたいのです。下記コードはLoop処理で行おう...続きを読む

Aベストアンサー

方法はいくつかあるでしょうが、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に登録するときチェック済
 
 

方法はいくつかあるでしょうが、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 & "\...続きを読む

QFileListBoxコントロールに横スクロールバーを表示したい

こんにちは。
いつもお世話になっております。

早速ですが質問させてください。
VBのFileListBoxコントロールに横スクロールバーを追加したいのですが
どうしたらよいでしょうか?
ファイル名が途中で切れてしまって困っています。
縦スクロールは自動的に出てくるのですが・・・。

環境:Windows 2000, VB6.0

Aベストアンサー

FileListBoxへの横スクロールバーの追加はわかりませんが
ListBoxコントロールをFileListBoxの代りに使ってみてはどうでしょう。

ListBoxコントロールに横スクロールバーを追加するのは下記を参考にすればいいでしょう。http://frog.raindrop.jp/knowledge/archives/000809.html

参照先のフォルダ内のファイル名を取得してListBoxに追加すれば、FileListBoxモドキができると思います。

Q複数コントロール(ラベル)を選択し、ドラッグアンドドロップする方法

W2K、VB6でタイトルの機能を作りたいです。
イメージはVBのフォームデザインです。今回は単純にラベルのみです。
ラベル一つなら、簡単ですが、複数となるといくつ試してみたが全然うまくできなかった。ご存知の方、是非教えて下さい。
宜しくお願いします。

Aベストアンサー

移動開始→MouseDown
 ※現在のMouseのXY座標取得し変数にセット
 ※各移動対象オブジェクトの現在座標を変数にセット
 ※モジュール内フラグ変数 = TRUE

移動中→MouseMove(モジュール内フラグ変数=TRUE時)
 ※MouseのXYの取得
 ※移動開始時のマウス座標と現在のマウス座標の移動ベクトル量(差分)を取得
 ※各移動対象オブジェクトの取得してあった座標にその差分を反映

移動終了→MouseUp
 モジュール内フラグ変数=FALSE

という処理だと思うのですが、1つでも複数でも処理の違いがないように思うのは私だけ?1つならうまくいったのですよね?
何に詰まったのか、よくわかりません。


このカテゴリの人気Q&Aランキング

おすすめ情報