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

回答編集履歴

3

追加

2020/04/04 11:02

投稿

end-u
end-u

スコア52

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

誤字修正

2020/04/04 11:01

投稿

end-u
end-u

スコア52

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("AR12", .Cells(.Rows.Count, "AR").End(xlUp))
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

サンプル追加です

2020/04/03 15:22

投稿

end-u
end-u

スコア52

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
+ ```