Code khóa dòng & mở dòng theo một điều kiện! (2 người xem)

Người dùng đang xem chủ đề này

Hong.Van

Busy
Tham gia
7/5/12
Bài viết
2,328
Được thích
1,765
Em chào Thầy cô & anh chị!
Em có đọan code khóa & mở dòng, nhưng sau khi thực hiện thì có một số điểm sau:
Tại cell A1, nhập số 1 thì sẽ Unprotect sheet, nhưng nếu điều chỉnh lựa chọn tại cột H thì những dòng có chữ R tương ứng ở cột H sẽ bị tiếp tục khóa.

Xin giúp em sửa code với điều kiện như sau:
1/ Nếu cell A1 nhập vô số 1 hoặc đang là số 1, thì sẽ Unprotect sheet dù có điều chỉnh hay thay đổi cột H
2/ Nếu cell A1 là trống hoặc khác số 1, thì những dòng có chữ R tại cột K sẽ bị khóa ( những dòng khác không bị khóa)

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range
If Target.Column = 8 Then
Unprotect "123"
Cells.Locked = False
For Each Cl In Range([H7], [H65536].End(3))
If UCase(Cl.Value) = "R" Then Rows(Cl.Row).EntireRow.Locked = True
Next
Protect "123", AllowFiltering:=True
End If
If Target.Address = "$A$1" Then
If Target = 1 Then
ActiveSheet.Unprotect "123"
Else
ActiveSheet.Protect "123", AllowFiltering:=True
End If
End If
End Sub
Em cảm ơn.
 

File đính kèm

Em chào Thầy cô & anh chị!
Em có đọan code khóa & mở dòng, nhưng sau khi thực hiện thì có một số điểm sau:
Tại cell A1, nhập số 1 thì sẽ Unprotect sheet, nhưng nếu điều chỉnh lựa chọn tại cột H thì những dòng có chữ R tương ứng ở cột H sẽ bị tiếp tục khóa.

Xin giúp em sửa code với điều kiện như sau:
1/ Nếu cell A1 nhập vô số 1 hoặc đang là số 1, thì sẽ Unprotect sheet dù có điều chỉnh hay thay đổi cột H
2/ Nếu cell A1 là trống hoặc khác số 1, thì những dòng có chữ R tại cột K sẽ bị khóa ( những dòng khác không bị khóa)

Em cảm ơn.

Mình đọc 1 lúc hết biết khoá mở lúc nào luôn, xem coi phải thế này không

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range
With ActiveSheet
  If Target.Column = 8 And [A1] <> 1 Then
    .Unprotect "123"
    If UCase(Target) = "R" Then Target.EntireRow.Locked = True
    .Protect "123", AllowFiltering:=True
  ElseIf Target.Address = "$A$1" Then
    If Target = 1 Then
      .Unprotect "123"
    Else
      .Protect "123", AllowFiltering:=True
    End If
  End If
End With
End Sub
 
Upvote 0
Mình đọc 1 lúc hết biết khoá mở lúc nào luôn, xem coi phải thế này không

PHP:
  If Target.Column = 8 And [A1] <> 1 Then
    .Unprotect "123"
Em đọc đọan trên thấy nó kỳ kỳ vì điều kiện của em là
1/ Nếu cell A1 nhập vô số 1 hoặc đang là số 1, thì sẽ Unprotect sheet dù có điều chỉnh hay thay đổi cột H
2/ Nếu cell A1 là trống hoặc khác số 1, thì những dòng có chữ R tại cột K sẽ bị khóa ( những dòng khác không bị khóa)
Em cảm ơn!
 
Upvote 0
Bạn thử với code dưới xem thế nào:
(trước hết, sheet cần được đặt pass (123) và cho phép lọc (nhớ kiểm tra thuộc tính locked của các ô bên ngoài vùng dữ liệu để đảm bảo các yêu cầu khác)

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range, iR As Long, ra As Range, i As Long
If Intersect(Target, Union(Me.Columns(8), [A1])) Is Nothing Then Exit Sub
With Application
.ScreenUpdating = False
.EnableEvents = False
    Set Cl = Me.Range(Me.Range("H7"), Me.Range("H7").End(xlDown))
    iR = Cl.Rows.Count
   
    If Me.Range("A1") = 1 Then
        Me.Unprotect "123"
    Else
        Me.Unprotect "123"
        Set ra = Me.Range("A7").Resize(iR, 8)
        ra.Cells.Locked = False
        For i = 1 To iR
            If UCase(Cl(i)) = "R" Then
                ra.Rows(i).Locked = True
            End If
        Next
        Me.Protect "123", AllowFiltering:=True
    End If
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
 
Upvote 0
Hic minh đã nói rồi mình cũng thấy mọi thứ cứ lẩn quẩn sao ấy, nhưng code có đáp ứng được yêu cầu chưa?

Chưa đúng như trong điều kiện của em.
VD: Ban đầu tại dòng thứ 7, tại cell H7 đã chọn chữ R (nghĩa là đã khóa). Bây giờ em nhập số 1 tại cell A1 và tiến hành bỏ chữ R tại H7, rồi bỏ số 1 tại cell A1, quay lại dòng số 7 để nhập liệu thì dòng này vẫn bị khóa??? và các lỗi lúc khóa lúc không khóa...
Em cảm ơn!
 
Upvote 0
Chưa đúng như trong điều kiện của em.
VD: Ban đầu tại dòng thứ 7, tại cell H7 đã chọn chữ R (nghĩa là đã khóa). Bây giờ em nhập số 1 tại cell A1 và tiến hành bỏ chữ R tại H7, rồi bỏ số 1 tại cell A1, quay lại dòng số 7 để nhập liệu thì dòng này vẫn bị khóa??? và các lỗi lúc khóa lúc không khóa...
Em cảm ơn!
Hay là thế này ta? Thử lại xem sao...
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range
With ActiveSheet
  If [a1] = 1 Then
    .Unprotect "123"
  Else
    If Target.Column = 8 Then
      .Unprotect "123"
      If UCase(Target) = "R" Then
        Target.EntireRow.Locked = True
      End If
      .Protect "123", AllowFiltering:=True
    End If
  End If
End With
End Sub
 
Upvote 0
Chưa đúng như trong điều kiện của em.
VD: Ban đầu tại dòng thứ 7, tại cell H7 đã chọn chữ R (nghĩa là đã khóa). Bây giờ em nhập số 1 tại cell A1 và tiến hành bỏ chữ R tại H7, rồi bỏ số 1 tại cell A1, quay lại dòng số 7 để nhập liệu thì dòng này vẫn bị khóa??? và các lỗi lúc khóa lúc không khóa...
Em cảm ơn!
Đầu tiên bỏ Lock cells cho cả bảng tính, Rồi nhập lại các chữ V,R trên cột H để code làm việc lại.
Thử với code này xem:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [H7:H1000]) Is Nothing Then
    If Target.Rows.Count = 1 Then
        With Target.Offset(, -7).Resize(, 8)
            If Target.Value = "R" Then
                .Locked = True
                .FormulaHidden = True
            Else
                .Locked = False
                .FormulaHidden = False
            End If
        End With
    End If
ElseIf Target.Address = "$A$1" Then
    If Target.Value = 1 Then
        ActiveSheet.Unprotect "123"
    Else
        ActiveSheet.Protect "123"
    End If
End If
End Sub
------------
Cũng còn lỗi ảnh hưởng đến cột H khi A1<>1, không thay đổi được từ V thành R.
Híc, tối tính sau.
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng còn lỗi ảnh hưởng đến cột H khi A1<>1, không thay đổi được từ V thành R.
Híc, tối tính sau.
Dạ bài của thầy còn bị lỗi này
------------------
Bài #5 của anh hoangvuluan và bài #7 của anh quanghai1969. Vẫn bị lỗi, nếu A1<>1 và tại cột H là cell trống hoặc có chữ V ở các ở các dòng tương ứng thì các dòng này vẫn bị khóa.
-------------------------------
Em xin mô tả thêm như sau:
Đây là File người khác nhập liệu và gởi cho em kiểm tra, nếu dòng nào đúng thì em đánh chữ R tại cột H tương ứng (dòng này sẽ bị khóa và họ sẽ kg sửa được & khỏi vô tình bị xóa số liệu), nếu sai thì em đánh chữ V (dòng này sẽ không bị khóa và họ sẽ sửa được). Các dòng tương ứng tại cột H chưa có chữ gì thì họ vô tư nhập dữ liệu
Mặc dù đã nhập chữ R tại cột H, nhưng sau này kiểm tra lại vẫn fát hiện sai thì em sẽ thay đổi chữ R thành chữ V và để họ chỉnh sửa lại dòng này
Mục đích em để số 1 và xóa số 1 ở A1, vì em muốn Unprotect & Protect Sheet cho nhanh mà thôi!!!

Em cảm ơn thầy cô & anh chị đã bỏ công sức & thời gian để giúp em bài này.
 
Upvote 0
Bạn mô tả chưa đầy đủ các quy định, chẳng hạn: vùng dữ liệu cố định, cho phép nhập tiếp hay chỉ chỉnh sửa trên dữ liệu đã có???
Các ô chứa công thức có bắt buộc phải ở chế độ locked hay không bất chấp sheet có đang trong chế độ bảo vệ hay không!
(Trong file mẫu không hề có ô nào để rỗng ở cột H - nghĩa là các ô nằm bên dưới!!!)
Nếu chỉ yêu cầu khóa dòng có R ở cột H và bật/tắt chế độ bảo vệ thì bạn thử lại với code sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range, iR As Long, ra As Range, i As Long
If Intersect(Target, Union(Me.Columns(8), [A1])) Is Nothing Then Exit Sub
With Application
.ScreenUpdating = False
.EnableEvents = False
    Set Cl = Me.Range(Me.Range("H7"), Me.Range("H7000").End(xlUp))
    iR = Cl.Rows.Count
    Set ra = Me.Range("A7").Resize(iR, 8)
    Me.Unprotect "123"
    Me.Cells.Locked = False
    If Me.Range("A1") <> 1 Then
        For i = 1 To iR
            If UCase(Cl(i)) = "R" Then
                Cl.Rows(i).EntireRow.Locked = True
            End If
        Next
        Me.Columns(8).Locked = False
        Me.Protect "123", AllowFiltering:=True
    End If
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
 
Upvote 0
Bạn mô tả chưa đầy đủ các quy định, chẳng hạn: vùng dữ liệu cố định, cho phép nhập tiếp hay chỉ chỉnh sửa trên dữ liệu đã có???
Em chưa hiểu lắm câu "vùng dữ liệu cố định" là gì? Nếu "vùng dữ liệu cố định" đã có chữ R ở cột H thì dòng có "vùng dữ liệu cố định" sẽ không cho phép nhập tiếp hay chỉ chỉnh sửa trên dữ liệu đã có. Và ngược lại

Em xin mô tả lại một lần nữa
1/Nếu A1<>1 VÀ tại cột H của các dòng tương ứng có chữ R, thì bị khóa toàn bộ từ cột A đến cột H của dòng đó ( không chỉnh sửa, thêm bớt hay delete dòng này được)
2/Nếu A1<>1 VÀ tại cột H của các dòng tương ứng không có chữ R , thì sẽ không bị khóa toàn bộ của dòng đó ( được chỉnh sửa, thêm bớt hay delete dòng này được)
3/Nếu A1=1 thì cả bảng tính sẽ không bị khóa
(mặc dù tại cột H của các dòng tương ứng có hoặc không có bất kỳ ký tự nào)
Khi khóa thì khóa cả công thức
--------------------
Vì anh dùng chế độ bật/tắt R tại cột H nên xảy ra trường hợp:
Nếu Cell A1<>1 và những dòng có chữ R tại cột H thì khóa cả dòng (trừ cột H), nhưng delete chữ R thì dòng đó sẽ không bị khóa nữa, như vậy người khác vẫn chỉnh sửa được!
Em cảm ơn!
 
Upvote 0
Em chưa hiểu lắm câu "vùng dữ liệu cố định" là gì? Nếu "vùng dữ liệu cố định" đã có chữ R ở cột H thì dòng có "vùng dữ liệu cố định" sẽ không cho phép nhập tiếp hay chỉ chỉnh sửa trên dữ liệu đã có. Và ngược lại

Em xin mô tả lại một lần nữa
1/Nếu A1<>1 VÀ tại cột H của các dòng tương ứng có chữ R, thì bị khóa toàn bộ từ cột A đến cột H của dòng đó ( không chỉnh sửa, thêm bớt hay delete dòng này được)
2/Nếu A1<>1 VÀ tại cột H của các dòng tương ứng không có chữ R , thì sẽ không bị khóa toàn bộ của dòng đó ( được chỉnh sửa, thêm bớt hay delete dòng này được)
3/Nếu A1=1 thì cả bảng tính sẽ không bị khóa
(mặc dù tại cột H của các dòng tương ứng có hoặc không có bất kỳ ký tự nào)
Khi khóa thì khóa cả công thức
--------------------
Vì anh dùng chế độ bật/tắt R tại cột H nên xảy ra trường hợp:
Nếu Cell A1<>1 và những dòng có chữ R tại cột H thì khóa cả dòng (trừ cột H), nhưng delete chữ R thì dòng đó sẽ không bị khóa nữa, như vậy người khác vẫn chỉnh sửa được!
Em cảm ơn!

Thử phát nữa xem sao nhé

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cl As Range
With ActiveSheet
  If [a1] = 1 Then
    .Unprotect "123"
  ElseIf Target.Column = 8 Then
      .Unprotect "123"
      If UCase(Target) = "R" Then
        Target.EntireRow.Locked = True
      End If
      .Protect "123", AllowFiltering:=True
  Else
    .Protect "123", AllowFiltering:=True
  End If
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Ở bài trước, bạn chỉ cần bỏ dòng lệnh này : Me.Columns(8).Locked = False
 
Upvote 0

File đính kèm

Upvote 0
Mình có file cập nhật dữ liệu như đính kèm.
Nhờ các bạn giúp mình code khi nhâp chữ "H" ở cột 88 chẳng hạn thì dữ liệu từ cột 1 tới cột 87 của dòng đó sẽ bị khóa không sửa được.
Mình cảm ơn các bạn.
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom