回答編集履歴
3
追加
answer
CHANGED
@@ -168,4 +168,104 @@
|
|
168
168
|
Next
|
169
169
|
|
170
170
|
End Sub
|
171
|
-
```
|
171
|
+
```
|
172
|
+
---
|
173
|
+
(2020.04.04追加)
|
174
|
+
新規登録を追加
|
175
|
+
「dic.keys()にあって、ファイルリストにないもの」を追加すればいいので、
|
176
|
+
Match関数でまとめて配列CheckしてLoop時エラー値のものを処理します
|
177
|
+
処理内容は更新と同じなのでサブプロシージャにして外出し。
|
178
|
+
```VBA
|
179
|
+
'---------------------------------------------------------------------
|
180
|
+
Sub sample2()
|
181
|
+
Dim Fold As String
|
182
|
+
Fold = ThisWorkbook.Path 'とかActiveWorkbook.Pathとか
|
183
|
+
|
184
|
+
Dim tgFol(2) As String
|
185
|
+
|
186
|
+
tgFol(0) = Fold & "\10 未対応"
|
187
|
+
tgFol(1) = Fold & "\20 対応中"
|
188
|
+
tgFol(2) = Fold & "\30 対応済み"
|
189
|
+
|
190
|
+
Dim fso As Object 'Scripting.FileSystemObject
|
191
|
+
Dim f As Object 'file
|
192
|
+
Dim dic As Object 'Scripting.dictionary
|
193
|
+
Dim i As Long
|
194
|
+
|
195
|
+
Set fso = CreateObject("Scripting.FileSystemObject")
|
196
|
+
Set dic = CreateObject("Scripting.Dictionary")
|
197
|
+
'3フォルダ全ファイルからユニークファイル名をkeyにして _
|
198
|
+
ファイルフルパスをdictionaryに登録する
|
199
|
+
For i = 0 To 2
|
200
|
+
For Each f In fso.GetFolder(tgFol(i)).Files
|
201
|
+
If f.Name Like "*お客様問い合わせファイル*" Then
|
202
|
+
dic(f.Name) = f.Path
|
203
|
+
End If
|
204
|
+
Next
|
205
|
+
Next
|
206
|
+
'↑ここまでは少し時間かかる
|
207
|
+
|
208
|
+
Dim key As String
|
209
|
+
Dim rng As Range
|
210
|
+
Dim r As Range
|
211
|
+
|
212
|
+
With ActiveSheet 'とかThisWorkbook.Sheets("data")とか
|
213
|
+
Set rng = .Range("AQ12", .Cells(.Rows.Count, "AQ").End(xlUp))
|
214
|
+
End With
|
215
|
+
|
216
|
+
For Each r In rng
|
217
|
+
If r.Value = "" Then
|
218
|
+
'ユニークファイル名がr.RowのA列にある場合
|
219
|
+
key = r.EntireRow.Range("A1").Value
|
220
|
+
'例えば別シートのrと同じ行にあるなら
|
221
|
+
'key = ThisWorkbook.Sheets("一覧").Cells(r.Row, "A").Value
|
222
|
+
|
223
|
+
'dic(key)でフルパスを取り出してサブプロシージャへ
|
224
|
+
Call wkGetdata(dic(key), r)
|
225
|
+
Else
|
226
|
+
':
|
227
|
+
':
|
228
|
+
End If
|
229
|
+
Next
|
230
|
+
|
231
|
+
'新規登録チェック
|
232
|
+
Dim chk, buf
|
233
|
+
chk = Application.Match(dic.keys(), rng.EntireRow.Columns(1), 0)
|
234
|
+
'新規書き出し位置
|
235
|
+
Set r = rng.Offset(rng.Count).Item(1)
|
236
|
+
For i = 1 To UBound(chk)
|
237
|
+
If IsError(chk(i)) Then
|
238
|
+
key = dic(dic.keys()(i))
|
239
|
+
'フォルダによって除外するなら条件分岐させる
|
240
|
+
'buf = Split(key, "\")
|
241
|
+
'If buf(5) <> "30 対応済み" Then
|
242
|
+
Call wkGetdata(key, r)
|
243
|
+
'ファイル名も忘れずに追加
|
244
|
+
r.EntireRow.Range("A1").Value = dic.keys()(i)
|
245
|
+
Set r = r.Offset(1)
|
246
|
+
'End If
|
247
|
+
End If
|
248
|
+
Next
|
249
|
+
|
250
|
+
End Sub
|
251
|
+
'---------------------------------------------------------------------
|
252
|
+
Sub wkGetdata(fName As String, r As Range)
|
253
|
+
Dim ret(1 To 69)
|
254
|
+
With Workbooks.Open(fName, UpdateLinks:=False, ReadOnly:=True)
|
255
|
+
With .Sheets("問い合わせ")
|
256
|
+
'1×69の配列にデータセット
|
257
|
+
ret(1) = .Range("AG10").Value
|
258
|
+
ret(2) = .Range("AH10").Value
|
259
|
+
':
|
260
|
+
':
|
261
|
+
':
|
262
|
+
ret(69) = .Range("AT2").Value
|
263
|
+
End With
|
264
|
+
.Close False
|
265
|
+
End With
|
266
|
+
'Value = ""条件の rの行のB列から右に69セル拡張した範囲に書き込み
|
267
|
+
r.EntireRow.Range("B1").Resize(, 69).Value = ret
|
268
|
+
End Sub
|
269
|
+
'---------------------------------------------------------------------
|
270
|
+
```
|
271
|
+
変数を使い回ししてるので解り難ければ適宜変更してください
|
2
誤字修正
answer
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
Dim ret(1 To 69)
|
137
137
|
|
138
138
|
With ActiveSheet 'とかThisWorkbook.Sheets("data")とか
|
139
|
-
Set rng = .Range("
|
139
|
+
Set rng = .Range("AQ12", .Cells(.Rows.Count, "AQ").End(xlUp))
|
140
140
|
End With
|
141
141
|
|
142
142
|
For Each r In rng
|
1
サンプル追加です
answer
CHANGED
@@ -86,4 +86,86 @@
|
|
86
86
|
ステータス毎にフォルダを移動したとしても、元のファイル名がユニークなら、
|
87
87
|
最初に一覧表に書き込む時にファイル名も記録しておくようにしませんか
|
88
88
|
そうすると、「更新」であれ「新規登録」であれ、そのファイル名でピンポイントに開いて処理すれば良いと思うんですよね
|
89
|
-
直前に子フォルダ含めたファイルリストをまず作って、それを参照すれば良いと思いますし。
|
89
|
+
直前に子フォルダ含めたファイルリストをまず作って、それを参照すれば良いと思いますし。
|
90
|
+
|
91
|
+
---
|
92
|
+
(追記)
|
93
|
+
> 問い合わせ毎のファイルはユニークなファイル名なので、
|
94
|
+
..という事であれば
|
95
|
+
> 直前に子フォルダ含めたファイルリストをまず作って、それを参照すれば良いと思いますし。
|
96
|
+
のサンプル
|
97
|
+
```VBA
|
98
|
+
Sub sample()
|
99
|
+
Dim Fold As String
|
100
|
+
|
101
|
+
With Application.FileDialog(msoFileDialogFolderPicker)
|
102
|
+
If .Show = True Then
|
103
|
+
Fold = .SelectedItems(1)
|
104
|
+
Else
|
105
|
+
Exit Sub
|
106
|
+
End If
|
107
|
+
End With
|
108
|
+
|
109
|
+
Dim tgFol(2) As String
|
110
|
+
|
111
|
+
tgFol(0) = Fold & "\10 未対応"
|
112
|
+
tgFol(1) = Fold & "\20 対応中"
|
113
|
+
tgFol(2) = Fold & "\30 対応済み"
|
114
|
+
|
115
|
+
Dim fso As Object 'Scripting.FileSystemObject
|
116
|
+
Dim f As Object 'file
|
117
|
+
Dim dic As Object 'Scripting.dictionary
|
118
|
+
Dim i As Long
|
119
|
+
|
120
|
+
Set fso = CreateObject("Scripting.FileSystemObject")
|
121
|
+
Set dic = CreateObject("Scripting.Dictionary")
|
122
|
+
'3フォルダ全ファイルからユニークファイル名をkeyにして _
|
123
|
+
ファイルフルパスをdictionaryに登録する
|
124
|
+
For i = 0 To 2
|
125
|
+
For Each f In fso.GetFolder(tgFol(i)).Files
|
126
|
+
If f.Name Like "*お客様問い合わせファイル*" Then
|
127
|
+
dic(f.Name) = f.Path
|
128
|
+
End If
|
129
|
+
Next
|
130
|
+
Next
|
131
|
+
'↑ここまでは少し時間かかる
|
132
|
+
|
133
|
+
Dim key As String
|
134
|
+
Dim rng As Range
|
135
|
+
Dim r As Range
|
136
|
+
Dim ret(1 To 69)
|
137
|
+
|
138
|
+
With ActiveSheet 'とかThisWorkbook.Sheets("data")とか
|
139
|
+
Set rng = .Range("AR12", .Cells(.Rows.Count, "AR").End(xlUp))
|
140
|
+
End With
|
141
|
+
|
142
|
+
For Each r In rng
|
143
|
+
If r.Value = "" Then
|
144
|
+
'ユニークファイル名がr.RowのA列にある場合
|
145
|
+
key = r.EntireRow.Range("A1").Value
|
146
|
+
'例えば別シートのrと同じ行にあるなら
|
147
|
+
'key = ThisWorkbook.Sheets("一覧").Cells(r.Row, "A").Value
|
148
|
+
|
149
|
+
'dic(key)でフルパスを取り出す
|
150
|
+
With Workbooks.Open(dic(key), UpdateLinks:=False, ReadOnly:=True)
|
151
|
+
With .Sheets("問い合わせ")
|
152
|
+
'1×69の配列にデータセット
|
153
|
+
ret(1) = .Range("AG10").Value
|
154
|
+
ret(2) = .Range("AH10").Value
|
155
|
+
':
|
156
|
+
':
|
157
|
+
':
|
158
|
+
ret(69) = .Range("AT2").Value
|
159
|
+
End With
|
160
|
+
.Close False
|
161
|
+
End With
|
162
|
+
'Value = ""条件の rの行のB列から右に69セル拡張した範囲に書き込み
|
163
|
+
r.EntireRow.Range("B1").Resize(, 69).Value = ret
|
164
|
+
Else
|
165
|
+
':
|
166
|
+
':
|
167
|
+
End If
|
168
|
+
Next
|
169
|
+
|
170
|
+
End Sub
|
171
|
+
```
|