質問編集履歴

5

追記追加

2021/03/23 05:11

投稿

ma2hiro
ma2hiro

スコア157

test CHANGED
File without changes
test CHANGED
@@ -462,6 +462,46 @@
462
462
 
463
463
  .Value = strDat
464
464
 
465
+ ’どうしても.VLookupなどをどのように実装すれば良いのか不明なので追記
466
+
467
+ Case 5 '評価店所名
468
+
469
+ If Dat(2) = "" Then
470
+
471
+ Msg = "「評価店所名」に記入がありません。"
472
+
473
+ GoTo ErrProc
474
+
475
+ End If
476
+
477
+ .Value = Dat(2)
478
+
479
+ '-----店番
480
+
481
+ temp = Replace(Dat(2), "支店", "")
482
+
483
+ temp = Replace(temp, "事業所", "")
484
+
485
+ temp = Replace(temp, "営業所", "")
486
+
487
+ With Worksheets("業種CD") '店番
488
+
489
+ On Error Resume Next
490
+
491
+ temp = Application.WorksheetFunction _
492
+
493
+ .VLookup(temp, .Range(.Cells(3, 5), .Cells(31, 6)), 2, False)
494
+
495
+ On Error GoTo 0
496
+
497
+ End With
498
+
499
+ .Offset(0, -2).Value = temp
500
+
501
+ ’追記ココまで ErrProcは省略します。.VLookupや.Offsetの実装方法を知りたいので
502
+
503
+
504
+
465
505
  ' こういったのが  ↓まで続く
466
506
 
467
507
  Case 44 '前一年間の取引実績

4

文言修正

2021/03/23 05:11

投稿

ma2hiro
ma2hiro

スコア157

test CHANGED
File without changes
test CHANGED
@@ -126,7 +126,7 @@
126
126
 
127
127
 
128
128
 
129
- Const fDebug As Boolean = True 'Falseだと高速化
129
+ Const fDebug As Boolean = False 'Falseだと高速化対応中
130
130
 
131
131
  If (fDebug) Then
132
132
 
@@ -184,13 +184,27 @@
184
184
 
185
185
  End If
186
186
 
187
- '不要かと思って削除したがココが重い予感 ココから
187
+ '不要かと思って削除したがココが重い予感 ココから================================
188
188
 
189
189
  If IsArray(Dat) Then
190
190
 
