Home » excel » excel – Lock Entire Row Based On Date

excel – Lock Entire Row Based On Date

Posted by: admin April 23, 2020 Leave a comment

Questions:

I have Cell A1 with Month mentioned. I am trying to compare date in A2:last cell and wherever date > A1, I want the row to be unlocked, otherwise locked. The below code doesn’t work”

Sub Lockrow()
Dim DestSh As Worksheet
Dim lastrow As Long
Dim i As Integer

Set DestSh = Sheets("Consultant & Volunteer")

With DestSh
    'finds the last row with data on A column
    lastrow = .Range("A" & .Rows.Count).End(xlUp).Row

  'parse all rows
    For i = 6 To lastrow
       'if your conditions are met
       If Month(.Cells(i, 26)) > Month(.Cells(1, 1)) Then
          .Range("A" & i).EntireRow.Cells.Locked = True 'lock the row
       End If
    Next i
End With

End Sub
How to&Answers:

This can be done simply with below, but you have to be careful that Year doesn’t change… Also the lastrow should be on Column Z.

Also, if the worksheet isn’t Protected, there is no effect.

Option Explicit

Sub Lockrow()
    Dim DestSh As Worksheet
    Dim lastrow As Long
    Dim i As Long ' Integer

    Set DestSh = Sheets("Consultant & Volunteer")

    With DestSh
        'finds the last row with data on A column
        lastrow = .Range("Z" & .Rows.Count).End(xlUp).Row ' <-- EDIT
        'parse all rows
        For i = 6 To lastrow
           'if your conditions are met               
           .Rows(i).Locked = Not (Month(.Cells(i, "Z")) > Month(.Range("A1")))
'           If Month(.Cells(i, 26)) > Month(.Cells(1, 1)) Then
'              .Range("A" & i).EntireRow.Cells.Locked = True 'lock the row
'           End If
        Next i
        .Protect UserInterfaceOnly:=True
    End With
    Set DestSh = Nothing
End Sub

Answer:

Alternative to loop.

Dim r As Range, DestSh As Worksheet, lastrow As Long
Set DestSh = Sheets("Consultant & Volunteer")
With DestSh
    lastrow = .Range("A" & .Rows.Count).End(xlUp).Row
    Set r = .Range("A1:A" & lastrow)
    r.EntireRow.Locked = False
    r.AutoFilter 1, ">" & .Range("A1").Value2
    r.SpecialCells(xlCellTypeVisible).EntireRow.Locked = True
    .AutoFilterMode = False
    .Protect UserInterfaceOnly:=True
End With