PDA

View Full Version : Hiển thị ngày hiện tại trong textbox trên form



dqt_nt
06-05-09, 02:43 PM
Nhờ sự giúp đỡ của anh/chị, tôi đã tạo được 1 cái form nho nhỏ phục vụ cho công việc. Tuy nhiên có 1 vướng muốn anh/chị giúp sức:
- Tôi muốn trong cái combobox ngày nghỉ hiển thị ngày hiện tại của hệ thống (giống hàm = now()) theo định dạng dd/mm/yy (như hình vẽ)

http://i464.photobucket.com/albums/rr2/dqt_nt/untitled-1.jpg

- Nếu như textbox thì có làm được vậy không?

Mong anh/chị giúp!
Cảm ơn tất cả.

Hai Lúa Miền Tây
06-05-09, 02:53 PM
Nhờ sự giúp đỡ của anh/chị, tôi đã tạo được 1 cái form nho nhỏ phục vụ cho công việc. Tuy nhiên có 1 vướng muốn anh/chị giúp sức:
- Tôi muốn trong cái combobox ngày nghỉ hiển thị ngày hiện tại của hệ thống (giống hàm = now()) theo định dạng dd/mm/yy (như hình vẽ)

http://i464.photobucket.com/albums/rr2/dqt_nt/untitled-1.jpg

- Nếu như textbox thì có làm được vậy không?

Mong anh/chị giúp!
Cảm ơn tất cả.
Bạn chỉ cần thêm code sau:

Private Sub UserForm_Initialize()
Me.coNgaynghi = Format(Now, "dd/mm/yyyy")

End Sub
Thân

dqt_nt
06-05-09, 03:02 PM
Bạn chỉ cần thêm code sau:

Private Sub UserForm_Initialize()
Me.coNgaynghi = Format(Now, "dd/mm/yyyy")

End Sub
Thân
Thank bạn! Giờ mình muốn mở file là hiện form luôn thì "mần" thế nào???
Đã thay được cái combobox bằng textbox rồi... hehe

XuanThanh
06-05-09, 03:23 PM
Thêm vào sự kiện ThisWorkbook_Open câu lệnh : FormA.Show
FormA là tên form cần mở
Thân

Hai Lúa Miền Tây
06-05-09, 03:31 PM
Thêm vào sự kiện ThisWorkbook_Open câu lệnh : FormA.Show
FormA là tên form cần mở
Thân
Phải là như thế này chứ bạn:

Private Sub Workbook_Open()
frmNhaplieu.Show
End Sub

Thân

dqt_nt
06-05-09, 03:46 PM
Có 1 rắc rối nhỏ bạn ạ!!! Đó là khi đã nhập xong 1 người, bấm nút "THÊM" lần nữa thì ngày hiện tại lại mất. Giúp mình cách khắc phục với!!!

XuanThanh
06-05-09, 03:54 PM
Có 1 rắc rối nhỏ bạn ạ!!! Đó là khi đã nhập xong 1 người, bấm nút "THÊM" lần nữa thì ngày hiện tại lại mất. Giúp mình cách khắc phục với!!!
Thì chèn thêm câu lệnh trên vào nút "THÊM" là OK thôi

Hai Lúa Miền Tây
06-05-09, 04:00 PM
Có 1 rắc rối nhỏ bạn ạ!!! Đó là khi đã nhập xong 1 người, bấm nút "THÊM" lần nữa thì ngày hiện tại lại mất. Giúp mình cách khắc phục với!!!
Nếu bạn muốn giữ lại combo ngày nghỉ bạn vào code delete dòng code tô đỏ và thêm dòng màu xanh như sau là OK.

Private Sub cmdAdd_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("DATA")
iRow = ws.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
If Trim(Me.txtname.Value) = "" Then
Me.txtname.SetFocus
MsgBox "Nhap day du Ho Va Ten, luu y: Phai viet hoa ky tu dau tien", vbCritical + vbOKOnly, "Loi!!!"
Exit Sub
End If
ws.Cells(iRow, 2).Value = Me.txtname.Value
ws.Cells(iRow, 3).Value = Me.coDonVi.Value
ws.Cells(iRow, 5).Value = Me.coNgaynghi.Value
ws.Cells(iRow, 6).Value = Me.txtSogionghi.Value
Me.txtname.Value = ""
Me.coDonVi.Value = ""
'Me.coNgaynghi.Value = ""
Me.coNgaynghi = Format(Now, "dd/mm/yyyy")

Me.txtSogionghi.Value = ""
Me.txtname.SetFocus
ResetColors
End Sub

