質問するログイン新規登録

回答編集履歴

3

説明修正

2020/10/10 08:34

投稿

hatena19
hatena19

スコア34367

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
- 10万ファイルを超えるとエラーになります。
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("FileList2")
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("FileList2").Range("B3:B" & StartRow)
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 100000, 1 To 8) As String
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 100000, 1 To UBound(aSubFolders) + 7)
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

コード追記

2020/10/10 08:34

投稿

hatena19
hatena19

スコア34367

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

コード微修正

2020/10/10 08:07

投稿

hatena19
hatena19

スコア34367

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
- objFile.DatelastAccessed, objFile.DateLastModified, objFile.ParentFolder.Path)
29
+ objFile.DatelastAccessed, objFile.DateLastModified, objFile.ParentFolder.Path)
30
30
  ```
31
31
 
32
32
  さらに、改善させるには、