Đóng form (close) và chuyển focus sang textbox bằng lệnh gì? (1 người xem)

Liên hệ QC

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

manhhung12

Thành viên thường trực
Tham gia
20/3/08
Bài viết
232
Được thích
88
Các bạn cho hỏi trong VBA đẻ đóng form tự tạo ta dùng lênh nào vậy?
Nếu muốn chuyển focus từ textbox này sang textbox khác sau khi nhấn enter thì làm sao?
 
Để đóng Form tự tạo thì có thể dùng lệnh: End hoặc Unload Me Còn để sau khi nhấn Enter thì sẽ chuyển qua textbox khác thì bạn thêm code sau vào trong Form đó.
Mã:
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = 13 Then TextBox1.SetFocus End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nghiên cứu 2 dòng code này nhé (cùng file kèm theo):

PHP:
Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub txtVao_AfterUpdate()
    Me.txtRa.SetFocus
End Sub
 

File đính kèm

Upvote 0
Tôi gửi file kèm theo bạn xem dùm sao code kg chạy?
 

File đính kèm

Upvote 0
Bạn phải nó rõ code nào không chạy và bạn dang làm đoạn nào chứ trình của bạn còn dở dang và chưa sử lý hết các lỗi bất thường khác, ví dụ chọn dòng trống tạo ra sheet1 trắng.
Mình thấy bạn bỏ công ra làm như vậy nên mô phỏng theo 1 database object thì ngon hơn, file của bạn nếu quản lý công nhân viên trên giới hạn số Sheet thì bạn chấm công làm sao, số sheet lớn sẽ quản trị rất khó khăn.
Mình nêu thử 1 mô hình bạn tham khảo nhé:
Các sheet trong file
-Info (Các thông tin về đơn vị, các biến dùng chung khác: ca , loại thưởng loại phạtvv )
-HSNV (mã và hồ sơ nhân viên liên quan)
-DATA (mã , ngay , ca , thuong, phat, ghichu)
-Sheet hoặc Form chấm mới, sửa vv...
-Các sheets khai thác báo cáo, thống kê
Như vậy sẽ gọn hơn và có thể dùng chung cả năm không cần mỗi tháng thêm sheet
 
Upvote 0
Bạn phải nó rõ code nào không chạy và bạn dang làm đoạn nào chứ trình của bạn còn dở dang và chưa sử lý hết các lỗi bất thường khác, ví dụ chọn dòng trống tạo ra sheet1 trắng.
Mình thấy bạn bỏ công ra làm như vậy nên mô phỏng theo 1 database object thì ngon hơn, file của bạn nếu quản lý công nhân viên trên giới hạn số Sheet thì bạn chấm công làm sao, số sheet lớn sẽ quản trị rất khó khăn.
Mình nêu thử 1 mô hình bạn tham khảo nhé:
Các sheet trong file
-Info (Các thông tin về đơn vị, các biến dùng chung khác: ca , loại thưởng loại phạtvv )
-HSNV (mã và hồ sơ nhân viên liên quan)
-DATA (mã , ngay , ca , thuong, phat, ghichu)
-Sheet hoặc Form chấm mới, sửa vv...
-Các sheets khai thác báo cáo, thống kê
Như vậy sẽ gọn hơn và có thể dùng chung cả năm không cần mỗi tháng thêm sheet
Bây giờ mình đang cho cái code trong form chạy. nhưng sao kg kiểm tra (kg chặn lỗi khi nhập liệu được). Ví dụ: giờ trong ngày không thể <0 và >25; ngày trong tháng thì >0 và <= ngày cuối tháng.
Tóm lại kỹ thuật xử lý khi nhập liêu.
Còn cơ sở DL thì cũng kg lớn hơn nữa chỉ là 1 modull nhỏ viết trong excel cho 1 bộ phận nhỏ thôi (phòng/ban: số người ít).
Bạn xem form tôi viết code và thử chạy xem nó kg kiểm tra được nhập liệu sai.
Tạm thời giúp tôi giải quyết cái form bạn nhé.
Theo ý bạn là rất hay. Nhưng tôi đang giải quyết từng vấn đề nhỏ sau này nếu có điều kện tôi sẽ phát triển thành hệ thống.
Mong bạn giúp
 
Upvote 0
Bạn có mấy điểm sai rồi:
1/Bạn chưa đặt date=ngày nào ví dụ Now() chẳng hạn
Day(DateSerial(Year(Now()), Month(Now()) + 1, 0))
2/Muốn nó không nhảy nữa phải thêm cancel=true
(Trường hợp của bạn phải set lai keyascii=0)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có mấy điểm sai rồi:
1/Bạn chưa đặt date=ngày nào ví dụ Now() chẳng hạn
Day(DateSerial(Year(Now()), Month(Now()) + 1, 0))
2/Muốn nó không nhảy nữa phải thêm cancel=true
(Trường hợp của bạn phải set lai keyascii=0)
Không nhảy nữa là sao bạn? set keyascii =0 là sao? vì nếu tôi nhấn enter thì bộ đệm phải trả về code của nó là enter chứ nhỉ?
Bạn hướng dẫn chi tiết thêm.
 
Upvote 0
Để đóng Form tự tạo thì có thể dùng lệnh:
End
hoặc
Unload Me
Còn để sau khi nhấn Enter thì sẽ chuyển qua textbox khác thì bạn thêm code sau vào trong Form đó.
Mã:
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 13 Then TextBox1.SetFocus
End Sub
không được đâu bạn. Tôi đã thử rồi.
keyascii kg trả về khi ta nhân enter (=13).

Các bạn kg có ai giúp tôi phần code tong form với. Tôi mong các bạn giúp đỡ.
Cảm ơn nhiều.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
manhhung12 thân, ngày nghỉ không lên mạng đwợc sáng nay mới trả lời bạn đwợc:
1/ Thực sự mình không nhớ nổi hình như phải set chế độ previewkey hay gì đó thì VBA mới nhận được mã của phím nhấn đối với các phím di chuyển, xóa vv…còn nếu không khi nhấn phím sẽ không nhận được mã keyAscii của phím mà Application sẽ thực hiện ngay tác động dịch chuyển hoặc xoa. Do vậy, không giống như trong VB nhấn phím Enter không nhận được mã KeyAscii là 13 mà VBA thực hiện di chuyển sang Control khác. Trong khi chưa xác định được mã lệnh này thì ta hoàn toàn có thể sử lý được theo ý bạn:
*Vấn đề kiểm tra: bạn nên đặt vào Event Exit là hợp lý nhất nếu đúng thì cho chuyển còn sai thì Reset ô bằng trống và cancel Event là xong, tức là không chuyển nữa. Còn cách của bạn thì đặt vào Event KeyUp và lấy mã KeyCode.

Private Sub NDate_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If NDate.Value <= 0 Or NDate > Val(Day(DateSerial(Year(Date), Month(Date) + 1, 0))) Then
NDate = ""
Cancel = True
Else
NTime1.SetFocus
End If
End Sub
L ưu ý: B ạn ph ải th êm h àm Val( Day(DateSerial(Year(Date), Month(Date) + 1, 0)))

*Vấn đề dịch chuyển thì không cần mã nhấn Enter thì VBA đã di chuyển. Trình tự dịch chuyển căn cứ 2 thuộc tính của mỗi điều khiển:
-TabStop: Yes-No (Có dịch đến Control này hay không )
-TabIndex: Số thứ tự di chuyển

2/ Mình giới thiệu 1 dạng Control có tính trực quan hơn, nhập ngày tháng giờ phút dễ dàng và không bị sai sót.
Bạn chọn bổ xung điều khiển Microsoft date and time picker control 6.0
Mình giới thiệu sơ bộ theo file mẫu, bạn tìm hiểu thêm c ách s ử d ụng
 

File đính kèm

Upvote 0
Bây giờ mình đang cho cái code trong form chạy. nhưng sao kg kiểm tra (kg chặn lỗi khi nhập liệu được). Ví dụ: giờ trong ngày không thể <0 và >25; ngày trong tháng thì >0 và <= ngày cuối tháng.
Tóm lại kỹ thuật xử lý khi nhập liêu.
Còn cơ sở DL thì cũng kg lớn hơn nữa chỉ là 1 modull nhỏ viết trong excel cho 1 bộ phận nhỏ thôi (phòng/ban: số người ít).
Bạn xem form tôi viết code và thử chạy xem nó kg kiểm tra được nhập liệu sai.
Tạm thời giúp tôi giải quyết cái form bạn nhé.
Theo ý bạn là rất hay. Nhưng tôi đang giải quyết từng vấn đề nhỏ sau này nếu có điều kện tôi sẽ phát triển thành hệ thống.
Mong bạn giúp

Bạn nói rõ ý này ngay từ đầu thì ai cũng hiểu. Tự dưng bạn nói tại sao code không chạy? chẳng ai hiểu cả!

Thứ nhất, Bạn nên set Index cho các textbox theo thứ tự nhập liệu, sau đó khi nhập liệu nếu muốn qua textbox khác chỉ cần ấn phím Tab, chẳng cần viết code kiết gì cả (Theo mình Enter với Tab cũng chỉ là 1 phím như nhau trong trường hợp này).

Thứ hai, muốn kiểm tra điều kiện nhập liệu tại một ô nào đó, ta dùng sự kiện afterupdate hoặc LostFocus thì hay hơn.
 
Upvote 0
manhhung12 thân, ngày nghỉ không lên mạng đwợc sáng nay mới trả lời bạn đwợc:
1/ Thực sự mình không nhớ nổi hình như phải set chế độ previewkey hay gì đó thì VBA mới nhận được mã của phím nhấn đối với các phím di chuyển, xóa vv…còn nếu không khi nhấn phím sẽ không nhận được mã keyAscii của phím mà Application sẽ thực hiện ngay tác động dịch chuyển hoặc xoa. Do vậy, không giống như trong VB nhấn phím Enter không nhận được mã KeyAscii là 13 mà VBA thực hiện di chuyển sang Control khác. Trong khi chưa xác định được mã lệnh này thì ta hoàn toàn có thể sử lý được theo ý bạn:
*Vấn đề kiểm tra: bạn nên đặt vào Event Exit là hợp lý nhất nếu đúng thì cho chuyển còn sai thì Reset ô bằng trống và cancel Event là xong, tức là không chuyển nữa. Còn cách của bạn thì đặt vào Event KeyUp và lấy mã KeyCode.

Private Sub NDate_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If NDate.Value <= 0 Or NDate > Val(Day(DateSerial(Year(Date), Month(Date) + 1, 0))) Then
NDate = ""
Cancel = True
Else
NTime1.SetFocus
End If
End Sub
Có lẽ mình phải xử lý form theo cách này.

*Vấn đề dịch chuyển thì không cần mã nhấn Enter thì VBA đã di chuyển. Trình tự dịch chuyển căn cứ 2 thuộc tính của mỗi điều khiển:
-TabStop: Yes-No (Có dịch đến Control này hay không )
-TabIndex: Số thứ tự di chuyển
Quả thực trong VBA mình kg biết nhiều. Mình chỉ thấy thích vì nó ứng dụng trong Excel (cho mọi người) và nhanh ra kết quả. Mình cũng thấy nó không linh hoạt, nếu ta cứ set 2 thuộc tính Tabstop/TabIndex như vậy nhưng trong quá trình sửa form nếu ta có sửa chữa hay thêm điều khiển thì lại đi sửa TabIndex...
2/ Mình giới thiệu 1 dạng Control có tính trực quan hơn, nhập ngày tháng giờ phút dễ dàng và không bị sai sót.
Bạn chọn bổ xung điều khiển Microsoft date and time picker control 6.0
Mình giới thiệu sơ bộ theo file mẫu, bạn tìm hiểu thêm c ách s ử d ụng
Đây là 1 điều khiển mình đã gặp trong VB nhưng sao mấy hôm rồi mình tìm trên phần tham chiếu kg thấy nó? Vả lại mình cứ nghi trong đầu cái cách chặn (bẫy) dư liệu nhập bằng keyascii (enter=13) nên cứ loay hoay vơi nó mãi. (bảo thủ quá)
Tks very much

Bạn nói rõ ý này ngay từ đầu thì ai cũng hiểu. Tự dưng bạn nói tại sao code không chạy? chẳng ai hiểu cả!

Thứ nhất, Bạn nên set Index cho các textbox theo thứ tự nhập liệu, sau đó khi nhập liệu nếu muốn qua textbox khác chỉ cần ấn phím Tab, chẳng cần viết code kiết gì cả (Theo mình Enter với Tab cũng chỉ là 1 phím như nhau trong trường hợp này).

Thứ hai, muốn kiểm tra điều kiện nhập liệu tại một ô nào đó, ta dùng sự kiện afterupdate hoặc LostFocus thì hay hơn.
Mình có đưa file kèm theo trong bài và nói code trong form kg chạy rồi đáy chứ. Có thể mình diễn đạt kg rõ, tức là code trong Fr đẻ chặn lỗi trong nhập liệu (trên Fr) kg đúng nên nó kg có tác dụng. Nghĩa là:
HTML:
private sub Ndate_LostFocus()
'Code.....
end sub
phải không bạn??
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
manhhung12 à, Microsoft date and time picker control 6.0 là thư viện của VB nếu máy của bạn có cài VB thì chắc chắn có. Nếu không bạn chép thư viện đó vào System32 là dùng được. Tại máy tôi đang kết nối cũng không có, nếu cần tôi gửỉ bạn sau.
 
Upvote 0
manhhung12 à, Microsoft date and time picker control 6.0 là thư viện của VB nếu máy của bạn có cài VB thì chắc chắn có. Nếu không bạn chép thư viện đó vào System32 là dùng được. Tại máy tôi đang kết nối cũng không có, nếu cần tôi gửỉ bạn sau.
Tôi chưa cài VB nên nếu có bạn gửi cho tôi nhé.
Nhân đay moi người cho tôi hỏi:

1/ Khi load form lên thì nút nhấn "Thoát" bị đơ (không chọn đươc). Nghĩa là không làm việc mà thoát khỏi Form ngay bằng cách nhấn nút "Thoát".
2/Khi nhấn nút "Chấp nhận" thì sẽ có massage thông báo có làm nũa không.
Nếu tiếp tục thì bấm Yes -> con trỏ sẽ nhẩy về Textbox "Ndate" (Ndate.SetFocus); ngược lai: bấm "No" thì nút nhấn "Thoát" được chọn. Tuy nhiên trường hợp này nút nhấn "Thoát" không được chon mà con trỏ vẫn nhẩy về Textbox "Ndate".
3/Khi trong sheet
-lần cập nhật thứ nhất tôi đã merg ở dòng thư 10 từ ô 4 đến ô 8
-lần cập nhật thứ 2 tôi (người sử dụng) do kg biết nên lai merge ở dòng thư 10 từ ô 3 đến ô 5 -> excel báo lỗi
Vậy thì có cách nào để biết các ô đang chọn đã được merge/ hoặc vẫn cho merge nhưng không báo lỗi. (không cần quan tâm trước đó đã merge)
Mong các bạn giải đáp và hướng dẫn. (tôi gửi kèm theo file)
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Form của bạn có 2 vấn đề:
-Do bạn khóa quá chặt, nếu các ô ngày giờ mà không có nội dung gi hợp lệ thì không thể rời Focus đwợc muốn thoát thì phải điền tạm ngày giờ vào mới nhấn thoát được.
-Bạn chon No không sang nút thoát vì bạn viết sai cú pháp:
kt = MsgBox("Co cap nhat nua khong?", vbYesNo, "Thong Bao")
If kt = vbYes Then
NDate.SetFocus
Else
CommandButton2.SetFocus
End If

*Mình tham gia trong sheets đừng Megr sau này sử lý rất khó khăn nhất là sử dụng VBA. Muốn dữ liệu nằm giữa 2 ô trông như megr thì chọn 2 ô -->Format-->Cell-->Alignment-->Trong Horizontal chọn Center Across selection. Còn muốn Megr thì phải UnMeger sau đó lại Merger lại hoặc bạn kiểm tra trước khi Megr như sau (Ví dụ):

With Range("C10:C13")
if .Megercells= false then
.Meger
else
.UnMeger
.Meger
end if
end with
 
Lần chỉnh sửa cuối:
Upvote 0
Seltart sử dụng như thế nào?

Ồ hay quá. Cảm ơn bạn nhiều. Để mình sửa lại.
Form của bạn có 2 vấn đề:
-Do bạn khóa quá chặt, nếu các ô ngày giờ mà không có nội dung gi hợp lệ thì không thể rời Focus đwợc muốn thoát thì phải điền tạm ngày giờ vào mới nhấn thoát được.
Mình có khởi tạo giá trị cho biến ngay khi Form active mà nó không có gì cả -> Text_box vẫn trắng khi form load
Có cách nào đẻ kiểm tra ô trứoc của ô hiện hành (ô chọn) có màu/pattern là gì để tô màu/pattern khác cho ô hiện hành (ô chọn) không các bạn

Các bạn cho hỏi:
Khi load form trên textbox đầu tiên có giá trị defaul. làm sao giá trị đó được bôi đen như trên hình.1 chứ không như trên hình.2 .
Ok. Tôi sửa được rồi.
HTML:
Me.textbox.selstart=0
Me.textbox.sellength=Me.textbox.Textlength
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom