
エクセルでまあまあの速さでディレクリを取り込むにはどうしたらよいでしょうか。
特定のディレクトリを指定して、その配下にあるファイル一覧のシートを作りたいと思っています。
VBAでFileSystemObjectオブジェクトを使って再帰的にサブルーチンを呼ぶ方法でVBAを作りました。
一応動くのですが、とてもスピードが遅いのです。
サーバー上のディレクリなのでローカルほど早くないのは当然ですが、Windowsの検索(ファイルやフォルダ)では、そこそこの速さで動きます。
Dir関数に替えてみましたが、スピードはほとんど変わりません。
エクセルでなくとも結果を記録できれば他のツールでも良いのですが、
使えるツールが非常に限られています。
職場のPCですが、Windows2000Proの初期状態にOffice2000がインストールされています。
セキュリティ上、他のソフトのインストールや使用は禁止されています。
何か良い方法はないでしょうか。
よろしくお願い申し上げます。
No.3
- 回答日時:
#2のご回答があるのに、こんな回答で、的外れかも知れませんが
どうでしょう。質問の前提を見落としていたらすみません。
100ファイルあたり1秒ぐらい。
マイドキュメントのファイルの例
strPath は自分のケースに変えてください。
Sub test01()
Dim strPath As String
Dim strFullPath As String
Dim Fname As String
i = 1
'----
strPath = "C:\Documents and Settings\xxxx\My Documents" '"ActiveWorkbook.Path '
strFullPath = strPath & "\*.*"
Fname = Dir(strFullPath)
'----
Do While Fname <> ""
Cells(i, "A") = Fname
i = i + 1
Fname = Dir()
Loop
'----
End Sub
回答ありがとうございます。
実行中もエクセルが使えそうな(実際にやってみないとわかりませんが)#1の方の案を採用し、エクセルに取り込むVBAを作成しました。
皆様ありがとうございました。
No.2
- 回答日時:
こんばんは。
KenKen_SP です。> 一応動くのですが、とてもスピードが遅いのです。
ファイルオペレーションは圧倒的に C 言語が高速ですが、VB(A) でもファイル
検索用 API が使えます。試してみてください。結構高速ですよ。
ローカル検索だと Windows の検索に近い速度ですが、ネットワーク経由の
場合、通信トラフィックの状況にかなり影響されると思いますけどね...
あとは、VB(A) なら FileSearch オブジェクトを使う方法も早いかもしれません。
しかし、挙動不安定で、さらに列挙の順番がバラバラなので使い難いです。
では。
' Declarations ----------------------------------------------------------------
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" ( _
ByVal hFindFile As Long, _
ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" ( _
ByVal hFindFile As Long) As Long
' Constants -------------------------------------------------------------------
Private Const MAX_PATH As Long = 260
Private Const INVALID_HANDLE_VALUE As Long = (-1)
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10
' Types -----------------------------------------------------------------------
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
' // ファイルを検索する(再帰呼び出し使用)
Public Sub FindFile( _
ByRef Buffer() As String, _
ByVal DirPath As String, _
ByVal SearchFileName As String, _
Optional ByVal CheckSubFolder As Boolean = False _
)
' @引 数: Buffer() String配列 ここにファイルパスが保管されます
' : DirPath 検索ルートフォルダのパス
' : SearchFileName 検索ファイル名(ワイルドカード OK)
' : [CheckSubFolder] 省略可 サブフォルダも検索するか?
Dim WFD As WIN32_FIND_DATA
Dim hFind As Long
Dim i As Long
Dim j As Long
Dim DirName As String
Dim FileName As String
Dim SubFolders() As String
' パス終端の補正
If Right$(DirPath, 1) <> "\" Then DirPath = DirPath & "\"
' サブフォルダ列挙
i = -1
If CheckSubFolder Then
hFind = FindFirstFile(DirPath & "*", WFD)
If hFind <> INVALID_HANDLE_VALUE Then
Do
DirName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1)
If DirName <> "." And DirName <> ".." Then
If CBool(WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then
i = i + 1
ReDim Preserve SubFolders(i)
SubFolders(i) = DirPath & DirName
End If
End If
Loop Until FindNextFile(hFind, WFD) = 0
FindClose (hFind)
End If
End If
' ファイル列挙
hFind = FindFirstFile(DirPath & SearchFileName, WFD)
If hFind <> INVALID_HANDLE_VALUE Then
Do
FileName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1)
If FileName <> "." And FileName <> ".." Then
If CBool(WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = False Then
On Error Resume Next
j = UBound(Buffer) + 1
If Err Then j = 0
On Error GoTo 0
ReDim Preserve Buffer(j)
' ここでファイルパス+ファイル名で返してます
Buffer(j) = DirPath & FileName
j = j + 1
End If
End If
Loop Until FindNextFile(hFind, WFD) = 0
FindClose (hFind)
End If
' サブフォルダ探索
If CheckSubFolder And i > -1 Then
For i = 0 To UBound(SubFolders)
' サブフォルダ再帰呼び出し
Call FindFile(Buffer, _
SubFolders(i), _
SearchFileName, _
CheckSubFolder)
Next i
End If
End Sub
' // 使い方サンプル
Sub Sample()
Dim Buf() As String
Dim i As Long
' 全ファイルの列挙なら検索ファイル名を *.* にする
Call FindFile(Buf(), "C:\", "*.bmp", True)
' 出力
On Error Resume Next
i = UBound(Buf) + 1
On Error GoTo 0
If i = 0 Then
MsgBox "該当ファイルは見つかりません", vbExclamation
Else
If i > Rows.Count Then
ReDim Preserve Buf(Rows.Count)
MsgBox "該当ファイルは" & Format$(i, "#,##0") & "件" & vbLf _
& "全件表示できません", vbInformation
End If
With ActiveSheet
.Cells.Delete
.Cells(1, 1).Resize(i).Value = Application.Transpose(Buf)
End With
End If
End Sub
この回答への補足
自宅で実行しました。速いですね。
tree /f結果をエクセルに取り込むVBAを書くか、貴殿のVBAを打ち込むか悩ましいところですね。
長いプログラム、あありがとうございます。
頑張って打ち込んでみます。
何せ勤め先のセキュリティはとても厳しく、インターネットに接続できませんし、FD、CD、メモリースティックもアラームがでます。
ひたすら打ち込むしかありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Latexで図番号だけを「図1.1」...
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
バッチ処理で追記コピーしたい
-
.NETアプリを作ったときの .man...
-
#include <Windows.h>というヘ...
-
監視ツールを入れさせられまし...
-
jarファイル
-
○○○.zip.001というファイルが開...
-
CRCが一致する確率
-
公文書のxmlファイルの開き方が...
-
既にファイルが開いているのな...
-
VBAでのicsファイル変換
-
Batファイルをバイナリ形式にす...
-
リンクの張り付けかたを教えて...
-
「営業秘密の漏洩」について
-
ファイルを複数選択して・・・
-
VB6 でSSH接続がしたい
-
vbsにてショートカットが存在す...
-
既に開いているエクセルを閉じ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#include <Windows.h>というヘ...
-
コマンドプロンプトで作成日時...
-
アクセス 壊れた? 「ファイ...
-
binファイルを解凍したいの...
-
.NETアプリを作ったときの .man...
-
リンクの張り付けかたを教えて...
-
Latexで図番号だけを「図1.1」...
-
jarファイル
-
監視ツールを入れさせられまし...
-
自分で作成した重要ファイルを...
-
コマンドプロンプトで、指定し...
-
C言語---ファイルに出力したデ...
-
公文書のxmlファイルの開き方が...
-
「ブルーファイル」と「グリー...
-
HTMLからのBATファイル実行
-
CSVから指定行だけを読み込み
-
ファイルが開かれているかどう...
-
warファイルをEclipseでプロジ...
-
exeファイルの中身を見る方法は...
-
VB6 でSSH接続がしたい
おすすめ情報