Hi,
I have the following macro that I wrote for a small excel project. As this excel has lots of records it is taking too much time to run the macro. Is there anything I can do to speed up the running time and optimize my code? I am new to vb, so any tips will be much appreciated.
Here is my code.
Public Const R7ExpiryDays As Integer = 3
Public Const DExpiryDays As Integer = 14
Public Const I123ExpiryDays As Integer = 30
Sub NoScreenRePainting()
Application.ScreenUpdating = False
DMOFeedback
Application.ScreenUpdating = True
End Sub
Sub DMOFeedback()
Dim LeadDt As Range
Dim AtDt1 As Range
Dim AtDt2 As Range
Dim AtDt3 As Range
Dim Rslt1 As String
Dim Rslt2 As String
Dim Rslt3 As String
Dim i As Double
Dim FinalRow As Double
Dim StartTime As Date
Dim EndTime As Date
ActiveCell.Select
ActiveSheet.Unprotect Password:="dmtm2009"
StartTime = Time
' Find the last row
Sheets("LeadTemplate").Select
FinalRow = Cells(Rows.Count, 3).End(xlUp).Row
For i = 13 To FinalRow
' Set the object
Set LeadDt = Cells(i, 3)
Set AtDt1 = Cells(i, 45)
' Set Rslt1 = Cells(i, 46)
Set AtDt2 = Cells(i, 47)
' Set Rslt2 = Cells(i, 48)
Set AtDt3 = Cells(i, 49)
' Set Rslt3 = Cells(1, 50)
' move value from the cell to the variable
LeadDt = Cells(i, 3).Value
AtDt1 = Cells(i, 45).Value
Rslt1 = Cells(i, 46).Value
AtDt2 = Cells(i, 47).Value
Rslt2 = Cells(i, 48).Value
AtDt3 = Cells(i, 49).Value
Rslt3 = Cells(i, 50).Value
On Error GoTo Errorhandler
' call the subroutine to protect the cells
If Not IsEmpty(LeadDt.Value) Then
Worksheet_Change LeadDt, AtDt1, Rslt1, AtDt2, Rslt2, AtDt3, Rslt3, i
End If
Next i
ActiveSheet.Protect Password:="dmtm2009", AllowFiltering:=True, AllowUsingPivotTables:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True
EndTime = Time
'MsgBox " StartTime is " & StartTime & " EndTime is " & EndTime
MsgBox "Save Complete. Thank you"
Exit Sub
Errorhandler:
ActiveSheet.Protect Password:="dmtm2009", AllowFiltering:=True, AllowUsingPivotTables:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True
MsgBox Err & ": " & Error(Err)
End Sub
Private Sub Worksheet_Change(ByVal LeadDate As Range, AtDate1 As Range, Result1 As String, AtDate2 As Range, Result2 As String, AtDate3 As Range, Result3 As String, x As Double)
' This is the code for Lead date
If LeadDate.Column = 3 Then
If LeadDate.Value < Date Then
LeadDate.Select
Selection.Locked = True
Cells(x, 1).Locked = True
Cells(x, 2).Locked = True
Else
LeadDate.Select
Selection.Locked = False
Cells(x, 1).Locked = False
Cells(x, 2).Locked = False
End If
End If
' **************
' Code for Attempt Date 1
If AtDate1.Column = 45 Then
' If Not IsEmpty(Result1.Value) Then
If Result1 <> "" Then
If IsEmpty(AtDate1.Value) Then
AtDate1.Value = Date
End If
If AtDate1.Value < Date Then
AtDate1.Select
Selection.Locked = True
Cells(x, 46).Locked = True
Else
AtDate1.Select
Selection.Locked = False
Cells(x, 46).Locked = False
End If
' Set Expiry date if required
Select Case Result1
Case Is = "R7"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays
End Select
Case Is = "r7"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + R7ExpiryDays
End Select
Case Is = "D1"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + DExpiryDays
End Select
Case Is = "D2"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + DExpiryDays
End Select
Case Is = "d1"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + DExpiryDays
End Select
Case Is = "d2"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + DExpiryDays
End Select
Case Is = "I3"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays
End Select
Case Is = "I1"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays
End Select
Case Is = "I2"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays
End Select
Case Is = "i1"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays
End Select
Case Is = "i2"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays
End Select
Case Is = "i3"
Select Case Weekday(AtDate1.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate1.Value + I123ExpiryDays
End Select
Case Is = "R2" 'R2 is also a pending condition so should do nothing
Cells(x, 47).Locked = False
Cells(x, 48).Locked = False
Cells(x, 49).Locked = False
Cells(x, 50).Locked = False
Case Is = "r2"
Cells(x, 47).Locked = False
Cells(x, 48).Locked = False
Cells(x, 49).Locked = False
Cells(x, 50).Locked = False
Case Else 'For all other reject codes the user should not be able to enter further tries
Cells(x, 47).Locked = True
Cells(x, 48).Locked = True
Cells(x, 49).Locked = True
Cells(x, 50).Locked = True
End Select
End If
End If
' **************
' Code for Attempt Date 2
'If Not IsEmpty(Result1.Value) Then
If Result1 <> "" Then
If AtDate2.Column = 47 Then
' If Not IsEmpty(Result2.Value) Then
If Result2 <> "" Then
If IsEmpty(AtDate2.Value) Then
AtDate2.Value = Date
End If
If AtDate2.Value < Date Then
AtDate2.Select
Selection.Locked = True
Cells(x, 48).Locked = True
Else
AtDate2.Select
Selection.Locked = False
Cells(x, 48).Locked = False
End If
' Set Expiry date if required
If Result1 = "R2" Or Result1 = "r2" Then
Select Case Result2
Case Is = "R7"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays
End Select
Case Is = "r7"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + R7ExpiryDays
End Select
Case Is = "D1"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + DExpiryDays
End Select
Case Is = "D2"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + DExpiryDays
End Select
Case Is = "d1"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + DExpiryDays
End Select
Case Is = "d2"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + DExpiryDays
End Select
Case Is = "I3"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays
End Select
Case Is = "I1"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays
End Select
Case Is = "I2"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays
End Select
Case Is = "i1"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays
End Select
Case Is = "i2"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays
End Select
Case Is = "i3"
Select Case Weekday(AtDate2.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate2.Value + I123ExpiryDays
End Select
Case Is = "R2" 'R2 is also a pending condition so should do nothing
Cells(x, 49).Locked = False
Cells(x, 50).Locked = False
Case Is = "r2"
Cells(x, 49).Locked = False
Cells(x, 50).Locked = False
Case Else 'For all other reject codes the user should not be able to enter further tries
Cells(x, 49).Locked = True
Cells(x, 50).Locked = True
End Select
End If
End If
End If
End If
' **************
' Code for Attempt Date 3
'If Not IsEmpty(Result1.Value) Then
'If Not IsEmpty(Result2.Value) Then
If Result1 <> "" Then
If Result2 <> "" Then
If AtDate3.Column = 49 Then
' If Not IsEmpty(Result3.Value) Then
If Result3 <> "" Then
If IsEmpty(AtDate3.Value) Then
AtDate3.Value = Date
End If
If AtDate3.Value < Date Then
AtDate3.Select
Selection.Locked = True
Cells(x, 50).Locked = True
Else
AtDate3.Select
Selection.Locked = False
Cells(x, 50).Locked = False
End If
' Set Expiry date if required
If Result1 = "R2" Or Result1 = "r2" Or Result2 = "R2" Or Result2 = "r2" Then
Select Case Result3
Case Is = "R7"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays
End Select
Case Is = "r7"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + R7ExpiryDays
End Select
Case Is = "D1"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + DExpiryDays
End Select
Case Is = "D2"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + DExpiryDays
End Select
Case Is = "d1"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + DExpiryDays
End Select
Case Is = "d2"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + DExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + DExpiryDays
End Select
Case Is = "I3"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays
End Select
Case Is = "I1"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays
End Select
Case Is = "I2"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays
End Select
Case Is = "i1"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays
End Select
Case Is = "i2"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays
End Select
Case Is = "i3"
Select Case Weekday(AtDate3.Value)
Case Is = vbFriday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 3
Case Is = vbSaturday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 2
Case Is = vbSunday
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays + 1
Case Else
Cells(x, 55).Value = AtDate3.Value + I123ExpiryDays
End Select
End Select
End If
End If
End If
End If
End If
End Sub