質問編集履歴

4

コードの変更

2020/07/01 03:43

投稿

ichigo15
ichigo15

スコア14

test CHANGED
File without changes
test CHANGED
@@ -104,6 +104,10 @@
104
104
 
105
105
 
106
106
 
107
+
108
+
109
+
110
+
107
111
  ```ここに言語名を入力
108
112
 
109
113
  '--- サブフォルダのパス一覧を配列に取得する ---'
@@ -118,41 +122,65 @@
118
122
 
119
123
  folderPath = "[フォルダパス]"
120
124
 
125
+
126
+
127
+
128
+
129
+ '--- フォルダパスを取得する ---
130
+
131
+ Dim folderList As Variant
132
+
133
+ folderList = GetFolderPath(folderPath)
134
+
135
+
136
+
137
+ End Sub
138
+
139
+
140
+
141
+ '--- サブフォルダを再帰的に取得する関数 ---'
142
+
143
+ Public Function GetFolderPath(folderPath As String) As String()
144
+
145
+
146
+
147
+ '--- ファイルシステムオブジェクト ---'
148
+
149
+ Dim fso As Object
150
+
151
+ Set fso = CreateObject("Scripting.FileSystemObject")
152
+
153
+
154
+
155
+ '--- フォルダ数を格納する変数 ---'
156
+
157
+ Dim n As Variant
158
+
159
+ n = fso.GetFolder(folderPath).SubFolders.Count
160
+
121
161
 
122
162
 
123
- '--- フォルダパスを取得する ---
124
-
125
- Dim folderList As Variant
126
-
127
- folderList = GetFolderPath(folderPath)
128
-
129
-
130
-
131
- End Sub
132
-
133
-
134
-
135
- '--- サブフォルダを再帰的に取得する関数 ---'
136
-
137
- Public Function GetFolderPath(folderPath As String) As String()
138
-
139
-
140
-
141
- '--- ファイルシステムオブジェクト ---'
142
-
143
- Dim fso As Object
144
-
145
- Set fso = CreateObject("Scripting.FileSystemObject")
146
-
147
-
148
-
149
- '--- フォルダ数を格納する変数 ---'
150
-
151
- Dim n As Variant
163
+ Dim r As Long
164
+
152
-
165
+ Dim c As Long
166
+
167
+ Application.ScreenUpdating = False
168
+
169
+ For r = 1 To UBound(folderList)
170
+
153
- n = fso.GetFolder(folderPath).SubFolders.Count
171
+ fs = Split(Mid(folderList(r), Len(folderPath)), "\")
172
+
154
-
173
+ For c = 1 To UBound(fs)
174
+
155
-
175
+ Cells(r, c + 1).Value = fs(c)
176
+
177
+ Next
178
+
179
+ Next
180
+
181
+ Application.ScreenUpdating = True
182
+
183
+
156
184
 
157
185
  If (0 < n) Then
158
186
 
@@ -162,7 +190,7 @@
162
190
 
163
191
  ReDim str(1 To n)
164
192
 
165
-
193
+
166
194
 
167
195
  '--- フォルダパスを格納 ---'
168
196
 
@@ -176,7 +204,7 @@
176
204
 
177
205
  Dim strTmp() As String
178
206
 
179
-
207
+
180
208
 
181
209
  'フォルダパスを指定してすべてのサブフォルダを取得
182
210
 
@@ -186,7 +214,7 @@
186
214
 
187
215
  str(i) = f.Path
188
216
 
189
-
217
+
190
218
 
191
219
  strTmp = GetFolderPath(str(i)) '再帰的呼び出し
192
220
 
@@ -200,7 +228,7 @@
200
228
 
201
229
  End If
202
230
 
203
-
231
+
204
232
 
205
233
  'サブフォルダ内にさらにフォルダがあればその分だけ配列を拡張
206
234
 
@@ -214,7 +242,7 @@
214
242
 
215
243
  Next j
216
244
 
217
-
245
+
218
246
 
219
247
  i = i + m + 1
220
248
 
@@ -222,11 +250,11 @@
222
250
 
223
251
  End If
224
252
 
225
-
253
+
226
254
 
227
255
  GetFolderPath = str
228
256
 
229
-
257
+
230
258
 
231
259
  End Function
232
260
 
@@ -246,7 +274,7 @@
246
274
 
247
275
  End If
248
276
 
249
-
277
+
250
278
 
251
279
  Exit Function
252
280
 
@@ -254,12 +282,16 @@
254
282
 
255
283
  ERROR_:
256
284
 
257
-
285
+
258
286
 
259
287
  IsEmptyArray = True
260
288
 
261
-
289
+
262
290
 
263
291
  End Function
264
292
 
293
+
294
+
295
+
296
+
265
297
  ```

3

困っていることの変更

2020/07/01 03:43

投稿

ichigo15
ichigo15

スコア14

test CHANGED
File without changes
test CHANGED
@@ -68,27 +68,31 @@
68
68
 
69
69
 
70
70
 
71
- (1)と(2)は問題ありません
72
-
73
- (3)~(5)が困っております。
71
+ (3)す。
72
+
73
+
74
+
74
-
75
+  http://www.fingeneersblog.com/1610/
76
+
75
-
77
+   ↑
78
+
76
-
79
+  こちらのサイトを参照させていただいたのですが何もおこりません
80
+
81
+  どうやったらフォルダの一覧を取得できるようになるのでしょうか?
82
+
83
+
84
+
85
+  B列に1次フォルダ、C列に2次フォルダ、D列に3次フォルダ・・・・
86
+
77
- 3)はパスの一覧は作れると思いますが、フォルダだけ一覧を作成すことがきません
87
+  入力箇所はB13からで階層フォルダは次行に入力できようになりたいす。
78
-
79
- (5)は似たようなものを参照して作成することができたのですが下層部のフォルダの作成が
88
+
80
-
81
-    できません
89
+
82
-
83
-    例でいうと、テスト1の中にテスト2~4の作成はできました
90
+
84
-
85
-    テスト5~7の作成がわかりません
91
+
86
-
87
-  
88
-
92
+
89
- ご指導頂けますでしょうか。
93
+  ご指導頂けますでしょうか。
90
-
94
+
91
- 宜しくお願いいたします
95
+  宜しくお願いいたします
92
96
 
93
97
 
94
98
 
@@ -96,62 +100,166 @@
96
100
 
97
101
 
98
102
 
99
- フォルダを作成するコードです
100
-
101
- A6にフォルダパス、B6~にフォルダ名とてい
103
+ [フォルダパス]は取得したいフォルダのパスを入力しました。
102
-
103
- できれば作成先を探して指定するようにしたいと思っております。
104
104
 
105
105
 
106
106
 
