Bẫy lỗi trong Combobox to Textbox

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Trước tiên, tôi cám ơn Sealand và các Anh, Chị trong topic: http://www.giaiphapexcel.com/forum/showthread.php?t=24810
Sau khi tôi kiểm tra và dùng thử thì quá tốt, nhưng tính hay tò mò, tôi nhập bất kỳ ký tự nào đó trong Combobox “Huyen” thì báo lỗi. Từ dòng code dưới đây:
Mã:
[FONT=Times New Roman][SIZE=3]Private Sub Huyen_Change()[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman][SIZE=3][FONT=Times New Roman] TextBox1 = Huyen.Column(1)[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]End Sub[/SIZE][/FONT]
[/FONT][/SIZE]
Tôi đã thêm code để bẫy lỗi như sau (không biết có sai không), tuy nhiên, nhập bất kỳ giá trị gì tại Huyen cũng đều thông báo lỗi dù nhập đúng hay sai:
Mã:
Private[FONT=Times New Roman][SIZE=3] Sub Huyen_Change()[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Dim Msg As String[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]On Error GoTo BaoLoi[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman] TextBox1 = Huyen.Column(1)[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]BaoLoi:[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]   Msg = "Ban nhap chua dung ten Huyen!"[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]   MsgBox Msg[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]End Sub[/SIZE][/FONT]
Vì vậy tôi chọn giải pháp Resume Next, thế nhưng như vậy thì không biết lỗi phát sinh và cũng không thể biết Sự kiện Change tại Huyen có làm cho Textbox1 thay đổi như thế nào, sai đúng ra sao cũng chẳng biết.
Mã:
[FONT=Times New Roman][SIZE=3]Private Sub Huyen_Change()[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman] On Error Resume Next[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman] TextBox1 = Huyen.Column(1)[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]End Sub[/SIZE][/FONT]
Kính nhờ các Anh, Chị hướng dẫn cho Code bẫy lỗi hiệu quả.
Cảm ơn rất nhiều.
 
Lần chỉnh sửa cuối:
Xin lỗi, tôi lại có giải pháp làm được rồi (theo sách hướng dẫn của Thầy PHAN TỰ HƯỚNG):
Mã:
Private Sub Huyen_Change()
Dim ErrMsg As String
On Error GoTo ErrorHandler
    TextBox1 = Huyen.Column(1)
ErrorHandler:
Select Case Err
Case 381
    ErrMsg = "Ban nhap chua dung ten Huyen!"
    MsgBox ErrMsg
    Exit Sub
End Select
End Sub

Tôi lại có thắc mắc khác, ngoài trình độ "binh nhất" (không muốn nói là "binh bét" trong VBA) của tôi như sau:
Nếu combobox "Tinh" với Rowsoure là Tinh, tức là phải làm một cột phụ đặt tên là Tinh, thì chúng ta có thể viết code để lọc ra ngay từ đầu cột A2:A65536 được không, chỉ được dùng tên không trùng và không dùng blank để làm Rowsoure cho Combobox "Tinh" có được không?

Cám ơn các Chuyên gia.
 
Lần chỉnh sửa cuối:
Upvote 0
minhthien321 đã viết:
...Nếu combobox "Tinh" với Rowsoure là Tinh, tức là phải làm một cột phụ đặt tên là Tinh, thì chúng ta có thể viết code để lọc ra ngay từ đầu cột A2:A65536 được không, chỉ được dùng tên không trùng và không dùng blank để làm Rowsoure cho Combobox "Tinh" có được không?
Cám ơn các Chuyên gia.

Tôi bó tay rồi các Anh Chị ui, tìm hàng đóng Combobox trên trang GPE này mà không tìm ra giải pháp theo yêu cầu trên. Các Anh Chị chiếu cố cho!
Một lần nữa xin cảm ơn!
 
Upvote 0
Quá được, Bạn xem Speacialcell của bác Sa_DQ ấy có 1 bài lọc rồi chép sang vùng khác. Ta lợi dụng quá hay cho việc chép vào 1 biến Variant rồi nạp vào Combo bằng lệnh List rất gọn.
Mình gợi ý mà bạn làm được thì chắc bạn không quên được phải không, còn mình đang bận lắm. Mỗi khi nhớ lại vào lướt 1 lát thôi. Bạn thử đi nếu không được ta tính sau.
Chúc bạn thành công như yêu cầu trước.
 
Upvote 0
Quá được, Bạn xem Speacialcell của bác Sa_DQ ấy có 1 bài lọc rồi chép sang vùng khác. Ta lợi dụng quá hay cho việc chép vào 1 biến Variant rồi nạp vào Combo bằng lệnh List rất gọn.
Mình gợi ý mà bạn làm được thì chắc bạn không quên được phải không, còn mình đang bận lắm. Mỗi khi nhớ lại vào lướt 1 lát thôi. Bạn thử đi nếu không được ta tính sau.
Chúc bạn thành công như yêu cầu trước.

Xin được cảm ơn!
Sau vài tiếng đồng hồ mày mò trên Google, vật lộn với hàng trăm thứ code, trên GPE có, Microsoft cũng có, cuối cùng tôi đã thành công khi chắt lọc những tinh hoa của mọi người!!!
Các Anh Chị nào có hứng thú thì tải về "ngâm cứu" nhé!
Một lần nữa xin được cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Chúc mừng bạn. Nhưng dài quá.
Bạn chỉ cần xóa RowSource đi và thêm đoạn code sau là OK
Mã:
Private Sub UserForm_Initialize()
Dim rg, rg1 As Range
Application.ScreenUpdating = False
Set rg = Sheet3.Range("A1:A" & Sheet3.[a56536].End(xlUp).Row)
   rg.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rg, Unique:=True
Set rg1 = rg.SpecialCells(xlCellTypeVisible).Cells
For Each cel In rg1.Cells
If cel <> Sheet3.[a1] Then Me.Tinh.AddItem cel
Next
Sheet3.ShowAllData
Me.Tinh.ListIndex = 0
Set rg = Nothing
Set rg1 = Nothing
Application.ScreenUpdating = True
End Sub
Xin cám ơn bác Sa_DQ hướng dẫn về phương thức SpeacialCell nhé.(Ở đây cũng bị tình trạng như ví dụ HIEUKHONG và KHONGHIEU nên không áp dụng list() được mà phải dùng For thôi)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chúc mừng bạn. Nhưng dài quá.
Bạn chỉ cần xóa RowSource đi và thêm đoạn code sau là OK

Kính thưa anh Sealand, em đã kiểm tra rồi, vấn đề code của anh có nhiều ưu điểm, nhanh và gọn. Tuy nhiên có một số vấn đề cần thêm mắm dặm muối cho code của anh được không?
Thứ 1: Nó không sắp xếp theo ABC
Thứ 2: Khi viết cách hàng, nó vẫn hiển thị ô trắng trong Cobobox Tinh.
Em rất muốn được học hỏi, nhưng code của em chọn lọc thì đã khắc phục được 2 yếu tố trên tuy hơi dài dòng và thêm sheet bớt sheet, nhưng bảo đảm được.
Anh có thể bổ sung thêm không ạ?
 
Upvote 0
Minhthien tham khảo thử nhé, cũng sử lý ngon lành có sao đâu.
Mình tham gia thêm phần bẫy lỗi, mình thấy phần bẫy lỗi vấn có thể thay 1 chút để tránh phải gõ xóa msgbox. Bạn tạo sub kiểm tra nếu ký tự gõ vào mà tạo chuỗi NoMatch thì bỏ ký tự đó. Như vậy, không gõ sai được thì sao có lỗi đó nữa.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn Anh Sealand và Thầy Sa_DQ thật nhiều, bài vừa rồi Sealand post lên, em đã tâm phục rồi, nhưng khẩu thì chưa phục, lý do:

1) Khi anh cho giá trị đầu tiên hiển thị ở Tỉnh, thì ở Huyện không theo range của mình. Cụ thể là khi em lấy tên Anh Sealand làm Tỉnh, thì ở Huyện cho ra giá trị là Quận 1, lẽ ra là Sealand-1, chỉ sau khi chuyển sang tỉnh, thành khác rồi quay lại mới cho ra giá trị đúng.

2) Em làm tới dòng 751 (tức là Sealand-11), nhưng phần Huyện chỉ tồn tại đến Sealand-8 và những khoảng trắng.

PS: Anh xui rồi, gặp gà mờ VBA như em mà lỡ trả lời cho em rồi thì em thường hỏi tới nơi tới chốn cho dù lỗi nhỏ nhất đó!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn thêm 1 dòng như code dưới sẽ OK
Mã:
Private Sub UserForm_Initialize()
Dim luu As Variant
Dim rg, rg1, rg2 As Range
Application.ScreenUpdating = False
Set rg2 = Sheet3.Range("A1:C" & Sheet3.[a56536].End(xlUp).Row)
luu = rg2
Set rg = Sheet3.Range("A1:A" & Sheet3.[a56536].End(xlUp).Row)
   rg2.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
   rg.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rg, Unique:=True
Set rg1 = rg.SpecialCells(xlCellTypeVisible).Cells
For Each cel In rg1.Cells
If cel <> Sheet3.[a1] And cel <> "" Then Me.Tinh.AddItem cel
Next
Sheet3.ShowAllData
Me.Tinh.ListIndex = 0
rg2 = luu
Set rg = Nothing
Set rg1 = Nothing
Set rg2 = Nothing
Application.ScreenUpdating = True
[B][COLOR=Red]Tinh_Change[/COLOR][/B]
End Sub
Mình tham gia là huyện nên dùng Listbox trông trực quan hơn. Mình ví dụ nhé (Enter di chuyển giữa List Huyen và Com Tinh).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Anh Sealand đã nhiệt tình hướng dẫn!

Em đã tâm phục khẩu phục rồi, nhưng có điều vẫn còn lấn cấn ở câu hỏi thứ 2 của em:
2) Em làm tới dòng 751 (tức là Sealand-11), nhưng phần Huyện chỉ tồn tại đến Sealand-8 và những khoảng trắng (ý nói là nó không sort lên hết được).
Mà thôi, em chỉ cần học hỏi nhiêu đây là đủ lắm rồi. Thắc mắc sẽ làm Anh và mọi người phiền lòng.
Em cảm ơn Anh!

PS: Hỏi thêm cái khác Anh nhé, có một file em tải về, chỉnh sửa chút ít, nhưng Macro đang chạy nó không chịu ngừng đã đành rồi mà đôi khi chẳng cho chỉnh sửa hay thao tác trên thanh công cụ gì cả. Em call hay run thì được, mà stop thì chưa biết cách viết code ngừng chạy Macro đó.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Việc thiếu dòng là CountItem là chỉ đếm dòng có mã Sealand, nhưng nạp Huyen lại dùng Resize nó đếm mất 3 dòng trắng, cả tp Hồ Chí Minh cũng vậy, để khắc phục chắc bạn làm được.
Câu hỏi mới:
Vì Macro dang chay nên bạn không xóa dấu nháy của lệnh stop...
Bạn nhấn Ctrl+Breack để dừng và sửa.
 
Lần chỉnh sửa cuối:
Upvote 0
Vì Macro dang chay nên bạn không xóa dấu nháy của lệnh stop...
Bạn nhấn Ctrl+Breack để dừng và sửa.

Vấn đề của em là dùng Worksheet_Activate để mở Macro "RunMarquee" và dùng Workbook_Deactivate để tắt "RunMarquee", nhưng tắt nó như thế nào thì em không biết, em đã tìm khắp Help trong Excel và Google mà không thể tìm ra code.
 
Upvote 0
Nhấn Ctrl+Breack dừng Macro rồi làm như sau:
1/ Bạn khai:
Option Explicit
Public kt As Boolean
Public gsngSpeed As Single

2/ Thêm vào sub của sheet1:
Private Sub Worksheet_Activate()
kt = True
gsngSpeed = 0.15
Call RunMarquee
End Sub
'================
Private Sub Worksheet_Deactivate()
kt = False
End Sub


3/ sửa sub:

Public Sub RunMarquee()
Dim sngStart As Single
Dim sngPausetime As Single
On Error Resume Next
sngStart = Timer
StartHere:
sngPausetime = gsngSpeed
Do While Timer < sngStart + sngPausetime
DoEvents
Loop
Call CellMarquee(Range("Marquee"))
sngStart = Timer
If kt Then GoTo StartHere
End Sub
 

File đính kèm

Upvote 0
Cám ơn Anh Sealand rất rất nhiều! Chúc Anh có một đêm thật ngon giấc!
 
Upvote 0
nếu cột tỉnh mà các tỉnh nằm xen kẻ nhau thì sao? như vậy khi chọn tỉnh thì huyện có hiện ra tương ứng không?
 
Upvote 0
Chào các bạn !

Mình tạo combobox trong excel nhưng gặp phải lỗi này:

Trong danh sách CBB xổ ra mình không thể chọn được một giá trị cho 2 dòng liên tiếp, trong khi đó chọn giá trị khác thì được. Tức là cứ chọn giá trị xen kẻ nó mới cho. Còn thêm lỗi nữa là có khi hàng đầu tiên trong danh sách chọn của CBB bị che mất (scroll bị kéo xuống)

VD: chon Mã hàng A, sau đó xuống hàng chọn tiếp mã hàng A thì không được, chọn mã hàng B thì được, rồi chọn tiếp mã hàng B cũng không được.

Bạn có thể giúp mình không ! Cám ơn nhé !
 
Upvote 0
Chào các bạn !

Mình tạo combobox trong excel nhưng gặp phải lỗi này:

Trong danh sách CBB xổ ra mình không thể chọn được một giá trị cho 2 dòng liên tiếp, trong khi đó chọn giá trị khác thì được. Tức là cứ chọn giá trị xen kẻ nó mới cho. Còn thêm lỗi nữa là có khi hàng đầu tiên trong danh sách chọn của CBB bị che mất (scroll bị kéo xuống)

VD: chon Mã hàng A, sau đó xuống hàng chọn tiếp mã hàng A thì không được, chọn mã hàng B thì được, rồi chọn tiếp mã hàng B cũng không được.

Bạn có thể giúp mình không ! Cám ơn nhé !

Lỗi là ở cách suy luận của bạn thôi, còn ComboBox đâu có lỗi. Khi bạn đã chọn giá trị cho nó là A rồi thì chỉ khi bạn thay đổi nó là B hay C mới cần bạn chọn chứ nó vẫn là A thì nó đâu cần bạn chọn nữa.
 
Upvote 0
Lỗi là ở cách suy luận của bạn thôi, còn ComboBox đâu có lỗi. Khi bạn đã chọn giá trị cho nó là A rồi thì chỉ khi bạn thay đổi nó là B hay C mới cần bạn chọn chứ nó vẫn là A thì nó đâu cần bạn chọn nữa.

Bạn chưa đọc kỹ rồi, mình nói rằng khi chọn giá trị A rồi, xuống hàng tiếp theo chọn lại giá trị A thì không được. Tức là không thể có hai dòng liên tiếp cùng Mã hàng
 
Upvote 0
Web KT

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

Back
Top Bottom