一部のファイルを処理するには時間がかかるコードブロックがあります。小さなファイル(データ行数が少ない)はうまく動作しますが、150-300程度になると、処理が遅くなることがあります(実際にはプロセス全体がちょうどハングアップしていると思うこともあります)。 6,000。ExcelでVBAを使用したループスルー範囲
.FormulaR1C1
のVLookup()
機能にいくつかのセルを接続したいとします。私は.Range("J2:J" & MaxRow)
を使って全範囲を一度に設定できることを知っています。しかし、私はそれらの細胞の価値をチェックするために細胞のブロックをループしています。 IFが空です。THEN私はこの式を適用したいと思います。それらのセルに既に値がある場合、それらを変更したくないので、私は全体の範囲オプションが私のために働くとは思わない(少なくとも私はそれを得ることができませんでした)。
Private Sub PullMIAFinalizedData(NewMIARep As Worksheet, MaxRow As Long, wkbFinalized As Workbook)
Dim wksFinalized As Worksheet
Dim lCount As Long
Dim sVLookupJBlock As String
Dim sVLookupKBlock As String
Application.Calculation = xlCalculationManual
sVLookupJBlock = "=IF(ISERROR(" & _
"VLOOKUP(RC1,'[" & wkbFinalized.Name & "]" & wksFinalized.Name & "'!C1:C13,13,FALSE))," & _
Chr(34) & Chr(34) & _
",VLOOKUP(RC1,'[" & wkbFinalized.Name & "]" & wksFinalized.Name & "'!C1:C13,13,FALSE))"
sVLookupKBlock = "=IF(ISERROR(" & _
"VLOOKUP(RC1,'[" & wkbFinalized.Name & "]" & wksFinalized.Name & "'!C1:C3,3,FALSE))," & _
Chr(34) & Chr(34) & _
",VLOOKUP(RC1,'[" & wkbFinalized.Name & "]" & wksFinalized.Name & "'!C1:C3,3,FALSE))"
For Each wksFinalized In wkbFinalized.Sheets
ShowAllRecords wksFinalized 'Custom Function to unhide/unfilter all data
With NewMIARep
For lCount = 2 To MaxRow
If .Range("J" & lCount).value = "" And .Range("K" & lCount).value = "" Then
.Range("J" & lCount).FormulaR1C1 = sVLookupJBlock
.Range("K" & lCount).FormulaR1C1 = sVLookupKBlock
Application.Calculate
With .Range("J" & lCount & ":K" & lCount)
.value = .value
End With
End If
Next lCount
.Range("J2:J" & MaxRow).NumberFormat = "mm/dd/yyyy"
End With
Next wksFinalized
Application.Calculation = xlCalculationAutomatic
End Sub
私はちょうどこれにこだわっていますか?
何がsVLookupJBlockですか?あなたは完全なコードを投稿できますか? – assylias
'Application.Calculate'を削除してみてください。 'Vlookup'の代わりに' .Find'を使うことも考えました(あなたはそれらを値に変換しているので?)このリンクの第4章を参照してください。http://siddharthrout.wordpress.com/2011/07/14/find-and -findnext-in-excel-vba/ –
各行で 'Calculate'する必要はありますか?そうでない場合は、計算を手動に変更します。また、画面更新をオフにする必要があります: 'Application.ScreenUpdating = FALSE'とループの後に再度オンにすることを忘れないでください。 – bernie