現在、VB6で例えば、C:\aaa\bbb\ccc\配下のxlsファイルを、
絞込み検索ができるように、計4つのチェックボックスを設けて、作成しようと思っております。
仮に1つ目のチェックでaaaフォルダの絞込み条件、2つ目のチェックでbbbフォルダの絞込み条件、3つ目と4つ目のチェックでcccフォルダ配下のxlsファイルの絞込み条件といった内容で、絞込み検索させようと考えております。
そこで、「1つ目のチェックボックスだけにチェックが入っていれば・・・」とか、「1つ目と4つ目のチェックボックスだけにチェックが入っていれば・・・」とかの各条件式をコーディングしていこうと思うのですが、IF文を用いると、かなりの複雑な内容となり、かなり見づらいプログラムとなってしまいます。
何か簡単に4つの各条件式を、簡略化してコーディングする方法があれば、
具体的にご教授ください(VB初心者なもので・・・)。
宜しくお願い致します。
再起処理について調べて見るといいかも。
×再起処理
○再帰処理
楽にやるなら Like 演算子と FSO.GetFolder かな...
以下を改良するとか。
http://jeanne.wankuma.com/tips/directory/15-getallfiles.html
じゃんぬねっとさんの紹介のホームページ上のソースを参考にして、
絞込みファイル検索は完了いたしました。
ついでにお伺いしたいのですが、あるフォルダ配下の、変数付きフォルダを
検索して、そのフォルダ内のファイルをコピーするというプログラムも
作成したいのですが、どのようにコーディングすれば
よろしいのでしょうか?
紹介のホームページ上の再帰処理を、ファイル検索と同様な感じで用いる
のでしょうか?
ご教授お願い致します。
こんにちは、じゃんぬ です。
ご、ごめんなさい... m(_ _)m
「変数付きフォルダ」って何なのかが、わからなかったです... (^-^A)
やりたいこととしては・・・
form上でテキストボックスに入力した数字を変数として、
その変数(入力した数字)が入っているフォルダを、ある階層のパスから
検索開始して、ヒットしたいくつかのフォルダ内のxlsファイルを別の
フォルダへ格納する、といったことをしたいと考えております。
以上の説明で、やろうとしていること、「変数付きフォルダ」の意味は
分かりましたでしょうか?
ご教授お願い致します。
>その変数(入力した数字)が入っているフォルダ
どこに?…が大事なんですが?
もし、フォルダ名にある文字列を含む事を意味するならそう書くべきだし、
フォルダ内のファイル名やフォルダ名にある文字列を含む事を意味するならそう書くべきだし、
更に、ファイルのデータの中にある文字列を(以下略)
フォルダの権限や作成日に(以下略)
いずれにしろ『変数付きフォルダ』という言葉では結びつかない。
自分しか分からない言葉を使うべきではない。
他人が理解できる言葉で書いて下さい。
ノ<「変数付きフォルダ」の説明が少し判りづらかったので、脳内コンパイルしてみますた(ぉ
・動的に決定されるパス
と、いうこと?
※なんだか誤爆の悪寒…
具体的に例をあげるとわかりやすいかも。
例えば変数に123という数字が入っていたら、ある階層が"C:\hogehoge\"とすると
以下のどのフォルダを取得出来ればいいのでしょうか?
"C:\hogehoge\123\"
"C:\hogehoge\data123\"
"C:\hogehoge\123456\"
"C:\hogehoge\01234\"
"C:\hogehoge\data\123\"
"C:\hogehoge\data\123456\"
"C:\hogehoge\data\01234\"
「変数付きフォルダ」というのは、忘れてください。すみません。
具体的に例をあげますと、
ある階層というのが"C:\temp\"だとします。
form上で仮に"20050325"と入力したら、それを変数(strDate)とし、
C:\temp\"から検索開始して、
①"C:\temp\20050325123456\"
②"C:\temp\20050325654321\"
③"C:\temp\20050325341256\"
④"C:\temp\data\2005032512\"
⑤"C:\temp\data\data1\20050325999\"
⑥"C:\temp\data\data1\20050111999\"
というフォルダが存在していれば、"20050325"という名の入ったフォルダ(①〜⑤)全てのパスを返して欲しいという事がしたいのですが、
検索対象のフォルダ名を"\"& strDate &"*\"としても、
「パスが見つかりません」というエラーが発生し、検索がうまくいきませんでした。
じゃんぬねっとさんの紹介のHP上の再帰処理構文を引用して、
*を用いた絞込みファイル検索はできたのですが、
検索対象がフォルダになった場合に、どのようにコーディングしていいのか、
分からないといった状況です。
そもそも↑の再帰処理構文を用いてフォルダ検索を使用とするのが、
間違っているのでしょうか?
それとも、アスタリスクの用い方や、
フォルダ検索でのアスタリスク等に何か問題があるのでしょうか?
ご教授願います。
え? アスタリスク?
どうやって Like 検索をしているんでしょうか?
> 検索対象がフォルダになった場合に、どのようにコーディングしていいのか、
対象が違うだけで原理は同じだと思いますよ?
ノ<じゃんぬねっとさん、あの節はお世話になりますたw
俺なら、
1下層フォルダの完全パスをコレクションとして列挙するメソッドAで、
下層フォルダの完全パスを取得
2下層フォルダの完全パス全てに対して、
「含まれて欲しい名前」をInstr()で位置を検索し、
戻り値が0以外の場合に(ry
もしくは、下層フォルダを一つ一つ列挙していく合間に、
Instr()で含まれているかを考える。
などを考えますねぇ…
※ぁぁ…喉が痛くて鼻水が…(orz
誤爆かもしれません、でゎ
じゃんぬねっとさんのHP上の使用例を引用して例に挙げると、
' 必要な変数を宣言する
Dim lIndex As Long
Dim nPrompt As String
Dim nFilePath As String
Dim nFilePathes() As String
' フォルダ名に「strDate(=20050325)」を含み、」のファイルを最下層まで検索し取得する
strDate = 20050325
nFilePathes() = GetFilesMostDeep("C:\temp\", "\"& strDate &"*\")
' 取得したファイル名を列挙する (※ 添字が 1 からであることに注意)
For lIndex = 1 To UBound(nFilePathes())
nPrompt = nPrompt & nFilePathes(lIndex) & vbNewLine
Next lIndex
といった感じで検索してみたのですが、このような記述の仕方ですと、
まずいのでしょうか?
ファイルの検索ですと、例えば「"\"& strDate &"*\"」の部分を
「""& strDate &"*.xls"」と記述したところ、
20050325の数字を含むxlsファイルのパスが返ってきたのですが・・・。
「"\"& strDate &"*\"」の記載方法がまずいのでしょうか?
なるほど、私のサンプルソースをそのまま流用しているのですか?
GetDirectoriesMostDeep() なる名前になってないところをみると、
まさか、そのまま使ってらっしゃる?
GetDirectoriesMostDeep() の存在を全く分かっていなかったため、
そのまま使っていました。
非常に恐縮なのですが、GetDirectoriesMostDeep() のFunction構文を
ご教授願いたいのですが・・・。
どこかのサイトに詳細が載っていますか?
コマンドプロンプトかShell関数で
Tree C:\temp > C:\tree.txt
とか
Dir C:\temp /S /B > Dir.txt
とかのDOSコマンド発行して、
できたファイルを文字列検索したほうが手っ取り早かったりして・・・。
じゃんぬねっとさんのサンプルソースを理解してれば、その応用で出来るはず
なんですが・・・。
こんな感じでしょうか。
勝手に改造しちゃいました(^^;
でも試してないのでうまくいかないかも
Public Function GetFoldersMostDeep(ByVal nRootPath As String, ByVal nPattern As String) As String()
Dim lCopy As Long
Dim lIndex As Long
Dim lBounds As Long
Dim nReturns() As String
Dim nFilePathes() As String
Dim hRootFolder As Folder
Dim hSubFolder As Folder
' 0 の要素だけ確保しておく (Nothing が使えないため)
ReDim nReturns(0)
' 検索文字列をすべて大文字にする (Like 演算子が大文字・小文字を区別するため)
nPattern = StrConv(nPattern, vbUpperCase)
' FileSystemObject の新しいインスタンスを生成する
Dim Fso As FileSystemObject
Set Fso = New FileSystemObject
' Folder オブジェクトを取得する
Set hRootFolder = Fso.GetFolder(nRootPath)
' このディレクトリ内のすべてのサブディレクトリを検索する (再帰)
For Each hSubFolder In hRootFolder.SubFolders
If StrConv(hSubFolder.Name, vbUpperCase) Like nPattern Then
lIndex = lIndex + 1
ReDim Preserve nReturns(lIndex)
nReturns(lIndex) = nRootPath & "\" & hSubFolder.Name
nFilePathes() = GetFoldersMostDeep(hSubFolder.Path, nPattern)
' ファイルが格納されている要素数を取得する
lBounds = UBound(nFilePathes())
For lCopy = 1 To lBounds
If StrConv(Fso.GetFolder(nFilePathes(lCopy)).Name, vbUpperCase) Like nPattern Then
lIndex = lIndex + 1
ReDim Preserve nReturns(lIndex)
nReturns(lIndex) = nFilePathes(lCopy)
End If
Next lCopy
Next hSubFolder
' 不要になった時点で破棄する
Set Fso = Nothing
Set hSubFolder = Nothing
Set hRootFolder = Nothing
' 取得したすべてのフォルダを返す
GetFoldersMostDeep = nReturns
End Function
LESIAさん、Function構文を挙げていただき、どうもありがとうございました。
例えば""C:\temp\" & m_strDate & "9999\""より検索開始し、"*.xls"ファイルの全てを、"C:\temp\"フォルダ配下へコピーするといった事をしたい時、
じゃんぬねっとさんのFunction構文を定義しておいて、
Option Explicit
'オブジェクト,変数の宣言
Dim m_strDate As String '年月日
Dim nRootPath As String '検索開始位置
Dim nPattern As String '検索対象ファイル
'検索処理開始
Private Sub cmdSyori_Click()
Dim Fso
Dim lCopy As String
Dim lIndex As Long
Dim lBounds As String
Dim nReturns() As String
Dim nFilePath As String
Dim nFilePathes() As String
'★★ファイル検索開始★★
'ファイル検索開始位置指定
nRootPath = "C:\temp\" & m_strDate & "9999\"
'検索対象ファイル指定
nPattern = "*.xls"
'ファイル名に「nPattern(変数)」を含むファイルを、
'nRootPathフォルダ配下よりスタートし、最下層まで検索し取得する
nFilePathes() = GetFilesMostDeep(nRootPath, nPattern)
'該当のファイルが検索できなかった(存在しなかった)場合
If lIndex = 1 Then
MsgBox ("該当のファイルが存在しませんでした。")
'該当のファイルが検索できた(存在した)場合
Else
' 取得したファイルを列挙し、c:\tempフォルダ配下へコピーする。 (※ 添字が 1 からであることに注意)
For lIndex = 1 To UBound(nFilePathes())
Set Fso = CreateObject("Scripting.FileSystemObject")
Fso.CopyFile nFilePathes(lIndex), "c:\temp\"
Next lIndex
'コピーしたファイル数を表示する。
MsgBox ("合計 " & lIndex - 1 & " 個のファイルをコピーしました。")
End If
End Sub
とコーディングしてみたら、うまく*.xlsファイルを取得することができたのですが、
LESIAさんのFunction構文を用いて、
『"C:\temp\"配下の"m_strDate(=20050325)"が入っているフォルダを検索し、
そのフォルダ配下の"*.xls"ファイルを、"c:\temp\"配下に格納する』ということをしたい場合、
上記をどのように編集すればよろしいでしょうか?
じゃんぬねっとさんの構文をなんとなく理解しながらそのまま用いていたので、
LESIAさんの構文をどのように利用すればよいかわからないので、
ご教授願います。
こんな感じ。
Dim Fso AsFileSystemObject
Dim nRootPath As String
Dim nPattern As String
Dim nFilePathes() As String
Dim lIndex As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
nRootPath = "C:\temp\"
nPattern = "*" & m_strDate & "*"
nFilePathes() = GetFoldersMostDeep(nRootPath, nPattern)
'フォルダが存在しない場合、UBound(nFilePathes())=0でループが
'実行されないので、If文でチェックする必要は無い
For lIndex = 1 To UBound(nFilePathes())
Fso.CopyFile nFilePathes(lIndex) & "\*.xls", "c:\temp\"
Next lIndex
LESIAさんやじゃんぬねっとさん、その他の方々、
どうもご親切にご教授くださいまして、ありがとうございました。
なんとか、絞込み検索は求めていたものを完成させることができました。
本当にありがとうございました。
ツイート | ![]() |