Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,911
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Giả sử các bạn tạo ra 1 Add-In có tên là Test.xla, trong Add-In này có 1 công đoạn xác định tên của Workbook nào đó vừa mở.
Ví dụ: (sau khi Add-In đã được kích hoạt)
- Tôi mở 1 workbook có tên là TestA.xls, lập tức 1 MsgBox xuất hiện với nội dung "Bạn vừa mở file TestA.xls"
- Tôi mở tiếp 1 workbook khác có tên là TestB.xls, lập tức 1 MsgBox xuất hiện với nội dung "Bạn vừa mở file TestB.xls"
Nói tóm lại: Cứ có Workbook nào được mở thì sẽ có thông báo xuất hiện cho biết tên của Workbook đó
Xin hỏi: Tôi phải viết code cho Add-In này như thế nào?


1. Ta làm một class để phục vụ các sự kiện của Application. Gọi là "CÁC" thôi chứ ta định phục vụ 1 sự kiện: WorkbookOpen.

Ta Insert 1 Class module và đặt tên vd. là clsAppEvents

Ta khai báo, "nộp đơn" là ta muốn phục vụ các sự kiện của Application:

Private WithEvents ExcelApp As Excel.Application

Trong cửa sổ code ở trên cùng có 2 combobox. Ta chọn Class ở combo bên trái rồi chọn Terminate ở combo bên phải, rồi nhập code: Set ExcelApp = Nothing
Ta chọn ExcelApp ở combo bên trái rồi chọn WorkbookOpen ở combo bên phải, rồi nhập code:
MsgBox "Ban vua mo file " & Wb.Name
Ta viết thêm sub SetExcelApp.

Toàn bộ code trong clsAppEvents:

Mã:
Private WithEvents ExcelApp As Excel.Application

Public Sub SetExcelApp(ByVal Excel As Excel.Application)
    Set ExcelApp = Excel
End Sub

Private Sub Class_Terminate()
    Set ExcelApp = Nothing
End Sub

Private Sub ExcelApp_WorkbookOpen(ByVal Wb As Workbook)
        MsgBox "Ban vua mo file " & Wb.Name
End Sub

2. Ta Insert Module1.
Code module1:

Mã:
Dim AppEvents As clsAppEvents

Private Sub Auto_Open()
    StartTrack
End Sub

Private Sub Auto_Close()
    StopTrack
End Sub

Sub StartTrack()
    Set AppEvents = New clsAppEvents 
    AppEvents.SetExcelApp Application
End Sub

Sub StopTrack()
    Set AppEvents = Nothing
End Sub

Nếu muốn các sự kiện khác thì chọn thêm.
 
Lần chỉnh sửa cuối:
Upvote 0
1. Ta làm một class để phục vụ các sự kiện của Application. Gọi là "CÁC" thôi chứ ta định phục vụ 1 sự kiện: WorkbookOpen.

Trời ơi!
Đố người có trình độ bằng em trở xuống thôi anh ơi
Anh mà vào cuộc thì.. lộ bí mật hết trơn rồi còn gì
Ẹc... Ẹc...
----------------
Thật ra em đang dự tính làm 1 Add-In xóa Style rác và xóa name rác (code của anh) với mục đích code sê chạy khi có bất cứ file nào đó mở lên. Đương nhiên phải có sự tham gia của Class để "bắt" sự kiện Open của 1 workbook nào đó rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Trời ơi!
Đố người có trình độ bằng em trở xuống thôi anh ơi
Anh mà vào cuộc thì.. lộ bí mật hết trơn rồi còn gì
Ẹc... Ẹc...
----------------
Thật ra em đang dự tính làm 1 Add-In xóa Style rác và xóa name rác (code của anh) với mục đích code sê chạy khi có bất cứ file nào đó mở lên. Đương nhiên phải có sự tham gia của Class để "bắt" sự kiện Open của 1 workbook nào đó rồi

Chết thật, vô tình làm hỏng cuộc chơi của mọi người.
Từ sau viết rõ nhé. Là chỉ dành cho những người đã gửi ít nhất là 2000, 3000 bài trở lên.
 
Upvote 0
Chết thật, vô tình làm hỏng cuộc chơi của mọi người.
Từ sau viết rõ nhé. Là chỉ dành cho những người đã gửi ít nhất là 2000, 3000 bài trở lên.

Ác cái TRÌNH ĐỘ hổng phải dựa vào số bài gửi để phân định
Thôi thì thay vì giải đố, anh làm người RA ĐỀ đi, em thấy hay hơn
Ẹc... Ẹc...
 
Upvote 0
Ác cái TRÌNH ĐỘ hổng phải dựa vào số bài gửi để phân định
Thôi thì thay vì giải đố, anh làm người RA ĐỀ đi, em thấy hay hơn
Ẹc... Ẹc...

Đúng vậy đó! Em có hơn 3000 bài mà hết 1000 bài để hỏi, 1500 bài để tám + spam, còn lại mới trả lời à! Trình độ và số bài đôi khi là tỉ lệ nghịch! ẹc ... ẹc ...
 
Upvote 0
Ác cái TRÌNH ĐỘ hổng phải dựa vào số bài gửi để phân định
Thôi thì thay vì giải đố, anh làm người RA ĐỀ đi, em thấy hay hơn
Ẹc... Ẹc...

Khổ cái là tôi lười vô kể, vua lười mà.
Vì thế rất ít khi ngồi chơi cờ với ai đó do phải nghĩ liên tục mà. Nhưng ngồi ngoài "quân sư" thì lại thích vô cùng.
 
Upvote 0
Khổ cái là tôi lười vô kể, vua lười mà.
Vì thế rất ít khi ngồi chơi cờ với ai đó do phải nghĩ liên tục mà. Nhưng ngồi ngoài "quân sư" thì lại thích vô cùng.

Nếu Anh mà lười thì không ai siêng được cả! Nhìn các bài viết của Anh vừa trình bày rõ ràng, lập luận sâu sắc, code lại có phần diễn giải... Càng nhiều người mà "lười" như anh thì đỡ biết mấy!

Thêm:

Dạo này còn có phần "tếu tếu" giống giọng điệu của bác Concogia và ndu nữa! Có cảm giác như Mr.Okebap...
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Lâu lâu mình tham gia đố vui một chút!

Chắc có lẽ là rất dễ với người đã biết kakaka.

Với Form, code đang chạy, ta bấm tổ hợp phím Ctrl+Pause (Break) sẽ làm cho code, form bị ngắt thủ tục, sẽ báo lỗi tạm ngưng thủ tục.

Vậy với phương thức nào hoặc thủ tục nào hoặc thuộc tính nào, dù cho bấm tổ hợp phím trên code hay form vẫn hoạt động bình thường!

Nào, chúng ta bắt đầu với file mẫu nhé!

Bấm nút Show Form trên sheet để form hiện ra, sau đó bấm Ctrl+Pause (Break) sẽ thấy nó ngưng hoạt động form. Thoát form, rồi tìm cách khống chế nó nhé!

Trả lời đúng đáp án và ngắn gọn (nếu có khác) thì sẽ được thưởng!

Ai trả lời đầu tiên sẽ được 2 chai sữa bắp từ Hoàng Trọng Nghĩa!

=================================================

Phương thức trả lời: KHÔNG GỬI LÊN ĐÂY!

Gửi Mail qua địa chỉ: NghiaCSG@yahoo.com

Đến hết ngày thứ hai, sáng ngày thứ ba tuần này, nếu ai có bài gửi mình sẽ post đáp án của người đó lên đây!

Tính thời gian theo thời gian của thư đã nhận nhé! Lưu ý nhớ đề nick của GPE nhé các bạn.

Tham gia cho vui nhé mọi người!
 

File đính kèm

  • DoVui.xls
    28.5 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Đã gọi là CÙNG NHAU HỌC HỎI, giờ không gửi lên đây thì vui quỷ gì chứ

Vì có thưởng nên cho vui vậy thôi, chứ người nào gửi xong em cũng post lên bài của người đó à!

Thôi thì gửi đại lên đây đi, mail móc chi cho thêm mất công

Lẽ ra Hai Lúa Miền Tây không được tham gia, vì bài này ngày xưa chính Hai Lúa Miền Tây đã hướng dẫn cho mọi người về đề tài này, mình bổn cũ soạn lại. Hic hic.

Tại đây:

http://www.giaiphapexcel.com/forum/showthread.php?36694-Khoá-Ctrl-Break

(Vì đố vui nên bài này mình đã xóa phần code, chút trả lại nguyên bản)

Hai Lúa Miền Tây đã trả lời chính xác rồi đấy ạ! Mà theo nguyên tắc có được 2 chai sữa bắp không ta?
 

File đính kèm

  • DapAn.jpg
    DapAn.jpg
    60.4 KB · Đọc: 79
Lần chỉnh sửa cuối:
Upvote 0
Báo lỗi khi nhập không đúng mục trong list của ComboBox khi Exit khỏi nó.

Tôi nhớ đã rất lâu tôi có hỏi thuộc tính này tại diễn đàn mình, và được hướng dẫn như sau:

PHP:
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
      If ComboBox1 = "" Then Exit Sub

      Dim i As Long
      
      For i = 0 To ComboBox1.ListCount - 1
            If ComboBox1.List(i) = ComboBox1 Then Exit For
      Next
      
      If i = ComboBox1.ListCount Then
            MsgBox "Ban chi duoc nhap muc co san trong list ma thoi!"
            Cancel = True
      End If
End Sub

Bây giờ tôi xin đố cũng với nội dung đó như sau:

ComboBox có thuộc tính MatchRequired, nếu chọn True thì khi đã Focus vào nó nếu gõ không đúng mục
trong list, thậm chí là xóa không có ký tự nào, khi Exit nó báo lỗi "Invalid Property Value" rất khó chịu.

Chúng ta đang cần là:

1) Nếu không gõ gì trong ComboBox thì Exit thoải mái.

2) Nếu gõ không đúng mục trong List thì khi Exit sẽ thông báo lỗi, dĩ nhiên bằng tiếng Việt (dù là không dấu) cho dễ hiểu.

ĐỐ BẠN:

Vậy bằng bất cứ sự kiện nào, thủ tục nào liên quan đến ComboBox ta sẽ thực hiện được 2 điều kiện trên, nếu không dùng vòng lặp For … Next càng tốt?

Thời gian của ai nhanh nhất người đó thắng!

Nói chung thủ tục này giống với thuộc tính MatchRequired=True, chỉ khác rỗng không báo lỗi và báo bằng msgbox của mình, thời gian thông báo như thuộc tính này (rất nhanh).

Nạp List hoặc nạp RowSource cho 2 ComboBox rồi thực hiện nhé (có sẳn nút lệnh nạp trên form)!

Dữ liệu là 1 cột và 65,536 dòng.
 

File đính kèm

  • XuLyLoi.rar
    362.2 KB · Đọc: 17
Lần chỉnh sửa cuối:
Upvote 0
Các bạn ơi, hãy tham gia đi nhé! Bất cứ thành viên nào của diễn đàn mình!
 
Upvote 0
Các bạn ơi, hãy tham gia đi nhé! Bất cứ thành viên nào của diễn đàn mình!

Có phần thưởng gì không HTN?

Có chút nhiều nhiều thì tham gia cho xum tụ (nhớ đừng sữa bắp nữa - món phụ nữ quá và khó chuyển phát)

để bắt đầu tìm hiểu xem nào, form là khó nhai
-------------------
Hỏi thêm là luôn vào File đó ah, làm cả 2 combobox? làm sao đo thời gian đây?
 
Lần chỉnh sửa cuối:
Upvote 0
Có phần thưởng gì không HTN?

Có chút nhiều nhiều thì tham gia cho xum tụ (nhớ đừng sữa bắp nữa - món phụ nữ quá và khó chuyển phát)

để bắt đầu tìm hiểu xem nào, form là khó nhai
-------------------
Hỏi thêm là luôn vào File đó ah, làm cả 2 combobox? làm sao đo thời gian đây?

Lắm lúc tự mình tìm ra một nguyên tắc, một điều thú vị, một lối đi mới ... đó chính là phần thưởng của riêng mình, đó là niềm tự hào, có phải vậy không?

Chỉ thực hiện trên ComboBox1 thôi, chúng ta bỏ thủ tục Exit ban đầu và thay vào thủ tục của mình. Còn ComboBox2 chỉ là ví dụ để so sánh cách mà thuộc tính MatchRequied=True nó thực hiện như thế nào thôi. Mà có đo thời gian cho thằng này cũng chẳng biết đo nó ở đâu và như thế nào nữa, chỉ biết rằng khi mình thoát ra là ảnh báo lỗi liền, rất nhanh!
 
Upvote 0
Tham gia cho vui đi các bạn ơi, nếu không đúng đáp án cũng là học lẫn nhau là chính mà!

Nếu như không ai có đáp án, thì ngày mai mình tự "sướng" luôn vậy!
 
Upvote 0
Tham gia cho vui đi các bạn ơi, nếu không đúng đáp án cũng là học lẫn nhau là chính mà!

Nếu như không ai có đáp án, thì ngày mai mình tự "sướng" luôn vậy!

Vậy cụ thể là thế nào? Cái ComboBox mà ta xét có MatchRequired=True hay không? Triết lý của MatchRequired=True là cho tới tận khi ta không nhập dữ liệu khớp với 1 mục trong List thì ta sẽ nhận được thông báo "khó chịu" và không thoát được ComboBox. Bạn phàn nàn là thông báo "khó chịu" nhưng nhiệm vụ của MatchRequired=True là thế. Bạn thấy khó chịu và không chấp nhận được thì sao bạn lại chọn MatchRequired=True? Khi dữ liệu nhập là quan trọng cho kết quả cuối cùng thì tôi "bắt" người dùng phải nhập đúng bằng cách cho MatchRequired=True. Lúc đó thì người dùng có 2 lựa chọn: hoặc nhập đúng để đi tiếp hoặc nhấn nút "Hủy" mà tôi cung cấp để hủy quá trình nhập liệu / tính toán.
Tất nhiên tôi cũng có thể giải quyết theo cách khác. Tức MatchRequired=False nhưng trong Exit tôi kiểm tra dữ liệu nhập:
[GPECODE=vb]
If ComboBox1.ListIndex < 0 Then
If MsgBox("Ban chi duoc nhap muc co san trong list ma thoi!" & vbCrLf & _
"Hay chon OK de tro lai nhap du lieu hoac Cancel de huy nhap du lieu", _
vbOKCancel, "Error") = vbOK Then
Cancel = True
Else
' lenh huy nhap du lieu
End If
End If
[/GPECODE]
Bạn thấy là tôi kiểm tra dữ liệu mà không cần "phò phạch phe phẩy" gì cả (ôi cái thời xa xưa ấy ...).
----------------
Mỗi control được thiết kế với chủ ý nào đó. ComboBox dùng để nhập dữ liệu có trong List. Khả năng chọn từ List thay cho gõ "mệt nghỉ" chỉ là phụ mà thôi. Nếu dữ liệu là 1 trong các mục trong List thì dùng ComboBox là chuẩn vì nó được thiết kế cho việc như thế. Còn nếu có thể nhập dữ liệu bất kỳ thì dùng TextBox cho rồi.
Tất nhiên bạn có thể có nhu cầu là chấp nhận dữ liệu bất kỳ nhưng bạn vẫn có List sẵn để nếu người dùng muốn nhập cái có trong List thì tiết kiệm được thời gian công sức. Nhưng dù bạn dùng control nào thì cũng phải chấp nhận cách thức mà nó thao tác. Tương tự nếu bạn thiết lập thuộc tính nào thì cũng phải chấp nhận "hậu quả" của thiết lập đó. Không thể chọn công cụ A rồi phàn nàn là nó cứ thao tác như đã được thiết kế.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy cụ thể là thế nào? Cái ComboBox mà ta xét có MatchRequired=True hay không? Triết lý của MatchRequired=True là cho tới tận khi ta không nhập dữ liệu khớp với 1 mục trong List thì ta sẽ nhận được thông báo "khó chịu" và không thoát được ComboBox. Bạn phàn nàn là thông báo "khó chịu" nhưng nhiệm vụ của MatchRequired=True là thế. Bạn thấy khó chịu và không chấp nhận được thì sao bạn lại chọn MatchRequired=True? Khi dữ liệu nhập là quan trọng cho kết quả cuối cùng thì tôi "bắt" người dùng phải nhập đúng bằng cách cho MatchRequired=True. Lúc đó thì người dùng có 2 lựa chọn: hoặc nhập đúng để đi tiếp hoặc nhấn nút "Hủy" mà tôi cung cấp để hủy quá trình nhập liệu / tính toán.
Tất nhiên tôi cũng có thể giải quyết theo cách khác. Tức MatchRequired=False nhưng trong Exit tôi kiểm tra dữ liệu nhập:
[GPECODE=vb]
If ComboBox1.ListIndex < 0 Then
If MsgBox("Ban chi duoc nhap muc co san trong list ma thoi!" & vbCrLf & _
"Hay chon OK de tro lai nhap du lieu hoac Cancel de huy nhap du lieu", _
vbOKCancel, "Error") = vbOK Then
Cancel = True
Else
' lenh huy nhap du lieu
End If
End If
[/GPECODE]
Bạn thấy là tôi kiểm tra dữ liệu mà không cần "phò phạch" gì cả.
----------------
Mỗi control được thiết kế với chủ ý nào đó. ComboBox dùng để nhập dữ liệu có trong List. Khả năng chọn từ List thay cho gõ "mệt nghỉ" chỉ là phụ mà thôi. Nếu dữ liệu là 1 trong các mục trong List thì dùng ComboBox là chuẩn vì nó được thiết kế cho việc như thế. Còn nếu có thể nhập dữ liệu bất kỳ thì dùng TextBox cho rồi.
Tất nhiên bạn có thể có nhu cầu là chấp nhận dữ liệu bất kỳ nhưng bạn vẫn có List sẵn để nếu người dùng muốn nhập cái có trong List thì tiết kiệm được thời gian công sức. Nhưng dù bạn dùng control nào thì cũng phải chấp nhận cách thức mà nó thao tác. Tương tự nếu bạn thiết lập thuộc tính nào thì cũng phải chấp nhận "hậu quả" của thiết lập đó. Không thể chọn công cụ A rồi phàn nàn là nó cứ thao tác như đã được thiết kế.

Thật ra em nói khó chịu ở đây với thuộc tính đó là như vầy: Nếu mình không nhập gì trong ComboBox đó nó cũng báo lỗi. Thứ 2 là mình muốn Việt hóa cái MsgBox của nó chứ tất cả các thông báo bằng tiếng Việt, tự nhiên nó "chọt" vô một câu tiếng Anh lạ hoắc, thà là làm chương trình toàn tiếng Anh thì không nói làm gì!

Đương nhiên là có những ComboBox mình nhập thoải mái những gì cần nhập, và có những cái mình chỉ muốn nhập vào cái danh sách sẳn có thôi.

Về đáp án:

Phải công nhận, Thầy làm rất đúng với đáp án của em! Quá xuất sắc! Đúng là bậc Thầy của những Thầy!


Từ câu đố này, em muốn mọi người thấy nó rất là dễ mà đôi khi mình nghĩ sao cao siêu quá! Và rằng bẫy lỗi cũng có những lỗi nhìn thấy trước ví dụ như phép chia không được chia cho 0. Nhưng có những lỗi ta lợi dụng lỗi để bẫy lỗi như bài này. Nói lỗi là như vầy, khi ta chọn thuộc tính MatchEntry = MatchEntryComplete thì khi ta gõ bất cứ thứ gì nó theo sự kiện Change mà dò tìm ListIndex, nếu nó không tìm thấy gì thì trả về lỗi không tìm thấy (lúc này ListIndex = -1) vì thế, ta lợi dụng điểm này để bẫy lỗi là như vậy!

Nhưng phải chú ý sẽ báo lỗi hoàn toàn sai khi ta gõ vào cho dù ta gõ từng chữ một đúng với nội dung của từng mục thì nó vẫn báo lỗi nếu ta chọn MatchEntry = MatchEntryNone, chỉ khi nó được chọn trực tiếp trên List xổ ra mới không bị lỗi mà thôi.

Cám ơn Thầy đã tham gia!
 
Lần chỉnh sửa cuối:
Upvote 0
Mỗi control được thiết kế với chủ ý nào đó. ComboBox dùng để nhập dữ liệu có trong List. Khả năng chọn từ List thay cho gõ "mệt nghỉ" chỉ là phụ mà thôi. Nếu dữ liệu là 1 trong các mục trong List thì dùng ComboBox là chuẩn vì nó được thiết kế cho việc như thế. Còn nếu có thể nhập dữ liệu bất kỳ thì dùng TextBox cho rồi.
Tất nhiên bạn có thể có nhu cầu là chấp nhận dữ liệu bất kỳ nhưng bạn vẫn có List sẵn để nếu người dùng muốn nhập cái có trong List thì tiết kiệm được thời gian công sức. Nhưng dù bạn dùng control nào thì cũng phải chấp nhận cách thức mà nó thao tác. Tương tự nếu bạn thiết lập thuộc tính nào thì cũng phải chấp nhận "hậu quả" của thiết lập đó. Không thể chọn công cụ A rồi phàn nàn là nó cứ thao tác như đã được thiết kế.

Cũng nói rõ là cái ComboBox vì em thích dùng nó như kiểu MatchRequired=True này, nhưng lại không thích kiểu báo lỗi của nó nên em đã chọn MatchRequired=False và nó thực hiện giống tính chất của MatchRequired=True.

Bạn thấy là tôi kiểm tra dữ liệu mà không cần "phò phạch phe phẩy" gì cả (ôi cái thời xa xưa ấy ...).

Bởi thế, em mới "mào" cái For ... Next ban đầu vào để đánh lạc hướng người giải đố để "nhức đầu" một tí mà! hheheheheh.

Nhưng phải chú ý sẽ báo lỗi hoàn toàn sai khi ta gõ vào cho dù ta gõ từng chữ một đúng với nội dung của từng mục thì nó vẫn báo lỗi nếu ta chọn MatchEntry = MatchEntryNone, chỉ khi nó được chọn trực tiếp trên List xổ ra mới không bị lỗi mà thôi.


Kể cả ComboBox khi ta chọn thuộc tính MatchRequired=True thì nó cũng gặp như trường hợp này!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom