質問編集履歴
5
追記追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -230,6 +230,26 @@
|
|
230
230
|
strDat = ""
|
231
231
|
End If
|
232
232
|
.Value = strDat
|
233
|
+
’どうしても.VLookupなどをどのように実装すれば良いのか不明なので追記
|
234
|
+
Case 5 '評価店所名
|
235
|
+
If Dat(2) = "" Then
|
236
|
+
Msg = "「評価店所名」に記入がありません。"
|
237
|
+
GoTo ErrProc
|
238
|
+
End If
|
239
|
+
.Value = Dat(2)
|
240
|
+
'-----店番
|
241
|
+
temp = Replace(Dat(2), "支店", "")
|
242
|
+
temp = Replace(temp, "事業所", "")
|
243
|
+
temp = Replace(temp, "営業所", "")
|
244
|
+
With Worksheets("業種CD") '店番
|
245
|
+
On Error Resume Next
|
246
|
+
temp = Application.WorksheetFunction _
|
247
|
+
.VLookup(temp, .Range(.Cells(3, 5), .Cells(31, 6)), 2, False)
|
248
|
+
On Error GoTo 0
|
249
|
+
End With
|
250
|
+
.Offset(0, -2).Value = temp
|
251
|
+
’追記ココまで ErrProcは省略します。.VLookupや.Offsetの実装方法を知りたいので
|
252
|
+
|
233
253
|
' こういったのが ↓まで続く
|
234
254
|
Case 44 '前一年間の取引実績
|
235
255
|
.Value = Dat(Col - 4)
|
4
文言修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -62,7 +62,7 @@
|
|
62
62
|
|
63
63
|
Debug.Print Time & " - スタート"
|
64
64
|
|
65
|
-
Const fDebug As Boolean =
|
65
|
+
Const fDebug As Boolean = False 'Falseだと高速化対応中
|
66
66
|
If (fDebug) Then
|
67
67
|
Else
|
68
68
|
Dim wb As Workbook
|
@@ -91,16 +91,23 @@
|
|
91
91
|
'こっちは早くしたつもりなんだけどな……
|
92
92
|
Dat = ReadDataEx2(wb, SheetNamesList(i), EvaluationListType)
|
93
93
|
End If
|
94
|
-
'不要かと思って削除したがココが重い予感 ココから
|
94
|
+
'不要かと思って削除したがココが重い予感 ココから================================
|
95
95
|
If IsArray(Dat) Then
|
96
|
+
Debug.Print Time, "PutData", "Start"
|
96
|
-
'集計表へのデータ記入
|
97
|
+
'集計表へのデータ記入 下が重い
|
98
|
+
If (fDebug) Then
|
97
|
-
|
99
|
+
If Not PutData(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
|
100
|
+
Else
|
101
|
+
If Not PutDataEx2(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
|
102
|
+
End If
|
103
|
+
|
104
|
+
Debug.Print Time, "PutData", "End"
|
98
105
|
Else
|
99
106
|
Msg = "「" & SheetNamesList(i) & "」シートが削除されているか、評価表年度と台帳年度が一致しません。" & vbLf _
|
100
107
|
& " このシートの読み込みをスキップします。"
|
101
108
|
Call Tools.ShowInfForm2("E", "シートの不在確認", True, "閉じる", False, "", Msg, 0, 0)
|
102
109
|
End If
|
103
|
-
'不要かと思って削除したがココが重い予感 ココまで
|
110
|
+
'不要かと思って削除したがココが重い予感 ココまで================================
|
104
111
|
|
105
112
|
Next
|
106
113
|
|
@@ -184,4 +191,60 @@
|
|
184
191
|
End Function
|
185
192
|
|
186
193
|
```
|
187
|
-
土日にでもじっくり見て動作の高速化を考えてみますがどうすれば早くなりそうかコメント頂ければ幸いです。
|
194
|
+
土日にでもじっくり見て動作の高速化を考えてみますがどうすれば早くなりそうかコメント頂ければ幸いです。
|
195
|
+
|
196
|
+
【追記その2】
|
197
|
+
================================
|
198
|
+
```
|
199
|
+
'なので高速化予定として作成するか……
|
200
|
+
Private Function PutDataEx2(Ws As Worksheet, Dat As Variant, EvaluationSheetName As Variant) As Boolean
|
201
|
+
Dim LastRo As Long, TargetRo As Long
|
202
|
+
Dim Col As Integer, strDat As String
|
203
|
+
Dim temp As Variant, Msg As String, Res As Integer
|
204
|
+
|
205
|
+
LastRo = getLastRoExTempRow(Ws) 'テンプレート行-1
|
206
|
+
'cells(9,11)は「この行はテンプレートです。記入できません。」
|
207
|
+
If LastRo < 9 Then TargetRo = 9 Else TargetRo = LastRo + 1
|
208
|
+
Call CopyTemplateRow(Ws, TargetRo)
|
209
|
+
|
210
|
+
'評価表の二重オープンを防ぐこと
|
211
|
+
PutDataEx2 = True
|
212
|
+
For Col = 1 To 44 '43 '42
|
213
|
+
With Ws.Cells(TargetRo, Col)
|
214
|
+
Select Case Col
|
215
|
+
Case 1
|
216
|
+
If Dat(14) = "継続" Then
|
217
|
+
strDat = "2"
|
218
|
+
ElseIf Dat(14) = "新規" Then
|
219
|
+
strDat = "1"
|
220
|
+
Else
|
221
|
+
strDat = ""
|
222
|
+
End If
|
223
|
+
.Value = strDat
|
224
|
+
Case 2
|
225
|
+
If Dat(15) = "外注" Then
|
226
|
+
strDat = "2"
|
227
|
+
ElseIf Dat(15) = "資材" Then
|
228
|
+
strDat = "1"
|
229
|
+
Else
|
230
|
+
strDat = ""
|
231
|
+
End If
|
232
|
+
.Value = strDat
|
233
|
+
' こういったのが ↓まで続く
|
234
|
+
Case 44 '前一年間の取引実績
|
235
|
+
.Value = Dat(Col - 4)
|
236
|
+
Case Else
|
237
|
+
' If Ro = 9 And Col = 5 Then Ws.Cells(5, 8).Value = Dat(0) & "継続外注取引先"
|
238
|
+
.Value = Dat(Col - 3) 'Dat(Col - 5)
|
239
|
+
|
240
|
+
End Select
|
241
|
+
'取引店所、業種名、取引先名カナ、取引先名、代表者職位・氏名、住所、条件、取引先担当者名、業務内容/品目1~4
|
242
|
+
' If Col = 5 Or Col = 8 Or Col = 10 Or Col = 11 Or Col = 12 Or Col = 14 Or Col >= 37 Then
|
243
|
+
.Font.Name = "Meiryo UI"
|
244
|
+
' End If
|
245
|
+
End With
|
246
|
+
Next
|
247
|
+
End Function
|
248
|
+
|
249
|
+
|
250
|
+
```
|
3
文言修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -91,6 +91,17 @@
|
|
91
91
|
'こっちは早くしたつもりなんだけどな……
|
92
92
|
Dat = ReadDataEx2(wb, SheetNamesList(i), EvaluationListType)
|
93
93
|
End If
|
94
|
+
'不要かと思って削除したがココが重い予感 ココから
|
95
|
+
If IsArray(Dat) Then
|
96
|
+
'集計表へのデータ記入
|
97
|
+
If Not PutData(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
|
98
|
+
Else
|
99
|
+
Msg = "「" & SheetNamesList(i) & "」シートが削除されているか、評価表年度と台帳年度が一致しません。" & vbLf _
|
100
|
+
& " このシートの読み込みをスキップします。"
|
101
|
+
Call Tools.ShowInfForm2("E", "シートの不在確認", True, "閉じる", False, "", Msg, 0, 0)
|
102
|
+
End If
|
103
|
+
'不要かと思って削除したがココが重い予感 ココまで
|
104
|
+
|
94
105
|
Next
|
95
106
|
|
96
107
|
If (fDebug) Then
|
2
文言修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -67,7 +67,7 @@
|
|
67
67
|
Else
|
68
68
|
Dim wb As Workbook
|
69
69
|
Set wb = Workbooks.Open(strPath & strFileName)
|
70
|
-
' ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめました
|
70
|
+
' ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめました
|
71
71
|
End If
|
72
72
|
|
73
73
|
For i = 0 To UBound(SheetNamesList)
|
1
追記追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -49,4 +49,128 @@
|
|
49
49
|
|
50
50
|
また[VBA 高速化 でググって出てきた文章](https://www.google.com/search?q=vba+%E9%AB%98%E9%80%9F%E5%8C%96&rlz=1C1ROFJ_jaJP718JP718&oq=VBA&aqs=chrome.1.69i57j35i39l2j0i67i433j0i67j0i67i131i433j0i67i433j69i61.2733j0j7&sourceid=chrome&ie=UTF-8)を上から見ていくと
|
51
51
|
[VBAの高速化 - 人はエクセルの能力の10%も使っていない?](https://xoffice.hatenablog.com/entry/2019/11/12/020630)
|
52
|
-
がためになりそうでしたので後で実装予定です
|
52
|
+
がためになりそうでしたので後で実装予定です。
|
53
|
+
|
54
|
+
【追記】
|
55
|
+
================================
|
56
|
+
何かおもったようにパフォーマンスが上がらないので私は何か勘違いしているのかと思い
|
57
|
+
ソースの概要を貼り付けてアドバイスを頂ければと思ったため貼り付け失礼します。
|
58
|
+
```vba
|
59
|
+
Public Function Main(actWs As Worksheet) As Boolean 'Thisworkbook.getData
|
60
|
+
|
61
|
+
'宣言とか色々
|
62
|
+
|
63
|
+
Debug.Print Time & " - スタート"
|
64
|
+
|
65
|
+
Const fDebug As Boolean = True 'Falseだと高速化前
|
66
|
+
If (fDebug) Then
|
67
|
+
Else
|
68
|
+
Dim wb As Workbook
|
69
|
+
Set wb = Workbooks.Open(strPath & strFileName)
|
70
|
+
' ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめましたma2
|
71
|
+
End If
|
72
|
+
|
73
|
+
For i = 0 To UBound(SheetNamesList)
|
74
|
+
'読み込んでいるとのプログレスバーの処理
|
75
|
+
With ProgForm
|
76
|
+
If i > .ProgressBar1.Min And _
|
77
|
+
i <= .ProgressBar1.Max Then
|
78
|
+
'ProgressPercent = CInt(i / UBound(SheetNamesList) * 100)
|
79
|
+
.Label1.Caption = "評価表シートからデータを読み込んでいます。( " & i + 1 & " / " & UBound(SheetNamesList) + 1 & ")"
|
80
|
+
.ProgressBar1.Value = i 'プログレスバーの値を更新
|
81
|
+
DoEvents '滞留処理を実行
|
82
|
+
End If
|
83
|
+
End With
|
84
|
+
'読み込んでいるとのプログレスバーの処理ココまで
|
85
|
+
|
86
|
+
If (fDebug) Then
|
87
|
+
'評価表シートからデータの取得
|
88
|
+
Dat = ReadData(strPath, strFileName, SheetNamesList(i), EvaluationListType)
|
89
|
+
'↑でなんか毎回閉じている気がするので開きっぱなしでやってみたのが↓ で早くなったかどうか分からないので……元のヤツを持ってくるか……
|
90
|
+
Else
|
91
|
+
'こっちは早くしたつもりなんだけどな……
|
92
|
+
Dat = ReadDataEx2(wb, SheetNamesList(i), EvaluationListType)
|
93
|
+
End If
|
94
|
+
Next
|
95
|
+
|
96
|
+
If (fDebug) Then
|
97
|
+
Else
|
98
|
+
wb.Close SaveChanges:=False
|
99
|
+
End If
|
100
|
+
|
101
|
+
Debug.Print Time & " - エンド"
|
102
|
+
|
103
|
+
Exit Function
|
104
|
+
|
105
|
+
|
106
|
+
' ReadDataが重かったのでReadDataEx2に改修。
|
107
|
+
' 改修した手法としては
|
108
|
+
' ・Workbook.openが重いとの事で一つ開きっぱなしにして毎回Openしない
|
109
|
+
' ・
|
110
|
+
Private Function ReadDataEx2(ByVal wb As Workbook, ByVal SheetNames) As Variant
|
111
|
+
'評価表からデータ取得
|
112
|
+
|
113
|
+
|
114
|
+
Dim Dat(40) As Variant, KeyWord As Variant
|
115
|
+
Dim BizWs As Worksheet, Msg As String
|
116
|
+
Dim PathFileSheet As String, strTemp As String
|
117
|
+
Dim i As Integer, FiscalYear As Integer
|
118
|
+
Dim Repres As String, JobPosition As String
|
119
|
+
|
120
|
+
'CellDatas内にデータをコピー
|
121
|
+
Dim CellDatas As Variant
|
122
|
+
CellDatas = wb.Sheets(SheetNames).Range("A1:AI35")
|
123
|
+
|
124
|
+
On Error GoTo ErrProc
|
125
|
+
FiscalYear = Val(CellDatas(2, 13)) '年度表示
|
126
|
+
'年度の整合性検査
|
127
|
+
'Debug.Print Val(ThisWorkbook.ActiveSheet.Cells(1, 1).Value)
|
128
|
+
If FiscalYear <> Val(ThisWorkbook.ActiveSheet.Cells(1, 1).Value) Then
|
129
|
+
GoTo ErrProc
|
130
|
+
End If
|
131
|
+
'読み取りシートがない場合はエラー
|
132
|
+
' Dat(1) = ExecuteExcel4Macro(PathFileSheet & 5 & "C" & 5) '評価実施日
|
133
|
+
' Dat(1) = CLng(wb.Sheets(SheetNames).Cells(5, 5).Value) '評価実施日
|
134
|
+
Dat(1) = CLng(CellDatas(5, 5)) '評価実施日
|
135
|
+
If Dat(1) > ThisWorkbook.RecentRatingDay Then ThisWorkbook.RecentRatingDay = Dat(1)
|
136
|
+
On Error GoTo 0
|
137
|
+
|
138
|
+
Dat(2) = CellDatas(6, 5) '評価店所名
|
139
|
+
With EvaluationSheet '評価表
|
140
|
+
|
141
|
+
Dat(4) = CellDatas(12, 11) '業種CD
|
142
|
+
Dat(5) = CellDatas(12, 5) '業務内容/品目
|
143
|
+
|
144
|
+
'このような内容がDat(34)まで続いている
|
145
|
+
'Dat(34) = ExecuteExcel4Macro(PathFileSheet & 11 & "C" & 11) '取引先担当者
|
146
|
+
'Dat(34) = wb.Sheets(SheetNames).Cells(11, 11).Value '取引先担当者
|
147
|
+
Dat(34) = CellDatas(11, 11) '取引先担当者
|
148
|
+
|
149
|
+
'業務内容/品目
|
150
|
+
On Error GoTo ErrProc
|
151
|
+
KeyWord = Split(wb.Sheets(SheetNames).Cells(35, 3).Value, ",")
|
152
|
+
ReDim Preserve KeyWord(3)
|
153
|
+
For i = 0 To 3 'UBound(KeyWord)
|
154
|
+
Dat(35 + i) = Left(KeyWord(i), 12) 'Dat(35)~Dat(38)
|
155
|
+
If Dat(35 + i) = "" Then Dat(35 + i) = "-"
|
156
|
+
Next
|
157
|
+
On Error GoTo 0
|
158
|
+
|
159
|
+
End With
|
160
|
+
|
161
|
+
'文字種の変更
|
162
|
+
For i = 0 To UBound(Dat)
|
163
|
+
If Dat(i) <> "" And i <> 9 And i <> 34 Then Dat(i) = ChangeChr(Dat(i), i) 'i=7,8はCol=10,11
|
164
|
+
Next
|
165
|
+
|
166
|
+
ReadDataEx2 = Dat
|
167
|
+
|
168
|
+
Exit Function
|
169
|
+
|
170
|
+
ErrProc:
|
171
|
+
ReadDataEx2 = "Err"
|
172
|
+
|
173
|
+
End Function
|
174
|
+
|
175
|
+
```
|
176
|
+
土日にでもじっくり見て動作の高速化を考えてみますがどうすれば早くなりそうかコメント頂ければ幸いです。
|