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

質問編集履歴

5

追記追加

2021/03/23 05:11

投稿

ma2hiro
ma2hiro

スコア159

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

文言修正

2021/03/23 05:11

投稿

ma2hiro
ma2hiro

スコア159

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 = True 'Falseだと高速化
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
- If Not PutData(actWs, Dat, SheetNamesList(i)) Then GoTo ErrProc3
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

文言修正

2021/03/22 08:36

投稿

ma2hiro
ma2hiro

スコア159

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

文言修正

2021/03/19 09:32

投稿

ma2hiro
ma2hiro

スコア159

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
- '    ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめましたma2
70
+ '    ↑↑↑↑↑↑↑が時間がかかるとの事なのでこちらを一回にまとめました
71
71
  End If
72
72
 
73
73
  For i = 0 To UBound(SheetNamesList)

1

追記追加

2021/03/19 06:37

投稿

ma2hiro
ma2hiro

スコア159

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
+ 土日にでもじっくり見て動作の高速化を考えてみますがどうすれば早くなりそうかコメント頂ければ幸いです。