ndu96081631
06-05-09, 06:52 PM
Tôi đang thắc mắc:
- Cái ComboBox ấy lúc nào cũng hiện thị ngày giờ = NOW() ---> Vậy có phải ta dùng ComboBox là phí không? Sao không là TextBox
- Thêm nữa: Lúc nào cũng là NOW thì theo tôi chẳng cần ComboBox hay TextBox gì cả ---> Muốn điền NOW vào đâu trong bảng tính thì cư viết code điền trực tiếp vào
Các bạn thấy sao?

dqt_nt
06-05-09, 07:42 PM
Tôi đang thắc mắc:
- Cái ComboBox ấy lúc nào cũng hiện thị ngày giờ = NOW() ---> Vậy có phải ta dùng ComboBox là phí không? Sao không là TextBox
- Thêm nữa: Lúc nào cũng là NOW thì theo tôi chẳng cần ComboBox hay TextBox gì cả ---> Muốn điền NOW vào đâu trong bảng tính thì cư viết code điền trực tiếp vào
Các bạn thấy sao?
Không biết ý anh NDU thế nào, nhưng yêu cầu của em là thế này:
- Thực ra em cũng định dùng textbox, nhưng do trình độ VBA còn kém nên nghĩ rằng chỉ có combobox mới có row source và có thể làm được điều em cần. Giờ thì em biết rằng nó chẳng liên quan gì đến row source, nên hiện tại file của em dùng textbox.
- Với yêu cầu của file này, thì không phải lúc nào cũng NOW. NOW chỉ là hay dùng thôi. File này để nhập những CB-CNV xin ra khỏi công ty trong giờ làm việc (theo dõi nhân công). Vì vậy không phải lúc nào cũng nhập vào đúng cái ngày xin nghĩ, mà có thể nhập sau.
PS: Văn chương em kém quá, không biết diễn giải đại ý như vậy anh NDU hiểu không nữa :-=.
Cảm ơn anh chị đã nhiệt tình giúp đỡ. Thắc mắc gì lại phiền anh chị vậy.

sealand
06-05-09, 09:00 PM
Bạn thử như file này xem có giúp gì không

dqt_nt
07-05-09, 07:40 AM
Em đã hoàn thành xong file của mình. Nói chung là gần hoàn thiện. Bây giờ em muốn thế này:

- Tại sheet REPORT sau khi chọn tháng thì dữ liệu tự động SORT theo thứ tự ưu tiên: Cột E, D, C (hình dưới). Không biết là có code nào có thể làm được điều đó không???

http://i464.photobucket.com/albums/rr2/dqt_nt/untitled-2.jpg

- Nếu có thể mong anh/chị giúp sức.

ndu96081631
07-05-09, 08:54 AM
Em đã hoàn thành xong file của mình. Nói chung là gần hoàn thiện. Bây giờ em muốn thế này:

- Tại sheet REPORT sau khi chọn tháng thì dữ liệu tự động SORT theo thứ tự ưu tiên: Cột E, D, C (hình dưới). Không biết là có code nào có thể làm được điều đó không???

- Nếu có thể mong anh/chị giúp sức.
cái chuyện Sort này quá đơn giản đi, cứ record macro quá trình sort bằng tay rồi chỉnh lại code là được!
Ở đây chỉ góp ý mấy điểm:
- Bạn đã dùng đến Form rồi sao còn công thức trong file ---> Tôi đề xuất bỏ hết công thức, chuyển toàn bộ thành VBA (thế mới là nhập liệu chứ)
code đây:


Private Sub cmdAdd_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("DATA")
iRow = ws.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
If Trim(Me.txtname.Value) = "" Then
Me.txtname.SetFocus
MsgBox "Nhap day du Ho Va Ten", vbCritical + vbOKOnly, "Loi!!!": Exit Sub
End If
With ws.Cells(iRow, 1)
.Offset(, 0) = .Offset(-1) + 1
.Offset(, 1) = ProperUni(Me.txtname.Value)
.Offset(, 2) = Me.coDonVi.Value
.Offset(, 3) = Range("DONVI").Find(.Offset(, 2)).Offset(, 1)
.Offset(, 4) = Me.txtNgaynghi.Value
.Offset(, 5) = Me.txtSogionghi.Value
.Offset(, 6) = IIf(Hour(.Offset(, 5)) < 11, TimeSerial(16, 45, 0) - .Offset(, 5) - TimeSerial(1, 15, 0), TimeSerial(16, 45, 0) - .Offset(, 5))
.Offset(, 7) = Hour(.Offset(, 6)) + IIf(Minute(.Offset(, 6)) / 60 = 0.5, 0.5, IIf(Minute(.Offset(, 6)) / 60 > 0.5, 1, 0))
End With
Me.txtname.Value = ""
Me.coDonVi.Value = ""
Me.txtNgaynghi = Format(Me.txtNgaynghi, "dd/mm/yyyy")
Me.txtSogionghi = Format(Now, "hh:mm")
Me.txtname.SetFocus
ResetColors
End Sub
Ở đây tôi chỉ làm công việc đơn giản là chuyển toàn bộ công thức của bạn thành code thôi (chứ chưa rút gọn gì cả)
- Bạn đã có hàm ProperUni thì không cần cột phụ (lồng hàm thẳng vào code)
còn nhiều thứ phải cải tiến lắm, chẳng hạn nên nhập ngày tháng bằng Calendar.. vân vân...
Bạn xem file tôi vừa sửa lại sơ bộ (tôi chỉ chỉnh sơ 1 tí mà dung lượng file đã giảm đi mấy lần rồi)

dqt_nt
07-05-09, 09:27 AM
He. Hay thật!!!!
Thì trình độ em còn kém mà, nên vẫn phải thủ công vừa công thức, vừa VBA. Cái gì biết thì VBA, cái nào không thì công thức.
Thật tình thì em vẫn chưa hiểu cái này, hay nói đúng hơn là không biết (VBA của em là số 0 :-=)

Sheet này nên dùng sự kiện Worksheet_Change theo C1 ---> Sẽ AutoFilter dử liệu sheet DATA rồi copy dán vào
Cả cái này cũng thua luôn:

cứ record macro quá trình sort bằng tay rồi chỉnh lại code là được!
Đành nghiên cứu thêm vậy.

Cái QLNS của em đến hơn 11MB, nó mà vào tay anh chắc chỉ còn 1/10 nhỉ???
Thank anh!!!

dqt_nt
07-05-09, 10:31 AM
Hiện em đã ghi được cái macro sort. Tuy nhiên loay hoay mãi vẫn chưa đưa vào được. Chắc có lẽ tạo một cái nút rồi ASSIGN quá :-=!!!

À quên nữa. Thật ra cái ưu tiên sort là theo Phân xưởng rồi đến Tổ, không quan tâm đến ngày. Như thế mới dễ kiểm tra.

ndu96081631
07-05-09, 10:31 AM
He. Hay thật!!!!
Thì trình độ em còn kém mà, nên vẫn phải thủ công vừa công thức, vừa VBA. Cái gì biết thì VBA, cái nào không thì công thức.
Thật tình thì em vẫn chưa hiểu cái này, hay nói đúng hơn là không biết (VBA của em là số 0 :-=)

Cả cái này cũng thua luôn:

Đành nghiên cứu thêm vậy.

Cái QLNS của em đến hơn 11MB, nó mà vào tay anh chắc chỉ còn 1/10 nhỉ???
Thank anh!!!
Tôi nhận thấy rằng:
- Nếu dùng TextBox để nhập NGÀY thì có cái dở: Nó không còn là Date nữa mà là dạng TEXT, rất khó khăn cho việc sắp xếp dử liệu ---> Vì thế tôi đề xuất cách nhập ngày bằng Calendar... khi ấy cái TextBox sẽ được thay = một Label, chỉ có tác dụng hiển thị
- Sheeet Report tôi làm luôn cho bạn bằng phương pháp AutoFilter, và cũng đã sort theo ý bạn rồi đấy ---> Nhẹ nhàng hơn rất nhiều so với công thức
- Cái Color và ResetColor ấy bỏ quách đi cho rồi (chỉ tổ thêm rối)
Bạn xem file vừa chỉnh sửa sơ bộ ---> Có thể vẫn còn phải cải tiến thêm!
---------------
Lưu ý:
- Bên sheet Data, bạn chỉ cần "chạm" vào Label" ngày thì lập tức sẽ có 1 Calendar xuất hiện cho bạn chọn (mặc định nó hiện ngày tháng = NOW)
- Bên sheet REPORT, chỉ cần chọn Validation trong cell C1 là code chạy
- Code vẫn chưa bẩy lổi đầy đủ đâu nha... (ví dụ: sẽ bị lổi nếu bạn không nhập đơn vị) ---> Bạn tự nghiên cứu đi

dqt_nt
07-05-09, 11:01 AM
Tôi nhận thấy rằng:
- Nếu dùng TextBox để nhập NGÀY thì có cái dở: Nó không còn là Date nữa mà là dạng TEXT, rất khó khăn cho việc sắp xếp dử liệu ---> Vì thế tôi đề xuất cách nhập ngày bằng Calendar... khi ấy cái TextBox sẽ được thay = một Label, chỉ có tác dụng hiển thị
- Sheeet Report tôi làm luôn cho bạn bằng phương pháp AutoFilter, và cũng đã sort theo ý bạn rồi đấy ---> Nhẹ nhàng hơn rất nhiều so với công thức
- Cái Color và ResetColor ấy bỏ quách đi cho rồi (chỉ tổ thêm rối)
Bạn xem file vừa chỉnh sửa sơ bộ ---> Có thể vẫn còn phải cải tiến thêm!
---------------
Lưu ý:
- Bên sheet Data, bạn chỉ cần "chạm" vào Label" ngày thì lập tức sẽ có 1 Calendar xuất hiện cho bạn chọn (mặc định nó hiện ngày tháng = NOW)
- Bên sheet REPORT, chỉ cần chọn Validation trong cell C1 là code chạy
- Code vẫn chưa bẩy lổi đầy đủ đâu nha... (ví dụ: sẽ bị lổi nếu bạn không nhập đơn vị) ---> Bạn tự nghiên cứu đi

Nói thật em không nghĩ cái file "củ chuối" của em ban đầu, được các anh phát triển, mà theo em là quá hoàn thiện như vậy. Đúng là còn 1 vài lỗi nhỏ như anh NDU nói, em sẽ tự nghiên cứu thêm. Cảm ơn mọi người đã giúp đỡ.
Phải công nhận rằng cái excel càng nghiên cứu càng thấy thích.

ndu96081631
07-05-09, 11:12 AM
Nói thật em không nghĩ cái file "củ chuối" của em ban đầu, được các anh phát triển, mà theo em là quá hoàn thiện như vậy. Đúng là còn 1 vài lỗi nhỏ như anh NDU nói, em sẽ tự nghiên cứu thêm. Cảm ơn mọi người đã giúp đỡ.
Phải công nhận rằng cái excel càng nghiên cứu càng thấy thích.
Thật ra làm luôn 1 lần cho bạn cũng không có vấn đề, nhưng như thế thì còn gì là học hỏi!
Tôi gợi ý vài điểm:
- Giả sử bạn đang ở sheet REPORT và bạn save file ---> Đồng nghĩa là lần sau mở file, sheet REPORT sẽ được Active, đông thời UserForm được load lên ---> Vậy làm sao bạn nhìn thấy được dử liệu add vào sheet Data??? Vậy, trong Thisworkbook nên thêm câu lệnh: Sheets("Data").Activate (trước câu lệnh load Form)
- Cách tránh lổi đơn giản nhất (như ví dụ tôi đề cập ở trên) là thêm vào đầu sub Private Sub cmdAdd_Click() 1 câu đơn giản: On Error Resume Next
- Có thể bỏ luôn biến DateVal nếu bạn khéo léo... bằng cách ngay từ đầu khi load Form ta gán giá trị NOW vào Calendar luôn (tại Private Sub UserForm_Initialize() )
- Hãy duyệt lại thật kỹ 1 lần các câu lệnh xem có chổ nào cần bỏ bớt không (chẳng hạn cái TextBox vừa bỏ đi thì code của nó không còn dùng nữa ---> nên bỏ đi)
vân... vân... vô vàn cách!

dqt_nt
07-05-09, 11:42 AM
Thật ra làm luôn 1 lần cho bạn cũng không có vấn đề, nhưng như thế thì còn gì là học hỏi!
Tôi gợi ý vài điểm:
- Giả sử bạn đang ở sheet REPORT và bạn save file ---> Đồng nghĩa là lần sau mở file, sheet REPORT sẽ được Active, đông thời UserForm được load lên ---> Vậy làm sao bạn nhìn thấy được dử liệu add vào sheet Data??? Vậy, trong Thisworkbook nên thêm câu lệnh: Sheets("Data").Activate (trước câu lệnh load Form)
- Cách tránh lổi đơn giản nhất (như ví dụ tôi đề cập ở trên) là thêm vào đầu sub Private Sub cmdAdd_Click() 1 câu đơn giản: On Error Resume Next
- Có thể bỏ luôn biến DateVal nếu bạn khéo léo... bằng cách ngay từ đầu khi load Form ta gán giá trị NOW vào Calendar luôn (tại Private Sub UserForm_Initialize() )
- Hãy duyệt lại thật kỹ 1 lần các câu lệnh xem có chổ nào cần bỏ bớt không (chẳng hạn cái TextBox vừa bỏ đi thì code của nó không còn dùng nữa ---> nên bỏ đi)
vân... vân... vô vàn cách!

Đúng là cách chỉ của anh NDU rất hay, vừa chỉ vừa dạy, và vừa để người hỏi học. Sau khi nghiên cứu cái file của anh, em đã sửa lại cái lọc theo ý em (ý mới nghĩ ra: nghĩa là ưu tiên lọc theo Phân xưởng, đến Tổ và đến Tên, không quan tâm đến ngày) và sửa luôn điều kiện tính tổng giờ nghĩ nữa.
Điều kiện cũ thế này:
Nếu ông nghỉ trước 11h, thì tổng số giờ ông nghĩ sẽ là 16:45 - giờ hiện tại - giờ nghĩ trưa (là 1h15ph)
Nếu ông nghỉ sau 11h, thì tổng giờ ông nghĩ sẽ là 16:45 - giờ hiện tại
Vậy trường hợp ông nghỉ vào lúc 11h thì sao??? Em đã sửa code sau:


.Offset(, 6) = IIf(Hour(.Offset(, 5)) = 11, TimeSerial(16, 45, 0) - .Offset(, 5) - TimeSerial(1, 15, 0), IIf(Hour(.Offset(, 5)) < 11, TimeSerial(16, 45, 0) - .Offset(, 5) - TimeSerial(1, 15, 0), TimeSerial(16, 45, 0) - .Offset(, 5)))


Và sau khi chạy thử nó ...đúng :-= (mừng húm!!!)

Em còn chỉnh lại cái form để cái lịch không che nút thoát.
Nói chung những cái em sửa lại theo ý trên cái "nền" sẵn có của anh, chỉ là kiểu dọn sẵn và lựa đồ ăn thôi, nhưng em vẫn cảm thấy sướng. Với những người đã giỏi như anh thì nó chẳng là gì, nhưng với em thì phải hì hục cả buổi :-=.

Em sẽ tiếp tục làm hoàn chỉnh file theo gợi ý của anh. Giờ thì đi ăn cơm cái đã. Chúc anh và mọi người ngon miệng.

dqt_nt
07-05-09, 02:04 PM
Đi vào sâu sát thì mới phát hiện phát sinh vấn đề mới:
- Hiện tại file này chỉ dùng cho 1 năm, bởi nếu như thống kê tất cả (không giới hạn năm) thì khi lọc ra nó lại lọc theo tháng. Ví dụ: cần lọc tháng 5 --> hiển thị những người nghỉ tháng 5/2009 và tháng 5/2008. Em chỉ muốn lọc tháng của năm hiện tại. (ở file dùng công thức em đã tránh trường hợp này rồi)
- File có một số lỗi: Ví dụ: Chọn Vỏ 1, hay Vỏ 2, hay Phòng TCLĐTL nó không hiển thị ở cột phân xưởng.

Em lại phải phiền các anh rồi!!!

ndu96081631
07-05-09, 02:14 PM
Đi vào sâu sát thì mới phát hiện phát sinh vấn đề mới:
- Hiện tại file này chỉ dùng cho 1 năm, bởi nếu như thống kê tất cả (không giới hạn năm) thì khi lọc ra nó lại lọc theo tháng. Ví dụ: cần lọc tháng 5 --> hiển thị những người nghỉ tháng 5/2009 và tháng 5/2008. Em chỉ muốn lọc tháng của năm hiện tại. (ở file dùng công thức em đã tránh trường hợp này rồi)
- File có một số lỗi: Ví dụ: Chọn Vỏ 1, hay Vỏ 2, hay Phòng TCLĐTL nó không hiển thị ở cột phân xưởng.

Em lại phải phiền các anh rồi!!!
Quá dể luôn!
Bạn thay đoạn:


With Sheet3.Range("A1").CurrentRegion
.Offset(, 4).Resize(, 1).NumberFormat = "m"
.AutoFilter 5, CDbl(Target)thành:


With Sheet3.Range("A1").CurrentRegion
.Offset(, 4).Resize(, 1).NumberFormat = "myyyy"
.AutoFilter 5, Target & Year(Now)Cái vụ Vỏ 1, Vỏ 2 thì thế này!
Thay đoạn:

.Offset(, 3) = Range("DONVI").Find(.Offset(, 2)).Offset(, 1)thành:

.Offset(, 3) = Range("DONVI").Find(.Offset(, 2), LookAt:=xlWhole).Offset(, 1)
Còn lổi gì nữa, chúng ta tiếp tục nhé
Ẹc... Ẹc...