回答編集履歴
3
説明修正
answer
CHANGED
@@ -31,16 +31,15 @@
|
|
31
31
|
|
32
32
|
さらに、改善させるには、
|
33
33
|
全ての行のデータを配列にいれて一気に代入するとさらに高速化できますが、
|
34
|
-
ハイパーリンクとかは無理なので、ハイパーリンクは後から
|
34
|
+
ハイパーリンクとかは無理なので、ハイパーリンクは後から設定するとかの工夫は必要になります。
|
35
|
-
サブフォルダーの部分はサイズが一定しないのであとからするとか、
|
36
|
-
の工夫は必要になります。
|
37
35
|
|
38
36
|
---
|
39
|
-
全ての行のデータを配列にいれて一気に代入する方法をぼち
|
37
|
+
全ての行のデータを配列にいれて一気に代入する方法をぼちぼち書いていたら、既に他の方から回答がいろいろついてしまいましたね。
|
40
38
|
|
41
39
|
配列は10万行固定の無理やりのものです(;^_^A
|
42
40
|
行方向は増やせないし、縦横変換も面倒なので、、、
|
43
|
-
|
41
|
+
フォルダー単位で書き出してますので、1フォルダー内のファイルが10万を超えるとエラーになります。
|
42
|
+
手抜きです。
|
44
43
|
|
45
44
|
```vba
|
46
45
|
Sub FolderScript1()
|
@@ -48,12 +47,12 @@
|
|
48
47
|
Application.ScreenUpdating = False
|
49
48
|
|
50
49
|
Dim StartRow As Long, ws As Worksheet
|
51
|
-
Set ws = ThisWorkbook.Worksheets("
|
50
|
+
Set ws = ThisWorkbook.Worksheets("FileList")
|
52
51
|
StartRow = 3
|
53
52
|
|
54
|
-
Fileshow1 Range("B2").Value, StartRow
|
53
|
+
Fileshow1 ws.Range("B2").Value, ws, StartRow
|
55
54
|
|
56
|
-
With ThisWorkbook.Worksheets("
|
55
|
+
With ThisWorkbook.Worksheets("FileList").Range("B3:B" & StartRow)
|
57
56
|
.Formula = .Value
|
58
57
|
End With
|
59
58
|
|
@@ -77,7 +76,7 @@
|
|
77
76
|
|
78
77
|
|
79
78
|
Dim FileDatas() As String
|
80
|
-
ReDim FileDatas(1 To
|
79
|
+
ReDim FileDatas(1 To 10000, 1 To 8) As String
|
81
80
|
|
82
81
|
Dim i As Long
|
83
82
|
i = 0
|
@@ -96,7 +95,7 @@
|
|
96
95
|
Dim aSubFolders, aSubFolder
|
97
96
|
aSubFolders = Split(FileDatas(i, 7), "\")
|
98
97
|
If UBound(aSubFolders) > UBound(FileDatas, 2) - 7 Then
|
99
|
-
ReDim Preserve FileDatas(1 To
|
98
|
+
ReDim Preserve FileDatas(1 To 10000, 1 To UBound(aSubFolders) + 7)
|
100
99
|
End If
|
101
100
|
|
102
101
|
Dim c As Long
|
@@ -105,12 +104,13 @@
|
|
105
104
|
Next
|
106
105
|
Next
|
107
106
|
|
108
|
-
ws.Cells(StartRow, 2).Resize(i, UBound(FileDatas, 2)).Value = FileDatas
|
109
107
|
|
108
|
+
If i > 0 Then ws.Cells(StartRow, 2).Resize(i, UBound(FileDatas, 2)).Value = FileDatas
|
109
|
+
|
110
110
|
StartRow = StartRow + i
|
111
111
|
|
112
112
|
For Each objSub In objFolder.SubFolders
|
113
|
-
Fileshow1 objSub.Path, StartRow
|
113
|
+
Fileshow1 objSub.Path, ws, StartRow
|
114
114
|
Next
|
115
115
|
|
116
116
|
End Sub
|
2
コード追記
answer
CHANGED
@@ -33,4 +33,85 @@
|
|
33
33
|
全ての行のデータを配列にいれて一気に代入するとさらに高速化できますが、
|
34
34
|
ハイパーリンクとかは無理なので、ハイパーリンクは後からせっていするとか、
|
35
35
|
サブフォルダーの部分はサイズが一定しないのであとからするとか、
|
36
|
-
の工夫は必要になります。
|
36
|
+
の工夫は必要になります。
|
37
|
+
|
38
|
+
---
|
39
|
+
全ての行のデータを配列にいれて一気に代入する方法をぼちぽち書いていたら、既に他の方から回答がいろいろついてしまいました。
|
40
|
+
|
41
|
+
配列は10万行固定の無理やりのものです(;^_^A
|
42
|
+
行方向は増やせないし、縦横変換も面倒なので、、、
|
43
|
+
10万ファイルを超えるとエラーになります。
|
44
|
+
|
45
|
+
```vba
|
46
|
+
Sub FolderScript1()
|
47
|
+
Application.Calculation = xlCalculationManual
|
48
|
+
Application.ScreenUpdating = False
|
49
|
+
|
50
|
+
Dim StartRow As Long, ws As Worksheet
|
51
|
+
Set ws = ThisWorkbook.Worksheets("FileList2")
|
52
|
+
StartRow = 3
|
53
|
+
|
54
|
+
Fileshow1 Range("B2").Value, StartRow
|
55
|
+
|
56
|
+
With ThisWorkbook.Worksheets("FileList2").Range("B3:B" & StartRow)
|
57
|
+
.Formula = .Value
|
58
|
+
End With
|
59
|
+
|
60
|
+
Application.Calculation = xlCalculationAutomatic
|
61
|
+
Application.ScreenUpdating = True
|
62
|
+
End Sub
|
63
|
+
|
64
|
+
Public Sub Fileshow1(ByVal strPath As String, ws As Worksheet, ByRef StartRow As Long)
|
65
|
+
|
66
|
+
Dim objSub As Object
|
67
|
+
Dim strList() As String
|
68
|
+
|
69
|
+
Dim rr As Range
|
70
|
+
Dim bb
|
71
|
+
Dim y As Integer
|
72
|
+
Dim col As Integer
|
73
|
+
|
74
|
+
Dim objFso As Object, objFolder As Object
|
75
|
+
Set objFso = CreateObject("scripting.Filesystemobject")
|
76
|
+
Set objFolder = objFso.GetFolder(strPath)
|
77
|
+
|
78
|
+
|
79
|
+
Dim FileDatas() As String
|
80
|
+
ReDim FileDatas(1 To 100000, 1 To 8) As String
|
81
|
+
|
82
|
+
Dim i As Long
|
83
|
+
i = 0
|
84
|
+
|
85
|
+
Dim objFile As Object
|
86
|
+
For Each objFile In objFolder.Files
|
87
|
+
i = i + 1
|
88
|
+
FileDatas(i, 1) = "=HYPERLINK(""" & objFile.Path & """,""" & objFile.Name & """)"
|
89
|
+
FileDatas(i, 2) = objFile.Type
|
90
|
+
FileDatas(i, 3) = Int(objFile.Size / 1024)
|
91
|
+
FileDatas(i, 4) = objFile.DateCreated
|
92
|
+
FileDatas(i, 5) = objFile.DatelastAccessed
|
93
|
+
FileDatas(i, 6) = objFile.DateLastModified
|
94
|
+
FileDatas(i, 7) = objFile.ParentFolder.Path
|
95
|
+
|
96
|
+
Dim aSubFolders, aSubFolder
|
97
|
+
aSubFolders = Split(FileDatas(i, 7), "\")
|
98
|
+
If UBound(aSubFolders) > UBound(FileDatas, 2) - 7 Then
|
99
|
+
ReDim Preserve FileDatas(1 To 100000, 1 To UBound(aSubFolders) + 7)
|
100
|
+
End If
|
101
|
+
|
102
|
+
Dim c As Long
|
103
|
+
For c = 1 To UBound(aSubFolders)
|
104
|
+
FileDatas(i, c + 7) = aSubFolders(c)
|
105
|
+
Next
|
106
|
+
Next
|
107
|
+
|
108
|
+
ws.Cells(StartRow, 2).Resize(i, UBound(FileDatas, 2)).Value = FileDatas
|
109
|
+
|
110
|
+
StartRow = StartRow + i
|
111
|
+
|
112
|
+
For Each objSub In objFolder.SubFolders
|
113
|
+
Fileshow1 objSub.Path, StartRow
|
114
|
+
Next
|
115
|
+
|
116
|
+
End Sub
|
117
|
+
```
|
1
コード微修正
answer
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
```vba
|
27
27
|
ws.Cells(i, 3).Resize(, 6).Value = _
|
28
28
|
Array(objFile.Type, Int(objFile.Size / 1024), objFile.DateCreated, _
|
29
|
-
|
29
|
+
objFile.DatelastAccessed, objFile.DateLastModified, objFile.ParentFolder.Path)
|
30
30
|
```
|
31
31
|
|
32
32
|
さらに、改善させるには、
|