Cách khắc phục lỗi trong Private Sub Worksheet_Change

Liên hệ QC

LanAnh19

Thành viên chính thức
Tham gia
1/5/22
Bài viết
76
Được thích
8
Giới tính
Nữ
Em chào các anh, chị trong diễn đàn
Em có tạo sự kiện, như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A4:A300")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub
Code này tự động chuyển từ viết thường sang viết hoa của Range("A4:A300")
Code này sẽ bị lỗi như: Ví dụ ta nhập vào ô A4 là Lan Em, nếu ta dùng phím Delete xóa ô A4 này đi thì nó bị báo lỗi, thế thì em thêm dòng
On Error Resume Next
thì nó không báo lỗi, nhưng khi ta nhập vào ô A4 thì nó không chuyển từ viết thường sang viết hoa nữa
Cách anh chị cho hỏi, cách khắc phục các lỗi trên để code tiếp tục hoạt động. Xin cảm ơn anh/chị
 
Em chào các anh, chị trong diễn đàn
Em có tạo sự kiện, như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A4:A300")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub
Code này tự động chuyển từ viết thường sang viết hoa của Range("A4:A300")
Code này sẽ bị lỗi như: Ví dụ ta nhập vào ô A4 là Lan Em, nếu ta dùng phím Delete xóa ô A4 này đi thì nó bị báo lỗi, thế thì em thêm dòng
On Error Resume Next
thì nó không báo lỗi, nhưng khi ta nhập vào ô A4 thì nó không chuyển từ viết thường sang viết hoa nữa
Cách anh chị cho hỏi, cách khắc phục các lỗi trên để code tiếp tục hoạt động. Xin cảm ơn anh/chị
Thử thế này xem.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A4:A300")) Is Nothing Then
    If Len(Target.Value) Then
       Target.Value = UCase(Target.Value)
    End If
  End If
End Sub
 
Upvote 0
Cảm ơn bạn nhiều nhé
 
Upvote 0
Em chào các anh, chị trong diễn đàn
Em có tạo sự kiện, như sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A4:A300")) Is Nothing Then
    Target.Value = UCase(Target.Value)
  End If
End Sub
Code này tự động chuyển từ viết thường sang viết hoa của Range("A4:A300")
Code này sẽ bị lỗi như: Ví dụ ta nhập vào ô A4 là Lan Em, nếu ta dùng phím Delete xóa ô A4 này đi thì nó bị báo lỗi, thế thì em thêm dòng
On Error Resume Next
thì nó không báo lỗi, nhưng khi ta nhập vào ô A4 thì nó không chuyển từ viết thường sang viết hoa nữa
Cách anh chị cho hỏi, cách khắc phục các lỗi trên để code tiếp tục hoạt động. Xin cảm ơn anh/chị
Dùng cách như bài trên và chú ý:

Dùng Sự kiện thế này phải luôn nhớ bật tắt Event trong sub đó:

Application.EnableEvents=False

Application.EnableEvents=True

vào các vị trí thích hợp, tại sao thế, tự tìm hiểu xem sao, sẽ rút ra kinh nghiệm về vấn đề này
 
Upvote 0
Do bạn chọn sự kiện xảy ra với một ô duy nhất nên cần thêm điều kiện ràng buộc nếu sự kiện nhiều ô thay đổi thì thoát, và tạm dừng bắt sự kiện khi thay đổi giá trị ô, mã như sau:

JavaScript:
Private Sub Worksheet_Change(ByVal Target As Range)  
  If Target.Address <> Target(1, 1).MergeArea.Address Then Exit Sub
  If Application.Intersect(Target, Range("A4:A300")) Is Nothing Then Exit Sub
  On Error Resume Next
  Application.EnableEvents = False
  Target.Value= UCase(Target.text)
  Application.EnableEvents = True
End Sub
 
Upvote 0
Do bạn chọn sự kiện xảy ra với một ô duy nhất nên cần thêm điều kiện ràng buộc nếu sự kiện nhiều ô thay đổi thì thoát, và tạm dừng bắt sự kiện khi thay đổi giá trị ô, mã như sau:

JavaScript:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address <> Target(1, 1).MergeArea.Address Then Exit Sub
  If Application.Intersect(Target, Range("A4:A300")) Is Nothing Then Exit Sub
  On Error Resume Next
  Application.EnableEvents = False
  Target.Value= UCase(Target.text)
  Application.EnableEvents = True
End Sub
Khả năng thay đổi nhiều ô trong 1 nốt nhạc là điểm cộng mà tự nhiên cấm là sao? Thêm vây thêm cánh không muốn mà lại muốn chặt bớt đi? :D
Nên phục vụ trường hợp thay đổi bất kỳ, rồi ai muốn thay đổi từng ô một thì cứ tự nhiên.

Thử thế này xem.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A4:A300")) Is Nothing Then
    If Len(Target.Value) Then
       Target.Value = UCase(Target.Value)
    End If
  End If
End Sub
Nếu người ta nhập nhiều ô trong một nốt nhạc thì sẽ có lỗi.
 
Lần chỉnh sửa cuối:
Upvote 0
Khả năng thay đổi nhiều ô trong 1 nốt nhạc là điểm cộng mà tự nhiên cấm là sao? Thêm vây thêm cánh không muốn mà lại muốn chặt bớt đi? :D
Nên phục vụ trường hợp thay đổi bất kỳ, rồi ai muốn thay đổi từng ô một thì cứ tự nhiên.

Bác có nhằm gì không. Hàm Ucase làm sao thực thi khi target là mảng giá trị.
 
Upvote 0
Bác có nhằm gì không. Hàm Ucase làm sao thực thi khi target là mảng giá trị.
Tôi không nhầm, chỉ là bạn không hiểu ý tôi.
Nên phục vụ trường hợp thay đổi bất kỳ, rồi ai muốn thay đổi từng ô một thì cứ tự nhiên.

Code của bạn sẽ Exit Sub khi người dùng nhập nhiều giá trị cùng lúc (copy / paste ). Tôi cho đó là tự hạn chế mình. Cứ viết code phục vụ nhiều giá trị đi để mở rộng khả năng của code. Còn sau đó ai thích nhập từng giá trị thì cứ việc chứ có ai cấm đâu. Phục vụ nhiều giá trị và để người dùng lựa chọn nhập nhiều cùng lúc hay từng giá trị một. Cho họ quyền quyết định chứ không phải là code bắt họ phải nhập từng bước.

Tất nhiên để phục vụ nhiều giá trị thì phải sửa code. Không có chỗ nào tôi nói là UCASE phục vụ mảng giá trị.

Mà thôi, làm luôn cho nó nhanh

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vung As Range, cell_ As Range
    Set vung = Intersect(Target, Range("A4:A300"))
    If vung Is Nothing Then Exit Sub
    Application.EnableEvents = False
    For Each cell_ In vung
        cell_.Value = UCase(cell_.Value)
    Next cell_
    Application.EnableEvents = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thử thế này xem.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("A4:A300")) Is Nothing Then
    If Len(Target.Value) Then
       Target.Value = UCase(Target.Value)
    End If
  End If
End Sub
code sai. Không có Application.EnableEvents = False, Application.EnableEvents = True thì code sẽ lặp lại vài lần rồi lỗi.
 
Upvote 0
Thớt yêu cầu sao em sửa lại như vậy, giờ muốn thêm sao mà sửa chẳng được.

JavaScript:
Private Sub Worksheet_Change(ByVal t As Range)
  Set t = Application.Intersect(t , Range("A4:A300"))
  If t Is Nothing Then Exit Sub
  On Error Resume Next
  Application.EnableEvents = False
  t.Value= t.Worksheet.Evaluate("=UPPER(" & t.Address(0,0,External:=1) & ")")
  Application.EnableEvents = True
End Sub
Bài đã được tự động gộp:

Tôi không nhầm, chỉ là bạn không hiểu ý tôi.


Code của bạn sẽ Exit Sub khi người dùng nhập nhiều giá trị cùng lúc (copy / paste ). Tôi cho đó là tự hạn chế mình. Cứ viết code phục vụ nhiều giá trị đi để mở rộng khả năng của code. Còn sau đó ai thích nhập từng giá trị thì cứ việc chứ có ai cấm đâu. Phục vụ nhiều giá trị và để người dùng lựa chọn nhập nhiều cùng lúc hay từng giá trị một. Cho họ quyền quyết định chứ không phải là code bắt họ phải nhập từng bước.

Tất nhiên để phục vụ nhiều giá trị thì phải sửa code. Không có chỗ nào tôi nói là UCASE phục vụ mảng giá trị.

Mà thôi, làm luôn cho nó nhanh

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vung As Range, cell_ As Range
    Set vung = Intersect(Target, Range("A4:A300"))
    If vung Is Nothing Then Exit Sub
    Application.EnableEvents = False
    For Each cell_ In vung
        cell_.Value = UCase(cell_.Value)
    Next cell_
    Application.EnableEvents = True
End Sub
Code của bác cũng sẽ lỗi khi Thớt vô tình nhập công thức trả về lỗi
 
Upvote 0
Thớt yêu cầu sao em sửa lại như vậy, giờ muốn thêm sao mà sửa chẳng được.

JavaScript:
Private Sub Worksheet_Change(ByVal t As Range)
  Set t = Application.Intersect(t , Range("A4:A300"))
  If t Is Nothing Then Exit Sub
  On Error Resume Next
  Application.EnableEvents = False
  t.Value= t.Worksheet.Evaluate("=UPPER(" & t.Address(0,0,External:=1) & ")")
  Application.EnableEvents = True
End Sub
Code sai rành rành kìa. Thử copy và dán vào sheet

a
b

Kết quả sẽ có

A
A

chứ không phải

A
B

Chả nhẽ bạn sẽ sửa theo từng gợi ý của tôi?

Thôi khó quá thì bỏ qua đi.
Code của bác cũng sẽ lỗi khi Thớt vô tình nhập công thức trả về lỗi
Tôi không hiểu bạn nói gì vì tôi không lanh lợi như bạn. Nhưng tôi có cảm giác là bạn không biết phân biệt lỗi. Có những lỗi do code gây ra, do vi phạm nghệ thuật lập trình. Vd. bạn không tắt phục vuđ sự kiện mà trong procedure Change lại thay đổi giá trị các ô trên sheet thì rõ ràng nghệ thuật code có vấn đề. Có những lỗi do người sử dụng gây ra. Tại sao người viết code phải cố "đỡ" trong mọi trường hợp khi người dùng sử dụng sai? Mọi hàm Excel nếu sử dụng sai thì chúng cũng trả về lỗi đó thôi. Mà lỗi thì có sao, đâu cứ phải "che" nó đi. Khi bạn sử dụng hàm Excel sai mà nó trả về lỗi thì bạn cũng phê bình Excel?
 
Upvote 0
Web KT

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

Back
Top Bottom