107
107
  ```ここに言語名を入力
108
108
 
109
- Sub フォルダ作成()
110
-
111
-
112
-
113
- Dim Path As String
109
+ '--- サブフォルダのパス一覧を配列に取得する ---'
114
-
110
+
115
- Path = Range("A6").Value
111
+ Public Sub GetAllSubFolderPath()
116
-
117
-
118
-
119
- Dim i As Long
112
+
120
-
113
+
114
+
121
- For i = 6 To Range("B6").End(xlDown).Row
115
+ '--- フォルダ一覧を取得したいフォルダのパス ---'
122
-
123
-
124
-
116
+
125
- Dim FolderName As String
117
+ Dim folderPath As String
126
-
118
+
127
- FolderName = Cells(i, 2).Value
119
+ folderPath = "[フォルダパス]"
120
+
121
+
122
+
123
+ '--- フォルダパスを取得する ---
124
+
125
+ Dim folderList As Variant
126
+
127
+ folderList = GetFolderPath(folderPath)
128
+
129
+
130
+
131
+ End Sub
132
+
133
+
134
+
135
+ '--- サブフォルダを再帰的に取得する関数 ---'
136
+
137
+ Public Function GetFolderPath(folderPath As String) As String()
138
+
139
+
140
+
141
+ '--- ファイルシステムオブジェクト ---'
142
+
143
+ Dim fso As Object
144
+
145
+ Set fso = CreateObject("Scripting.FileSystemObject")
146
+
147
+
148
+
149
+ '--- フォルダ数を格納する変数 ---'
150
+
151
+ Dim n As Variant
152
+
153
+ n = fso.GetFolder(folderPath).SubFolders.Count
154
+
155
+
156
+
157
+ If (0 < n) Then
158
+
159
+ '--- フォルダパスを格納する配列 ---'
160
+
161
+ Dim str() As String
162
+
163
+ ReDim str(1 To n)
128
164
 
129
165
 
130
166
 
167
+ '--- フォルダパスを格納 ---'
168
+
169
+ Dim i As Long
170
+
171
+ Dim j As Long
172
+
173
+ Dim m As Long
174
+
175
+ i = 1
176
+
131
- Dim NewDirPath As String
177
+ Dim strTmp() As String
132
-
133
- NewDirPath = Path & "\" & FolderName
134
178
 
135
179
 
136
180
 
137
-
138
-
139
- If Dir(NewDirPath, vbDirectory) = "" Then
181
+ 'フォルダパスを指定してすべてのサブフォルダを取得
182
+
140
-
183
+ Dim f As Object
184
+
141
- MkDir Path & "\" & FolderName
185
+ For Each f In fso.GetFolder(folderPath).SubFolders
186
+
142
-
187
+ str(i) = f.Path
188
+
189
+
190
+
191
+ strTmp = GetFolderPath(str(i)) '再帰的呼び出し
192
+
193
+ If (Not IsEmptyArray(strTmp)) Then
194
+
195
+ m = UBound(strTmp, 1)
196
+
197
+ Else
198
+
199
+ m = 0
200
+
143
- End If
201
+ End If
202
+
203
+
204
+
144
-
205
+ 'サブフォルダ内にさらにフォルダがあればその分だけ配列を拡張
206
+
145
-
207
+ n = UBound(str, 1)
208
+
146
-
209
+ ReDim Preserve str(1 To n + m)
210
+
211
+ For j = 1 To m
212
+
213
+ str(i + j) = strTmp(j)
214
+
147
- Next i
215
+ Next j
148
-
149
-
150
-
216
+
217
+
218
+
151
- MsgBox "終了しました。"
219
+ i = i + m + 1
220
+
152
-
221
+ Next f
153
-
154
-
222
+
155
- End Sub
223
+ End If
224
+
225
+
226
+
227
+ GetFolderPath = str
228
+
229
+
230
+
231
+ End Function
232
+
233
+
234
+
235
+ '--- 配列が空かどうかを判定する関数 ---'
236
+
237
+ Public Function IsEmptyArray(arrayTmp As Variant) As Boolean
238
+
239
+ On Error GoTo ERROR_
240
+
241
+
242
+
243
+ If (0 < UBound(arrayTmp, 1)) Then
244
+
245
+ IsEmptyArray = False
246
+
247
+ End If
248
+
249
+
250
+
251
+ Exit Function
252
+
253
+
254
+
255
+ ERROR_:
256
+
257
+
258
+
259
+ IsEmptyArray = True
260
+
261
+
262
+
263
+ End Function
156
264
 
157
265
  ```

2

コードや内容を変更

2020/06/19 03:50

投稿

ichigo15
ichigo15

スコア14

test CHANGED
File without changes
test CHANGED
@@ -8,25 +8,23 @@
8
8
 
9
9
 
10
10
 
11
-
12
-
13
-
14
-
15
11
  (例)
16
12
 
17
13
 
18
14
 
19
15
   テスト1  ⇒ テスト2  ⇒ テスト5  ⇒ テスト7
20
16
 
17
+
18
+
21
-                  テスト6
19
+ テスト1   テスト2   テスト6
22
20
 
23
21
 
24
22
 
23
+ テスト1  ⇒ テスト3
25
24
 
25
+  
26
26
 
27
-          テスト3
28
-
29
-          テスト4
27
+ テスト1   テスト4
30
28
 
31
29
 
32
30
 
@@ -44,7 +42,21 @@
44
42
 
45
43
  C:\Users\〇〇〇\Documents\テスト1\テスト2\テスト5\テスト7
46
44
 
45
+
46
+
47
-       
47
+ イメージは、下記のとおりです。      
48
+
49
+ (1)フォルダを選ぶ
50
+
51
+ (2)(1)のパスをExcelに表示
52
+
53
+ (3)(1)のフォルダ一覧をExcelに作成
54
+
55
+ (4)フォルダを選ぶ
56
+
57
+ (5)(4)のフォルダに(3)のフォルダを作成
58
+
59
+
48
60
 
49
61
 
50
62
 
@@ -52,23 +64,27 @@
52
64
 
53
65
 
54
66
 
55
- ファイルの整理にファイルリストをマクロで作成しています
56
-
57
- 同じようにファルダのリストを作成し
67
+ (困っいること)
58
-
59
- もしくは、ファルダのパスからフォルダを作成できないかと
60
-
61
- 思っておりますが何をどうしてよいのか分かりません
62
68
 
63
69
 
64
70
 
65
- ①フォルダを指定
71
+ (1)と(2)は問題ありません
66
72
 
67
- ②フォルダ内のフォルダをリスト化
73
+ (3)~(5)が困っております。
68
-
69
- ③指定の箇所にリストのフォルダを作成
70
74
 
71
75
 
76
+
77
+ (3)はパスの一覧は作れると思いますが、フォルダだけの一覧を作成することができません
78
+
79
+ (5)は似たようなものを参照して作成することができたのですが下層部のフォルダの作成が
80
+
81
+    できません
82
+
83
+    例でいうと、テスト1の中にテスト2~4の作成はできました
84
+
85
+    テスト5~7の作成がわかりません
86
+
87
+  
72
88
 
73
89
  ご指導頂けますでしょうか。
74
90
 
@@ -80,156 +96,62 @@
80
96
 
81
97
 
82
98
 
83
- ァイのリストを作成していマクロです
99
+ を作成コードです
84
100
 
101
+ A6にフォルダのパス、B6~にフォルダ名としています
102
+
85
- 全然関係ないようしたら申し訳ございません
103
+ できれば作成先を探して指定するようしたいと思っており
86
104
 
87
105
 
88
106
 
89
107
  ```ここに言語名を入力
90
108
 
91
- Sub getFileList()
109
+ Sub フォルダ作成()
92
110
 
111
+
93
112
 
113
+ Dim Path As String
94
114
 
95
- Dim start_x As Long: start_x = X
115
+ Path = Range("A6").Value
96
-
97
- Dim start_y As Long: start_y = Y
98
-
99
- Dim maxRow, maxCol
100
-
101
- Dim searchFolderPath As String
102
-
103
- Dim checkFolderPath
104
116
 
105
117
 
106
118
 
107
- Application.ScreenUpdating = False
119
+ Dim i As Long
108
120
 
109
- On Error Resume Next
121
+ For i = 6 To Range("B6").End(xlDown).Row
110
122
 
111
123
 
112
124
 
125
+ Dim FolderName As String
126
+
127
+ FolderName = Cells(i, 2).Value
128
+
129
+
130
+
131
+ Dim NewDirPath As String
132
+
133
+ NewDirPath = Path & "\" & FolderName
134
+
135
+
136
+
137
+
138
+
113
- searchFolderPath = Worksheets(FOLDERPATH).Range("B3").Value
139
+ If Dir(NewDirPath, vbDirectory) = "" Then
140
+
141
+ MkDir Path & "\" & FolderName
142
+
143
+ End If
114
144
 
115
145
 
116
146
 
117
- ' ファイルの存在チェック
147
+ Next i
118
-
119
- checkFolderPath = Dir(searchFolderPath, vbDirectory)
120
148
 
121
149
 
122
150
 
123
- If searchFolderPath = "" Or checkFolderPath = "" Then
151
+ MsgBox "終了しました。"
124
152
 
125
- MsgBox ERRORMESSAGE, vbCritical
153
+
126
-
127
- End
128
-
129
- End If
130
-
131
-
132
-
133
- ' シートの初期化
134
-
135
- maxRow = Worksheets(FOLDERPATH).Cells(Rows.Count, X).End(xlUp).Row
136
-
137
- maxCol = Worksheets(FOLDERPATH).Cells(Y, Columns.Count).End(xlToLeft).Column
138
-
139
- Worksheets(FOLDERPATH).Range(Cells(Y, X), Cells(maxRow + Y, maxCol + X)).ClearContents
140
-
141
-
142
-
143
- ' ファイル一覧作成
144
-
145
- Call printFileList(searchFolderPath, start_x, start_y)
146
-
147
-
148
-
149
- ' フォーマット整形
150
-
151
- Columns("B:F").Select
152
-
153
- Columns("B:F").EntireColumn.AutoFit
154
-
155
- Range("A1").Select
156
-
157
-
158
-
159
- Application.ScreenUpdating = True
160
-
161
-
162
154
 
163
155
  End Sub
164
156
 
165
157
  ```
166
-
167
- ```ここに言語を入力
168
-
169
- Private Sub printFileList(searchFolderPath As String, ByRef start_x, ByRef start_y)
170
-
171
-
172
-
173
- Dim fso As New FileSystemObject
174
-
175
- Dim folderList As Folders
176
-
177
- Dim folderName As folder
178
-
179
- Dim fileName As File
180
-
181
-
182
-
183
- Dim str As String
184
-
185
- Dim slashNum As Long
186
-
187
-
188
-
189
- Set folderList = fso.GetFolder(searchFolderPath).SubFolders
190
-
191
-
192
-
193
- 'フォルダ内のファイル名の取得
194
-
195
- For Each fileName In fso.GetFolder(searchFolderPath).Files
196
-
197
- slashNum = InStrRev(fileName.Path, "\")
198
-
199
- 'セルにパスとファイル名を書き込む
200
-
201
- Worksheets(FOLDERPATH).Cells(start_y, start_x).Value = Mid(fileName.Path, slashNum + 1)
202
-
203
- Worksheets(FOLDERPATH).Cells(start_y, start_x + 1).Value = Left(fileName.Path, slashNum - 1)
204
-
205
- Worksheets(FOLDERPATH).Cells(start_y, start_x + 2).Value = Format(fileName.Size / 1024, "0.#0") & " バイト"
206
-
207
- Worksheets(FOLDERPATH).Cells(start_y, start_x + 3).Value = fileName.DateCreated
208
-
209
- Worksheets(FOLDERPATH).Cells(start_y, start_x + 4).Value = fileName.DateLastModified
210
-
211
- start_y = start_y + 1
212
-
213
- Next
214
-
215
-
216
-
217
- ' サブフォルダ一覧取得 再帰処理
218
-
219
- For Each folderName In folderList
220
-
221
- Call printFileList(folderName.Path, start_x, start_y)
222
-
223
- Next
224
-
225
-
226
-
227
- End Sub
228
-
229
-
230
-
231
- ```
232
-
233
-
234
-
235
-

1

問題点の変更

2020/06/18 04:01

投稿

ichigo15
ichigo15

スコア14

test CHANGED
File without changes
test CHANGED
@@ -4,17 +4,69 @@
4
4
 
5
5
  あるフォルダの中に入っているフォルダ(下層部まで)を全て指定のフォルダ内に作成したいです
6
6
 
7
+ フォルダの作成場所はPC内だけでなく、サーバー上も想定しております
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ (例)
16
+
17
+
18
+
19
+  テスト1  ⇒ テスト2  ⇒ テスト5  ⇒ テスト7
20
+
21
+                  テスト6
22
+
23
+
24
+
25
+
26
+
27
+          テスト3
28
+
29
+          テスト4
30
+
31
+
32
+
33
+
34
+
35
+ C:\Users\〇〇〇\Documents\テスト1\テスト2
36
+
37
+ C:\Users\〇〇〇\Documents\テスト1\テスト3
38
+
39
+ C:\Users\〇〇〇\Documents\テスト1\テスト4
40
+
41
+ C:\Users\〇〇〇\Documents\テスト1\テスト2\テスト5
42
+
43
+ C:\Users\〇〇〇\Documents\テスト1\テスト2\テスト6
44
+
45
+ C:\Users\〇〇〇\Documents\テスト1\テスト2\テスト5\テスト7
46
+
47
+       
48
+
7
49
 
8
50
 
9
51
  ### 発生している問題・エラーメッセージ
10
52
 
11
53
 
12
54
 
13
- ファイルリストを作成しているマクロでパスも取得しています
55
+ ファイルの整理にファイルリストをマクロで作成しています
56
+
14
-
57
+ 同じようにファルダのリストを作成して
58
+
15
- のパスから作成することができれば思っていますが
59
+ もしくは、ファルダのパスからフォルダを作成できないか
16
-
60
+
17
- こから手を付けてよいか分かりません
61
+ 思っておりますが何をうしてよいか分かりません
62
+
63
+
64
+
65
+ ①フォルダを指定
66
+
67
+ ②フォルダ内のフォルダをリスト化
68
+
69
+ ③指定の箇所にリストのフォルダを作成
18
70
 
19
71
 
20
72
 
@@ -28,6 +80,12 @@
28
80
 
29
81
 
30
82
 
83
+ ファイルのリストを作成しているマクロです。
84
+
85
+ 全然関係ないようでしたら申し訳ございません。
86
+
87
+
88
+
31
89
  ```ここに言語名を入力
32
90
 
33
91
  Sub getFileList()