191
+ Debug.Print Time, "PutData", "Start"
192
+
191
- '集計表へのデータ記入
193
+ '集計表へのデータ記入 下が重い
194
+
192
-
195
+ If (fDebug) Then
196
+
193
- If Not PutData(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
197
+ If Not PutData(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
198
+
199
+ Else
200
+
201
+ If Not PutDataEx2(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
202
+
203
+ End If
204
+
205
+
206
+
207
+ Debug.Print Time, "PutData", "End"
194
208
 
195
209
  Else
196
210
 
@@ -202,7 +216,7 @@
202
216
 
203
217
  End If
204
218
 
205
- '不要かと思って削除したがココが重い予感 ココまで
219
+ '不要かと思って削除したがココが重い予感 ココまで================================
206
220
 
207
221
 
208
222
 
@@ -371,3 +385,115 @@
371
385
  ```
372
386
 
373
387
  土日にでもじっくり見て動作の高速化を考えてみますがどうすれば早くなりそうかコメント頂ければ幸いです。
388
+
389
+
390
+
391
+ 【追記その2】
392
+
393
+ ================================
394
+
395
+ ```
396
+
397
+ 'なので高速化予定として作成するか……
398
+
399
+ Private Function PutDataEx2(Ws As Worksheet, Dat As Variant, EvaluationSheetName As Variant) As Boolean
400
+
401
+ Dim LastRo As Long, TargetRo As Long
402
+
403
+ Dim Col As Integer, strDat As String
404
+
405
+ Dim temp As Variant, Msg As String, Res As Integer
406
+
407
+
408
+
409
+ LastRo = getLastRoExTempRow(Ws) 'テンプレート行-1
410
+
411
+ 'cells(9,11)は「この行はテンプレートです。記入できません。」
412
+
413
+ If LastRo < 9 Then TargetRo = 9 Else TargetRo = LastRo + 1
414
+
415
+ Call CopyTemplateRow(Ws, TargetRo)
416
+
417
+
418
+
419
+ '評価表の二重オープンを防ぐこと
420
+
421
+ PutDataEx2 = True
422
+
423
+ For Col = 1 To 44 '43 '42
424
+
425
+ With Ws.Cells(TargetRo, Col)
426
+
427
+ Select Case Col
428
+
429
+ Case 1
430
+
431
+ If Dat(14) = "継続" Then
432
+
433
+ strDat = "2"
434
+
435
+ ElseIf Dat(14) = "新規" Then
436
+
437
+ strDat = "1"
438
+
439
+ Else
440
+
441
+ strDat = ""
442
+
443
+ End If
444
+
445
+ .Value = strDat
446
+
447
+ Case 2
448
+
449
+ If Dat(15) = "外注" Then
450
+
451
+ strDat = "2"
452
+
453
+ ElseIf Dat(15) = "資材" Then
454
+
455
+ strDat = "1"
456
+
457
+ Else
458
+
459
+ strDat = ""
460
+
461
+ End If
462
+
463
+ .Value = strDat
464
+
465
+ ' こういったのが  ↓まで続く
466
+
467
+ Case 44 '前一年間の取引実績
468
+
469
+ .Value = Dat(Col - 4)
470
+
471
+ Case Else
472
+
473
+ ' If Ro = 9 And Col = 5 Then Ws.Cells(5, 8).Value = Dat(0) & "継続外注取引先"
474
+
475
+ .Value = Dat(Col - 3) 'Dat(Col - 5)
476
+
477
+
478
+
479
+ End Select
480
+
481
+ '取引店所、業種名、取引先名カナ、取引先名、代表者職位・氏名、住所、条件、取引先担当者名、業務内容/品目1~4
482
+
483
+ ' If Col = 5 Or Col = 8 Or Col = 10 Or Col = 11 Or Col = 12 Or Col = 14 Or Col >= 37 Then
484
+
485
+ .Font.Name = "Meiryo UI"
486
+
487
+ ' End If
488
+
489
+ End With
490
+
491
+ Next
492
+
493
+ End Function
494
+
495
+
496
+
497
+
498
+
499
+ ```

3

文言修正

2021/03/22 08:36

投稿

ma2hiro
ma2hiro

スコア157

test CHANGED
File without changes
test CHANGED
@@ -184,6 +184,28 @@
184
184
 
185
185
  End If
186
186
 
187
+ '不要かと思って削除したがココが重い予感 ココから
188
+
189
+ If IsArray(Dat) Then
190
+
191
+ '集計表へのデータ記入
192
+
193
+ If Not PutData(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
194
+
195
+ Else
196
+
197
+ Msg = "「" & SheetNamesList(i) & "」シートが削除されているか、評価表年度と台帳年度が一致しません。" & vbLf _
198
+
199
+ & " このシートの読み込みをスキップします。"
200
+
201
+ Call Tools.ShowInfForm2("E", "シートの不在確認", True, "閉じる", False, "", Msg, 0, 0)
202
+
203
+ End If
204
+
205
+ '不要かと思って削除したがココが重い予感 ココまで
206
+
207
+
208
+
187
209
  Next
188
210
 
189
211
 

2

文言修正

2021/03/19 09:32

投稿

ma2hiro
ma2hiro

スコア157

test CHANGED
File without changes
test CHANGED
@@ -136,7 +136,7 @@
136
136
 
137
137
  Set wb = Workbooks.Open(strPath & strFileName)
138
138
 
139
- '    ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめましたma2
139
+ '    ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめました
140
140
 
141
141
  End If
142
142
 

1

追記追加

2021/03/19 06:37

投稿

ma2hiro
ma2hiro

スコア157

test CHANGED
File without changes
test CHANGED
@@ -100,4 +100,252 @@
100
100
 
101
101
  [VBAの高速化 - 人はエクセルの能力の10%も使っていない?](https://xoffice.hatenablog.com/entry/2019/11/12/020630)
102
102
 
103
- がためになりそうでしたので後で実装予定です
103
+ がためになりそうでしたので後で実装予定です
104
+
105
+
106
+
107
+  【追記】
108
+
109
+ ================================
110
+
111
+ 何かおもったようにパフォーマンスが上がらないので私は何か勘違いしているのかと思い
112
+
113
+ ソースの概要を貼り付けてアドバイスを頂ければと思ったため貼り付け失礼します。
114
+
115
+ ```vba
116
+
117
+ Public Function Main(actWs As Worksheet) As Boolean 'Thisworkbook.getData
118
+
119
+
120
+
121
+ '宣言とか色々
122
+
123
+
124
+
125
+ Debug.Print Time & " - スタート"
126
+
127
+
128
+
129
+ Const fDebug As Boolean = True 'Falseだと高速化前
130
+
131
+ If (fDebug) Then
132
+
133
+ Else
134
+
135
+ Dim wb As Workbook
136
+
137
+ Set wb = Workbooks.Open(strPath & strFileName)
138
+
139
+ '    ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめましたma2
140
+
141
+ End If
142
+
143
+
144
+
145
+ For i = 0 To UBound(SheetNamesList)
146
+
147
+ '読み込んでいるとのプログレスバーの処理
148
+
149
+ With ProgForm
150
+
151
+ If i > .ProgressBar1.Min And _
152
+
153
+ i <= .ProgressBar1.Max Then
154
+
155
+ 'ProgressPercent = CInt(i / UBound(SheetNamesList) * 100)
156
+
157
+ .Label1.Caption = "評価表シートからデータを読み込んでいます。( " & i + 1 & " / " & UBound(SheetNamesList) + 1 & ")"
158
+
159
+ .ProgressBar1.Value = i 'プログレスバーの値を更新
160
+
161
+ DoEvents '滞留処理を実行
162
+
163
+ End If
164
+
165
+ End With
166
+
167
+ '読み込んでいるとのプログレスバーの処理ココまで
168
+
169
+
170
+
171
+ If (fDebug) Then
172
+
173
+ '評価表シートからデータの取得
174
+
175
+ Dat = ReadData(strPath, strFileName, SheetNamesList(i), EvaluationListType)
176
+
177
+ '↑でなんか毎回閉じている気がするので開きっぱなしでやってみたのが↓ で早くなったかどうか分からないので……元のヤツを持ってくるか……
178
+
179
+ Else
180
+
181
+ 'こっちは早くしたつもりなんだけどな……
182
+
183
+ Dat = ReadDataEx2(wb, SheetNamesList(i), EvaluationListType)
184
+
185
+ End If
186
+
187
+ Next
188
+
189
+
190
+
191
+ If (fDebug) Then
192
+
193
+ Else
194
+
195
+ wb.Close SaveChanges:=False
196
+
197
+ End If
198
+
199
+
200
+
201
+ Debug.Print Time & " - エンド"
202
+
203
+
204
+
205
+ Exit Function
206
+
207
+
208
+
209
+
210
+
211
+ ' ReadDataが重かったのでReadDataEx2に改修。
212
+
213
+ ' 改修した手法としては
214
+
215
+ ' ・Workbook.openが重いとの事で一つ開きっぱなしにして毎回Openしない
216
+
217
+ ' ・
218
+
219
+ Private Function ReadDataEx2(ByVal wb As Workbook, ByVal SheetNames) As Variant
220
+
221
+ '評価表からデータ取得
222
+
223
+
224
+
225
+
226
+
227
+ Dim Dat(40) As Variant, KeyWord As Variant
228
+
229
+ Dim BizWs As Worksheet, Msg As String
230
+
231
+ Dim PathFileSheet As String, strTemp As String
232
+
233
+ Dim i As Integer, FiscalYear As Integer
234
+
235
+ Dim Repres As String, JobPosition As String
236
+
237
+
238
+
239
+ 'CellDatas内にデータをコピー
240
+
241
+ Dim CellDatas As Variant
242
+
243
+ CellDatas = wb.Sheets(SheetNames).Range("A1:AI35")
244
+
245
+
246
+
247
+ On Error GoTo ErrProc
248
+
249
+ FiscalYear = Val(CellDatas(2, 13)) '年度表示
250
+
251
+ '年度の整合性検査
252
+
253
+ 'Debug.Print Val(ThisWorkbook.ActiveSheet.Cells(1, 1).Value)
254
+
255
+ If FiscalYear <> Val(ThisWorkbook.ActiveSheet.Cells(1, 1).Value) Then
256
+
257
+ GoTo ErrProc
258
+
259
+ End If
260
+
261
+ '読み取りシートがない場合はエラー
262
+
263
+ ' Dat(1) = ExecuteExcel4Macro(PathFileSheet & 5 & "C" & 5) '評価実施日
264
+
265
+ ' Dat(1) = CLng(wb.Sheets(SheetNames).Cells(5, 5).Value) '評価実施日
266
+
267
+ Dat(1) = CLng(CellDatas(5, 5)) '評価実施日
268
+
269
+ If Dat(1) > ThisWorkbook.RecentRatingDay Then ThisWorkbook.RecentRatingDay = Dat(1)
270
+
271
+ On Error GoTo 0
272
+
273
+
274
+
275
+ Dat(2) = CellDatas(6, 5) '評価店所名
276
+
277
+ With EvaluationSheet '評価表
278
+
279
+
280
+
281
+ Dat(4) = CellDatas(12, 11) '業種CD
282
+
283
+ Dat(5) = CellDatas(12, 5) '業務内容/品目
284
+
285
+
286
+
287
+ 'このような内容がDat(34)まで続いている
288
+
289
+ 'Dat(34) = ExecuteExcel4Macro(PathFileSheet & 11 & "C" & 11) '取引先担当者
290
+
291
+ 'Dat(34) = wb.Sheets(SheetNames).Cells(11, 11).Value '取引先担当者
292
+
293
+ Dat(34) = CellDatas(11, 11) '取引先担当者
294
+
295
+
296
+
297
+ '業務内容/品目
298
+
299
+ On Error GoTo ErrProc
300
+
301
+ KeyWord = Split(wb.Sheets(SheetNames).Cells(35, 3).Value, ",")
302
+
303
+ ReDim Preserve KeyWord(3)
304
+
305
+ For i = 0 To 3 'UBound(KeyWord)
306
+
307
+ Dat(35 + i) = Left(KeyWord(i), 12) 'Dat(35)~Dat(38)
308
+
309
+ If Dat(35 + i) = "" Then Dat(35 + i) = "-"
310
+
311
+ Next
312
+
313
+ On Error GoTo 0
314
+
315
+
316
+
317
+ End With
318
+
319
+
320
+
321
+ '文字種の変更
322
+
323
+ For i = 0 To UBound(Dat)
324
+
325
+ If Dat(i) <> "" And i <> 9 And i <> 34 Then Dat(i) = ChangeChr(Dat(i), i) 'i=7,8はCol=10,11
326
+
327
+ Next
328
+
329
+
330
+
331
+ ReadDataEx2 = Dat
332
+
333
+
334
+
335
+ Exit Function
336
+
337
+
338
+
339
+ ErrProc:
340
+
341
+ ReadDataEx2 = "Err"
342
+
343
+
344
+
345
+ End Function
346
+
347
+
348
+
349
+ ```
350
+
351
+ 土日にでもじっくり見て動作の高速化を考えてみますがどうすれば早くなりそうかコメント頂ければ幸いです。