Hỏi về phương thức Set Focus (1 người xem)

Liên hệ QC

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

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,306
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Mình có 1 UserForm nhập liệu. Trên đó có 2 textbox
Textbox1 : Nhập ngày tháng
Textbox2 : Nhập số chứng từ

Mình muốn là khi nhập liệu ngày tháng vào textbox1 xong, bấm enter hay tab thì sẽ kiểm tra xem dữ liệu ngày trên textbox1 có hợp lệ không. Nếu đúng thì sẽ nhảy đến textbox2, nếu sai thì sẽ hiện thông báo và con trỏ vẫn ở tại textbox1 để nhập lại dữ liệu.

Mình đã thử vài sự kiện cho textbox1 như Exit, BeforeApdate, AfterApdate.. kết hợp với Set focus nhưng vẫn không được. Dù dữ liệu đúng hay sai thì khi tab xong, con trỏ vẫn luôn nhảy đến textbox2.

Mong được sự giúp đỡ của các bạn.
Cảm ơn!
 

File đính kèm

Hoang Danh thân, trước hết bạn phải dùng 1 trong 2 cách là:
-Phải set lại key code: KeyCode=0 để xóa bỏ lệnh chuyển trước đó vì bạn enter hay tab là dịch chuyển đối tượng.
-Bạn dùng lệnh cancel event. (Không nhớ chính xác cú pháp nhưng chắc ăn hơn vì trước mình cũng loay hoay mãi mới tìm ra)
Sau đó mới set focus.
 
Lần chỉnh sửa cuối:
Upvote 0
Hoang Danh thân, trước hết bạn phải dùng 1 trong 2 cách là:
-Phải set lại key code: KeyCode=0 hay KeyAscii=0 để xóa bỏ lệnh chuyển trước đó vì bạn enter hay tab là dịch chuyển đối tượng.
-Bạn dùng lệnh cancel event. (Không nhớ chính xác cú pháp nhưng chắc ăn hơn vì mình cũng loay hoay mãi mới tìm ra)
Sau đó mới set focus.

Bác có thể gửi file minh họa lên dùm được không ạ, cách gì cũng được, miễn chạy ok là được.
Cảm ơn Bác trước ạ!
 
Upvote 0
Bạn thử đặt vào keydown như ví dụ xem sao
 

File đính kèm

Upvote 0
Mình có 1 UserForm nhập liệu. Trên đó có 2 textbox
Textbox1 : Nhập ngày tháng
Textbox2 : Nhập số chứng từ

Mình muốn là khi nhập liệu ngày tháng vào textbox1 xong, bấm enter hay tab thì sẽ kiểm tra xem dữ liệu ngày trên textbox1 có hợp lệ không. Nếu đúng thì sẽ nhảy đến textbox2, nếu sai thì sẽ hiện thông báo và con trỏ vẫn ở tại textbox1 để nhập lại dữ liệu.

Mình đã thử vài sự kiện cho textbox1 như Exit, BeforeApdate, AfterApdate.. kết hợp với Set focus nhưng vẫn không được. Dù dữ liệu đúng hay sai thì khi tab xong, con trỏ vẫn luôn nhảy đến textbox2.

Mong được sự giúp đỡ của các bạn.
Cảm ơn!
Đây là code của bạn
Mã:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsDate(TextBox1) Then
TextBox1 = Format(TextBox1, "dd/mm/yyyy")
Else
MsgBox "Ngay thang khong dung!"
[COLOR=Red]TextBox1.SetFocus[/COLOR]
End If
End Sub
Thay dòng TextBox1.SetFocus bằng lệnh Cacel = True
 
Upvote 0
rollover79 đã giải xong phần SetFocus. Nhưng còn đoạn mã này hoangdanh282vn xem lại, tôi thấy không ổn:
Mã:
If IsDate(TextBox1) Then
  TextBox1 = Format(TextBox1, "dd/mm/yyyy")
  .......
Else

nhập 13/1/08 hay 1/13/08 nó đều hiểu là ngày. Điều này rất nguy hiểm khi vô tình nhập sai. Ví dụ nhập ngày 1 tháng 2 năm 2008 nhưng nhập sai 1/22/08 thì nó chuyển thành 22/01/2008 và cho qua luôn.
 
Upvote 0
rollover79 đã giải xong phần SetFocus. Nhưng còn đoạn mã này hoangdanh282vn xem lại, tôi thấy không ổn:
Mã:
If IsDate(TextBox1) Then
  TextBox1 = Format(TextBox1, "dd/mm/yyyy")
  .......
Else

nhập 13/1/08 hay 1/13/08 nó đều hiểu là ngày. Điều này rất nguy hiểm khi vô tình nhập sai. Ví dụ nhập ngày 1 tháng 2 năm 2008 nhưng nhập sai 1/22/08 thì nó chuyển thành 22/01/2008 và cho qua luôn.
Vấn đề này quả thực cũng hơi phức tạp đấy.
Trước đây tôi có viết CT trên VB6/Access Database dù có thiết lập format cho ngày trên Win/Access/Form nhưng khi show trên textbox vẫn bị tình trạng như PhamduyLong nói.
Các bạn nghiên cứu và trao đổi xem nguyên nhân là do đâu?
 
Upvote 0
rollover79 đã giải xong phần SetFocus. Nhưng còn đoạn mã này hoangdanh282vn xem lại, tôi thấy không ổn:
Mã:
If IsDate(TextBox1) Then
  TextBox1 = Format(TextBox1, "dd/mm/yyyy")
  .......
Else

nhập 13/1/08 hay 1/13/08 nó đều hiểu là ngày. Điều này rất nguy hiểm khi vô tình nhập sai. Ví dụ nhập ngày 1 tháng 2 năm 2008 nhưng nhập sai 1/22/08 thì nó chuyển thành 22/01/2008 và cho qua luôn.

Thường thì các tác giả của VBA sẽ dùng 1 hàm để sửa lại ngày :
PHP:
Public Function SuaNgay(NgayBatKy, Optional Loai As String = "") As Date
    Dim WS As Variant, WP As Variant, WDD As Variant, WMM As Variant, WYY As Variant
    Dim KT As String
    WS = NgayBatKy
    If Not IsDate(WS) Then
        SuaNgay = Date
    Else
        If InStr(1, WS, "/") > 0 Then
            KT = "/"
        ElseIf InStr(1, WS, "-") > 0 Then
            KT = "-"
        End If
        WP = InStr(1, WS, KT)
        WDD = Left(WS, WP - 1)
        WS = Mid(WS, WP + 1)
        WP = InStr(1, WS, KT)
        If WP = 0 Then
            WMM = WS
            WYY = Year(Date)
        Else
            WMM = Left(WS, WP - 1)
            WYY = Mid(WS, WP + 1)
        End If
        SuaNgay = DateSerial(WYY, WMM, WDD)
        If Loai = "CN" And Weekday(SuaNgay, vbSunday) = 1 Then _
                MsgBox ("Day la ngay Chu Nhat"), vbInformation, "GPE"
    End If
End Function
Tham số Loai : Nếu cần phân biệt là ngày Chủ Nhật thì sẽ cảnh báo khi ngày chọn là Chủ Nhật.

Bạn có thể nhập ký tự phân cách là / (10/08/2008) hoặc - (10-08-2008)

--=-- : Việc khai báo biến chưa được tối ưu, bạn có thể sửa lại

Khi đó :

PHP:
Private Sub TBCTNgay_AfterUpdate()
    On Error Resume Next
    Me.TBCTNgay.Value = Format(SuaNgay(Me.TBCTNgay.Value, "CN"), "dd/mm/yyyy")
End Sub
Chúc vui
 
Upvote 0
Theo như bạn thì hàm sẽ kiểm tra giá trị ngày tháng, nếu không đúng thì sẽ lấy ngày hệ thống, ngược lại sẽ chuyển đổi.
Nhưng theo ý của Thầy Phamduylong thì nhập 13/01/2008 hay 01/13/2008 đều đúng cả, như vậy câu lệnh : If Not IsDate(WS) Then có còn chính xác không?
 
Upvote 0
Theo như bạn thì hàm sẽ kiểm tra giá trị ngày tháng, nếu không đúng thì sẽ lấy ngày hệ thống, ngược lại sẽ chuyển đổi.
Nhưng theo ý của Thầy Phamduylong thì nhập 13/01/2008 hay 01/13/2008 đều đúng cả, như vậy câu lệnh : If Not IsDate(WS) Then có còn chính xác không?

Khi bạn nhập vào thì nó mới chỉ là ký tự, và chưa là ngày.
Hàm này làm theo định nghĩa : Nhập trước là ngày, nhập sau là tháng
Nếu phát hiện ngày tháng đó không có thì nó sẽ trả về ngày hệ thống.


Nếu nhập : 12/01/2008 thì sẽ là : Ngày 12 tháng 01
Nếu nhập : 01/12/2008 thì sẽ là : Ngày 01 tháng 12
Chứ nếu nhập lung tung thì cũng chịu thôi.

Và khi đã thể hiện lên rồi thì nhất định phải ngày trước tháng sau rồi (theo Format)
Chúc vui
 
Upvote 0
Khi bạn nhập vào thì nó mới chỉ là ký tự, và chưa là ngày.
Hàm này làm theo định nghĩa : Nhập trước là ngày, nhập sau là tháng
Nếu phát hiện ngày tháng đó không có thì nó sẽ trả về ngày hệ thống.


Nếu nhập : 12/01/2008 thì sẽ là : Ngày 12 tháng 01
Nếu nhập : 01/12/2008 thì sẽ là : Ngày 01 tháng 12
Chứ nếu nhập lung tung thì cũng chịu thôi.

Và khi đã thể hiện lên rồi thì nhất định phải ngày trước tháng sau rồi (theo Format)
Chúc vui

Ý em là nếu ta nhập bị sai, như 12/31/2008 chẳng hạn, thì nhập vào vẫn ok, khi đó ngày lại chuyển thành 12/07/2010.
Như vậy là sai rồi, khi đó sử dụng hàm Isdate là thiếu chính xác.
 
Upvote 0
Ý em là nếu ta nhập bị sai, như 12/31/2008 chẳng hạn, thì nhập vào vẫn ok, khi đó ngày lại chuyển thành 12/07/2010.
Như vậy là sai rồi, khi đó sử dụng hàm Isdate là thiếu chính xác.

Thực ra mà nói : Ngày 12/31/2008 chính là ngày 12/07/2010.
Vì vậy việc nhập ở trên không sai về kỹ thuật.
Vì ngày tháng được diễn tả như là một chuỗi số liên tiếp
Cũng như việc nhập 00/02/2008 thì chính là ngày 31/01/2008

Vì vậy ta phải đặt ra việc nhập sai : Như thế nào là nhập sai?? Ví dụ :
Khi nhập 12/31/2008 thì

  1. Ngày cứ sẽ là những ký tự đầu tiên trước dấu phân cách đầu tiên (12)
  2. Tháng là ký tự nằm giữa 2 dấu phân cách (31)
  3. Còn lại là năm (2008)
Sau đó nếu ngày tháng đó được chấp nhận, và không biến đổi (như trường hợp trên) thì lấy, còn không thì lấy ngày hệ thống???
Nếu thế thì thêm mấy cái If là được mà.

Liệu có phải bạn đang diễn giải như thế ??

Chúc vui.
 
Upvote 0
Đúng vậy, ngoài hàm isdate, ta nên thêm hàm Mid, Instr để cắt lấy tháng trong chuỗi ngày tháng, sau đó so sánh với 12, nếu <=12 thì Go, ngược lại thì End.
 
Upvote 0
Đúng vậy, ngoài hàm isdate, ta nên thêm hàm Mid, Instr để cắt lấy tháng trong chuỗi ngày tháng, sau đó so sánh với 12, nếu <=12 thì Go, ngược lại thì End.

Đúng vậy :

PHP:
Public Function SuaNgay(NgayBatKy, Optional Loai As String = "") As Date
    Dim WS  As String, WP As String, WDD As String, WMM As String, WYY As String
    Dim KT As String
    WS = NgayBatKy
    If Not IsDate(WS) Then
        SuaNgay = Date
    Else
        If InStr(1, WS, "/") > 0 Then
            KT = "/"
        ElseIf InStr(1, WS, "-") > 0 Then
            KT = "-"
        End If
        WP = InStr(1, WS, KT)
        WDD = Left(WS, WP - 1)
        WS = Mid(WS, WP + 1)
        WP = InStr(1, WS, KT)
        If WP = 0 Then
            WMM = WS
            WYY = Year(Date)
        Else
            WMM = Left(WS, WP - 1)
            WYY = Mid(WS, WP + 1)
        End If
        If Val(WMM) > 12 Then Exit Function
        If Val(WDD) > 31 Then Exit Function
        SuaNgay = DateSerial(WYY, WMM, WDD)
        If Loai = "CN" And Weekday(SuaNgay, vbSunday) = 1 Then _
                MsgBox ("Day la ngay Chu Nhat"), vbInformation, "GPE"
    End If
End Function
PHP:
Private Sub TextBox1_AfterUpdate()
    On Error Resume Next
    Dim iDate As Date
    iDate = SuaNgay(Me.TextBox1.Value, "CN")
    If iDate > 0 Then
        Me.TextBox1.Value = Format(iDate, "dd/mm/yyyy")
    Else
        Me.TextBox1.Value = ""
    End If
End Sub
Chúc vui.
 
Upvote 0
Lệnh đại ca đã thương thì thương cho trót. Kiểm tra luôn tháng thiếu và đủ/tháng 2 năm nhuận để chặn nhập sai ngày khi nhập dữ liệu luôn.
 
Upvote 0
Lệnh đại ca đã thương thì thương cho trót. Kiểm tra luôn tháng thiếu và đủ/tháng 2 năm nhuận để chặn nhập sai ngày khi nhập dữ liệu luôn.
Có trong Function mà
PHP:
...
NgayBatKy="29/02/2009"
WS = NgayBatKy 
If Not IsDate(WS) Then
Msgbox "Khong co ngay nhu the!"
        SuaNgay = Date
    Else
 
Upvote 0
Có trong Function mà
PHP:
...
NgayBatKy="29/02/2009"
WS = NgayBatKy 
If Not IsDate(WS) Then
Msgbox "Khong co ngay nhu the!"
        SuaNgay = Date
    Else
Tôi cũng chưa test nhưng nếu có thì không cần dòng lệnh:
HTML:
If Val(WDD) > 31 Then Exit Function
và dòng: 
If Val(WMM) > 12 Then Exit Function
còn không thì kiểm tra cả việc nhâp số âm (<0)
 
Upvote 0
Tôi cũng chưa test nhưng nếu có thì không cần dòng lệnh:
HTML:
If Val(WDD) > 31 Then Exit Function
và dòng:
If Val(WMM) > 12 Then Exit Function
còn không thì kiểm tra cả việc nhâp số âm (<0)
Có khi bỏ nó cũng chạy, tôi cũng không test, nhưng hàm IsDate mà true thì chắc ngày hợp lệ.
Tôi có thấy 1 file của ai đó trên GPE, hình như là NVThien1967 mà tách ngày thành 3 textbox: TextDD, TextMM, TextYY. Và khi nhập text box nào kiểm tra ngay TextBox ấy.
Khi ghép lại có thêm 1 hàm IsDate DateSerial(year(TextYY),month(TextMM),day(TextDD)).
Bác thử theo hướng ấy, có khi lại hay.
 
Upvote 0
Có khi bỏ nó cũng chạy, tôi cũng không test, nhưng hàm IsDate mà true thì chắc ngày hợp lệ.
Tôi có thấy 1 file của ai đó trên GPE, hình như là NVThien1967 mà tách ngày thành 3 textbox: TextDD, TextMM, TextYY. Và khi nhập text box nào kiểm tra ngay TextBox ấy.
Khi ghép lại có thêm 1 hàm IsDate DateSerial(year(TextYY),month(TextMM),day(TextDD)).
Bác thử theo hướng ấy, có khi lại hay.

Nếu không có nó thì khi nhập 12/31/2008 nó lại ra 12/07/2010.
Vì vậy hơi phiền.

Nếu có bỏ thì bỏ :

PHP:
If Val(WDD) > 31 Then Exit Function
Chúc vui.
 
Upvote 0
Có khi bỏ nó cũng chạy, tôi cũng không test, nhưng hàm IsDate mà true thì chắc ngày hợp lệ.
Tôi có thấy 1 file của ai đó trên GPE, hình như là NVThien1967 mà tách ngày thành 3 textbox: TextDD, TextMM, TextYY. Và khi nhập text box nào kiểm tra ngay TextBox ấy.
Khi ghép lại có thêm 1 hàm IsDate DateSerial(year(TextYY),month(TextMM),day(TextDD)).
Bác thử theo hướng ấy, có khi lại hay.
Kiểm tra bằng cách này không được Thu Nghi. Vì bất kỳ 3 số nào đưa vào DateSerial cũng cho ra kết quả là ngày. Ví dụ DateSerial(2008, 120, 100) cho kết quả ngày 10/03/2018. Không phải Excel sai vì DateSerial hiểu:
- 120 là 120 tháng=12 năm >2008+12=2018
- 100 ngày là 3 tháng + 10 ngày nên kết quả cuối cùng là 10/03/2018.
Nhưng vẫn có thể dùng DateSerial để kiểm tra ngày nhập sai như 29/2/2007, 31/11/2008, 27/13/2008 bằng cách so sánh ngày, tháng, năm nhập trong TextBox với ngày tháng năm từ kết quả của DateSerial.
Nếu ngày tháng trong TextBox khác với ngày tháng của DateSerial là ngày TextBox không hợp lệ.
Hàm DMY kiểm tra ngày nhập dạng d/m/yy, nếu đúng thì chuyển sang dạng đ/mm/yyyy
Nếu năm yy nhập tắt (nhỏ hợn 100) thì chuyển sang 20yy.
Mã:
Function DMY(txt) As String
Dim dd As Byte, mm As Byte, yy As Integer, vt1 As Byte, vt2 As Byte
vt1 = InStr(1, txt, "/")
vt2 = InStr(vt1 + 1, txt, "/")
dd = Left(txt, vt1 - 1)
mm = Mid(txt, vt1 + 1, vt2 - vt1 - 1)
yy = Mid(txt, vt2 + 1)
If yy < 100 Then yy = 2000 + yy
If dd = Day(DateSerial(yy, mm, dd)) And mm = Month(DateSerial(yy, mm, dd)) Then
  DMY = Format(dd, "00") & "/" & Format(mm, "00") & "/" & yy
Else
  DMY = "???"
End If
End Function
 
Upvote 0
Các bạn cho mình hỏi thêm vần đề di chuyển giữa các textbox :

Mình có 1 form, trên đó có chứa 6 textbox được sắp xếp theo thứ tự từ trên xuống dưới.

Nếu mình dùng phím tab hay enter để di chuyển con trỏ từ trên xuống dưới thì ok. Nhưng khi mình dùng phím mũi tên xuống để di chuyển thì nó đi qua textbox1, textbox2, textbox4, textbox6. 2 textbox 3 và 5 không được chọn. Khi dùng phím lên cũng vậy.

Các bạn chỉ cho mình về lỗi này và thuộc tính nào qui định cho việc di chuyển này.

Mình xin cảm ơn các bạn!
 
Upvote 0
Bạn đặt thứ tự trong thuộc tính (Properties) TabIndex và TabStop=True
 
Upvote 0
Các bạn cho mình hỏi thêm vần đề di chuyển giữa các textbox :

Mình có 1 form, trên đó có chứa 6 textbox được sắp xếp theo thứ tự từ trên xuống dưới.

Nếu mình dùng phím tab hay enter để di chuyển con trỏ từ trên xuống dưới thì ok. Nhưng khi mình dùng phím mũi tên xuống để di chuyển thì nó đi qua textbox1, textbox2, textbox4, textbox6. 2 textbox 3 và 5 không được chọn. Khi dùng phím lên cũng vậy.

Các bạn chỉ cho mình về lỗi này và thuộc tính nào qui định cho việc di chuyển này.

Mình xin cảm ơn các bạn!

Chào Danh,
Em dùng sự kiện KeyDown để di chuyển con trỏ
Mã:
Private Sub txtMaterial_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        [COLOR="Blue"][B]txtVerifier[/B][/COLOR].SetFocus 
    End If
End Sub

Ở trên txtMaterial Textbox hiện tại đang có focus. Còn Textbox txtVerifier là Textbox em muốn dùng phím mủi tên để di chuyển.
Em chú ý cho cái hằng vbKeyReturn, em phải thay đổi theo yêu cầu của em.

Lê Văn Duyệt
 
Upvote 0
Mình có thêm câu hỏi này, nhờ các bạn giải đáp giúp.

Mình có 1 form trong đó có 2 Combobox đã có sẵn danh sách trong list.

Khi mình dùng phím mũi tên lên để di chuyển focus từ ComB2 đến ComB1 thì trước khi con trỏ dời đi, tại ComB2 nó sẽ trả về giá trị đầu tiên có trong list danh sách. Như thế nó đã làm thay đổi giá trị ban đầu của ComB2 mặc dù ta không muốn thế.

Phải dùng thuộc tính hay sự kiện gì để khi di chuyển focus, giá trị của ComB2 vẫn không thay đổi.

Mình xin cám ơn
 
Upvote 0
Khi mình dùng phím mũi tên lên để di chuyển focus từ ComB2 đến ComB1
Tại sao lại dùng phím mũi tên lên để di chuyển từ control này đến control khác?
Thông thường chúng ta nên dùng phím Enter hoặc phím Tab (hoặc shift + Tab: để di chuyển ngược lại) để di chuyển.

Nếu em đã dùng hai phím anh đã đề cập ở trên để di chuyển giữa các control thì sau khi dùng phím mũi tên (lên hoặc xuống) để chọn mục trong combobox em chỉ việc Enter hoặc Tab là xong thôi.
Mã:
Private Sub cbb1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        cbb2.SetFocus
    End If
End Sub

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Tại sao lại dùng phím mũi tên lên để di chuyển từ control này đến control khác?
Thông thường chúng ta nên dùng phím Enter hoặc phím Tab (hoặc shift + Tab: để di chuyển ngược lại) để di chuyển.

Nếu em đã dùng hai phím anh đã đề cập ở trên để di chuyển giữa các control thì sau khi dùng phím mũi tên (lên hoặc xuống) để chọn mục trong combobox em chỉ việc Enter hoặc Tab là xong thôi.
Mã:
Private Sub cbb1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        cbb2.SetFocus
    End If
End Sub

Lê Văn Duyệt

Cám ơn anh Duyệt đã giúp đỡ.

Vì em có 1 form nhập phiếu xuất kho, có hơn 10 Combobox để chọn mã SP và có nhiều Textbox. Phím Tab hay Enter chỉ di chuyển qua lại giữa các Control từ trên xuống dưới, từ trái qua phải hoặc ngược lại. Giả sử các Combo nó đều nằm bên trái từ trên xuống dưới, như vậy thì muốn di chuyển từ Combo thứ 1 đến Combo thứ 5 thì ta phải qua một loạt các Control khác không cần thiết.

Nếu ta đang ở Combo thứ 5, ta phát hiện thấy Combo1 bị sai, ta muốn di chuyển từ ComBo5 đến Combo1 để sửa. Nếu dùng Tab thì quá lâu, dùng chuột thì không thuận tiện, dùng phím mũi tên lên di chuyển ngược lên thì nhanh nhưng nó sẽ làm thay đổi giá trị của Combo5 đến 4.

Ý em muốn là làm sao khi di chuyển như vậy mà các Combo trên không bị thay đổi giá trị.
 
Upvote 0
Nếu ta đang ở Combo thứ 5, ta phát hiện thấy Combo1 bị sai, ta muốn di chuyển từ ComBo5 đến Combo1 để sửa. Nếu dùng Tab thì quá lâu, dùng chuột thì không thuận tiện, dùng phím mũi tên lên di chuyển ngược lên thì nhanh nhưng nó sẽ làm thay đổi giá trị của Combo5 đến 4.

Ý em muốn là làm sao khi di chuyển như vậy mà các Combo trên không bị thay đổi giá trị.

Vậy bạn hãy tạo phím nóng để gọi thủ tục di chuyển đến control đó.

Trước mỗi combobox tạo một label, và gán thuộc tính Accelerator cho mỗi label. Để khi bạn nhấn tổ hợp phím Alt + ký tự Accelerator thì con trỏ sẽ di chuyển đến control theo ý muốn của bạn.
Xin xem tập tin đính kèm.

Vbavn
 

File đính kèm

Upvote 0
Các bạn cho mình hỏi thêm vần đề di chuyển giữa các textbox :

Mình có 1 form, trên đó có chứa 6 textbox được sắp xếp theo thứ tự từ trên xuống dưới.

Nếu mình dùng phím tab hay enter để di chuyển con trỏ từ trên xuống dưới thì ok. Nhưng khi mình dùng phím mũi tên xuống để di chuyển thì nó đi qua textbox1, textbox2, textbox4, textbox6. 2 textbox 3 và 5 không được chọn. Khi dùng phím lên cũng vậy.

Các bạn chỉ cho mình về lỗi này và thuộc tính nào qui định cho việc di chuyển này.

Mình xin cảm ơn các bạn!

Đó là do vị trí đặt textbox của bạn. Các border textbox của bạn đang đè lên nhau, chỉ cần đặt vị trí khác đi là ok.
 
Upvote 0
Cám ơn anh Duyệt đã giúp đỡ.

Vì em có 1 form nhập phiếu xuất kho, có hơn 10 Combobox để chọn mã SP và có nhiều Textbox. Phím Tab hay Enter chỉ di chuyển qua lại giữa các Control từ trên xuống dưới, từ trái qua phải hoặc ngược lại. Giả sử các Combo nó đều nằm bên trái từ trên xuống dưới, như vậy thì muốn di chuyển từ Combo thứ 1 đến Combo thứ 5 thì ta phải qua một loạt các Control khác không cần thiết.

Nếu ta đang ở Combo thứ 5, ta phát hiện thấy Combo1 bị sai, ta muốn di chuyển từ ComBo5 đến Combo1 để sửa. Nếu dùng Tab thì quá lâu, dùng chuột thì không thuận tiện, dùng phím mũi tên lên di chuyển ngược lên thì nhanh nhưng nó sẽ làm thay đổi giá trị của Combo5 đến 4.

Ý em muốn là làm sao khi di chuyển như vậy mà các Combo trên không bị thay đổi giá trị.

Mình dùng đoạn Code sau để giải quyết vấn đề của bạn

Private Sub PAKD2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error Resume Next
Select Case KeyCode
Case 40: PAKD3.SetFocus 'an phim xuong
Case 38: PAKD1.SetFocus 'an phim len
End Select
End Sub


Tuy nhiên khi đó tính năng Drop - Down list của Combobox lại mất tác dụng (Không chọn được danh sách sổ xuống khi ấn F4 hoặc Alt+Downkey)

So sánh giữa 2 cột PAKD và Mặt hàng trong VD kèm theo sẽ thấy rõ. Cột Mặt hàng dùng phím Shift và Ctrl để di chuyển lên xuống.

Vấn đề cần giải quyết là làm sao vẫn dùng phím Lên, xuống để di chuyển giữa các Combobox và định nghĩa phím điều khiển tính năng Drop - Down list của Combobox.
Vì vậy rất mong các cao tủ trợ giúp.
 

File đính kèm

Upvote 0
Bạn sửa 1 chút:

Mã:
Private Sub PAKD1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error Resume Next
If Shift =0 Then
Select Case KeyCode
Case 40: KeyCode = 0: PAKD2.SetFocus 'an phim xuong
Case 38: KeyCode = 0: PAKD5.SetFocus 'an phim len
End Select
End If
End Sub

Muốn di chuyển trên List bằng fím mũi tên phải giữ Shift hay Ctrl
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sửa 1 chút:

Mã:
Private Sub PAKD1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error Resume Next
If Shift =0 Then
Select Case KeyCode
Case 40: KeyCode = 0: PAKD2.SetFocus 'an phim xuong
Case 38: KeyCode = 0: PAKD5.SetFocus 'an phim len
End Select
End If
End Sub

Muốn di chuyển trên List bằng fím mũi tên phải giữ Shift hay Ctrl

Như vậy là đáp ứng được yêu cầu. Rất cảm ơn Bác đã trợ giúp!
 
Upvote 0

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

Back
Top Bottom