简体   繁体   中英

Macro treats single cell as range

In my code, I get runtime error 1004, "unable to set the Locked property of the Range class" every time if I change BX cell value from unlocked to any other. If I change any other value to unlocked code runs good. However, even if C column cells weren't previously merged the error occurs. Also, even if C cells where previously merged, they should be unmerged by Target.Offset(0, 1).Value = "0" this line, which calls second condition in my function. Why I'm getting this error?

Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Dim pass As String
    pass = "" 'set the password. Otherwise, protection/unprotection is done without a pass
    
    If Not Intersect(Target, Range("B14:B50")) Is Nothing And Sh.Name <> "Dane" Then
        If Target.Cells.Count > 1 Then Exit Sub
        ActiveSheet.Unprotect pass
        If Target.Value = "Unlocked" Then
            Target.Offset(0, 1).Locked = False
        Else
            Target.Offset(0, 1).Value = "0"
            Target.Offset(0, 1).Locked = True
        End If
        ActiveSheet.Protect pass
    End If
    
    If Not Intersect(Target, Range("C14:C50")) Is Nothing And Sh.Name <> "Dane" Then
        Dim i As Long
        Dim rng As Range
        Application.DisplayAlerts = False
        Application.EnableEvents = False
        ActiveSheet.Unprotect pass
        For i = 1 To 8 Step 1
            If i <> 6 And i <> 7 And Cells(Target.Row, i).MergeCells Then
                Cells(Target.Row, i).UnMerge
            End If
        Next i
        If Target.Value <> 0 Then
            Dim cf As Boolean
            If Target.Value > 1 Then
                For i = 1 To 8 Step 1
                    If i <> 6 And i <> 7 Then
                        Range(Cells(Target.Row, i), Cells(Target.Row + Target.Value - 1, i)).Merge
                    End If
                Next i
            End If
            For i = 14 To 50 Step 1
                If Not cf Then
                    Set rng = Range("A" & i).MergeArea.Resize(, 8)
                    With rng
                        .Borders.LineStyle = xlNone
                        .Interior.Color = RGB(217, 225, 242)
                        .BorderAround xlContinuous, xlThin, Color:=RGB(142, 169, 219)

                    End With
                Else
                    Range("A" & i).MergeArea.Resize(, 8).Interior.Color = xlNone
                End If
                
                i = (i + Range("A" & i).MergeArea.Cells.CountLarge) - 1
                cf = Not cf
            Next i
            
        End If
        ActiveSheet.Protect pass
        Application.EnableEvents = True
        Application.DisplayAlerts = True
    End If
    
End Sub 

I think, your code problem is the following:

Any change in "C14:C50" range (even done by first event part, a change in range "B14:B50"), will indeed trigger the second event part, which will merge/unmerge ranges as you want. I did not spend to much time to understand if all logic is OK.

The problem is that this second triggered event ends with ActiveSheet.Protect pass .

The first interrupted event does not start from the beginning . It continues from the line where has been stopped. Meaning that the worksheet will not be unprotected in the moment you try locking a cell in C:C column .

In order to solve the problem, please insert the next line:

If ActiveSheet.ProtectContents Then ActiveSheet.Unprotect pass

just before:

Target.Offset(0, 1).Locked = True

The inserted line, will unprotect the sheet in the situation described above, too.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM