Xóa dữ liệu, code báo lỗi (1 người xem)

Liên hệ QC

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

yeu_excel

Thành viên chính thức
Tham gia
17/10/10
Bài viết
66
Được thích
4
Mình đang muốn đánh tự động như bên word, ví dụ đánh chữ T thì ra môn Toán,...(đã chạy được). Nếu xóa 1 ô thì không sao, xóa nhiều ô thì báo lỗi, ấn end thì bảng tính không khóa lại được (pass là 1234). Vậy code phải sửa lại như thế nào, mong các bạn giúp đỡ. Cám ơn nhiều!
 

File đính kèm

Mình đang muốn đánh tự động như bên word, ví dụ đánh chữ T thì ra môn Toán,...(đã chạy được). Nếu xóa 1 ô thì không sao, xóa nhiều ô thì báo lỗi, ấn end thì bảng tính không khóa lại được (pass là 1234). Vậy code phải sửa lại như thế nào, mong các bạn giúp đỡ. Cám ơn nhiều!
Mình thấy vòng lập của bạn có vấn đề gì đó, tạm thời bạn sửa đoạn code này thành là được
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect "1234"
If Target.Row >= 4 And Target.Row <= 34 And Target.Column >= 5 And Target.Column <= 52 Then
    For i = [B4].Row To [B4].End(xlDown).Row
    If Target.Rows.Count >= 2 Then Exit Sub
        If Target.Value = Cells(i, 1) Then
            Target.Value = Application.WorksheetFunction.VLookup(Target.Value, Range("A4:B" & [B4].End(xlDown).Row), 2, 0)
        End If
    Next
End If
ActiveSheet.Protect "1234"
End Sub
 
Upvote 0
Code không báo lỗi nhưng bảng tính vẫn không khóa lại. Bạn xem lại giùm mình nhé
 
Upvote 0
Code không báo lỗi nhưng bảng tính vẫn không khóa lại. Bạn xem lại giùm mình nhé
Vậy bạn thử với đoạn code này xem sao
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim locksh
ActiveSheet.Unprotect "1234"
On Error Resume Next
If Not Intersect(Target, [E5:E34]) Is Nothing Then
    If Target.Rows.Count >= 2 Then GoTo locksh
        Target.Value = Application.WorksheetFunction.VLookup(Target.Value, Range("A4:B" & [B4].End(xlDown).Row), 2, 0)
End If
locksh:
ActiveSheet.Protect "1234"
End Sub
 
Upvote 0
Điều lưu ý quan trọng khi dùng sự kiện Worksheet_Change:
- Nếu giá trị cần thay đổi nằm ngay chính tai Target thì bắt buộc phải có cặp lệnh:
PHP:
Application.EnableEvents = False
Application.EnableEvents = True
Với lệnh đầu nằm ở đầu code và lệnh cuối nằm ở cuối code
Lý do vì khi ta vừa gõ giá trị nào đó, lập tức giá trị ấy bị thay đổi và đồng thời nó lại kích hoạt sự kiện Worksheet_Change tạo thành 1 vòng lẩn quẩn
- Nếu Target là bao gồm nhiều cell (trong trường hợp copy nơi khác paste vào) thì bắt buộc phải dùng For... Next duyệt qua Target
PHP:
For Each Clls in Target
- Để phòng trường hợp thêm, xóa dòng... và các tính huống không lường trước được, bắt buộc phải bẫy lỗi bằng câu lệnh
PHP:
On Error Goto ExitSub
'..............
'.............
ExitSub:
vân vân và vân vân... Tóm lại, dùng Worksheet_Change phải hết sức cẩn thận. Không phải cứ viết code thấy chạy được là xong đâu
 
Upvote 0
-Type mismatch là loại lỗi lấy râu ông nọ cắm cằm bà kia.
-Khi ta xóa hơn 1 ô, target là một vùng. Câu lệnh If Target.Value = Cells(i, 1)khi thực thi sẽ xảy ra lỗi vì gán cho vùng, giá trị của một ô.
-Trường hợp trên chỉ cần bẫy thế này là đủ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
[B]On Error GoTo Loi:[/B]
ActiveSheet.Unprotect "1234"
If Target.Row >= 4 And Target.Row <= 34 And Target.Column >= 5 And Target.Column <= 52 Then
    For i = [B4].Row To [B4].End(xlDown).Row
        If Target.Value = Cells(i, 1) Then
            Target.Value = Application.WorksheetFunction.VLookup(Target.Value, Range("A4:B" & [B4].End(xlDown).Row), 2, 0)
        End If
    Next
End If
[B]Loi:[/B]
ActiveSheet.Protect "1234"
End Sub
 
Upvote 0
-Type mismatch là loại lỗi lấy râu ông nọ cắm cằm bà kia.
-Khi ta xóa hơn 1 ô, target là một vùng. Câu lệnh If Target.Value = Cells(i, 1)khi thực thi sẽ xảy ra lỗi vì gán cho vùng, giá trị của một ô.
-Trường hợp trên chỉ cần bẫy thế này là đủ:
................
Em rất vui khi lâu lâu lại thấy thầy lên mạng và chứng tỏ được phong độ như ngày nào
Chúc thầy luôn khỏe nha
(Em spam cuối tuần tí)
 
Upvote 0
Web KT

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

Back
Top Bottom