I am trying to improve the performance of a couple of my Report Form which take several (5 to 10) seconds to complete loading the information (this is down from a previous time of 15 to 20 seconds). While doing research I found multiple threads discussing the processing time advantages of using Range.Copy
reading and writing one row of a range at a time.
Time Factor
and is as follows:
'Begin loading wsCost5Yr Worksheet
For frmYr = sYear To wbCurYear
Debug.Print locID, frmYr
wsSum.Cells(3, "Q") = frmYr 'Cell Q3 of the Summary Worksheet
chartYrsCost.Cells(1, uClmn) = frmYr
For uRow = 1 To 12
'Get Gas Cost Values
costG = sumCostG.Cells(uRow, 1).Value2
'Get Electric cost
costE = sumCostE.Cells(uRow, 1).Value2
Debug.Print costG, costE
'Convert Zero Values to Null
If Not costE = 0 Then
cmp5YrCostEdata.Cells(uRow, uClmn) = costE
Else
cmp5YrCostEdata.Cells(uRow, uClmn) = vbNullString
End If
If Not costG = 0 Then
cmp5YrCostGdata.Cells(uRow, uClmn) = costG
Else
cmp5YrCostGdata.Cells(uRow, uClmn) = vbNullString
End If
Next uRow
uClmn = uClmn 1
Next frmYr
ALL ranges are properly Declared
and Set
during Initialization. The new code I am trying to implement, using the Range.Copy
method is as follows:
'Begin loading wsCost5Yr Worksheet
For frmYr = sYear To wbCurYear
Debug.Print locID, frmYr
wsSum.Cells(3, "Q") = frmYr 'Cell Q3 of the Summary Worksheet
chartYrsCost.Cells(1, uClmn) = frmYr
sumCostG.copy cmp5YrCostGdata.Cells(1, uClmn)
sumCostE.copy cmp5YrCostEdata.Cells(1, uClmn)
For uRow = 1 To 12
'Get Gas Cost Values
costG = cmp5YrCostGdata.Cells(uRow, uClmn).Value2
'Get Electric cost
costE = cmp5YrCostEdata.Cells(uRow, uClmn).Value2
Debug.Print costG, costE
'Convert Zero Values to Null
If Not costE = 0 Then cmp5YrCostEdata.Cells(uRow, uClmn) = vbNullString
If Not costG = 0 Then cmp5YrCostGdata.Cells(uRow, uClmn) = vbNullString
Next uRow
uClmn = uClmn 1
Next frmYr
Both ranges, sumCostG
and sumCostE
contain formulas that perform calculations as described above and and when I look ad the written contents of the destination cell I find #REF!
errors with the actual cell contents as =IF(A20="",#REF!,SUM(#REF!-A20))
!
Range.Copy
method and the more I read the more confused I become. I'm Certain it's something simple that I am missing! Can someone Please Help me with this issue?
Thankyou in advance for your assistance.
CodePudding user response:
Change this:
sumCostG.copy cmp5YrCostGdata.Cells(1, uClmn)
sumCostE.copy cmp5YrCostEdata.Cells(1, uClmn)
to this:
sumCostG.copy
cmp5YrCostGdata.Cells(1, uClmn).PasteSpecial xlPasteValues
sumCostE.copy
cmp5YrCostEdata.Cells(1, uClmn).PasteSpecial xlPasteValues
Another option is destination.value = source.value
:
cmp5YrCostGdata.Cells(1, uClmn).Resize(sumCostG.Rows.Count-1,sumCostG.Columns.Count-1).Value = sumCostG.Value
cmp5YrCostEdata.Cells(1, uClmn).Resize(sumCostE.Rows.Count-1,sumCostE.Columns.Count-1).Value = sumCostE.Value