hỏi về cách làm form dữ liệu (1 người xem)

Liên hệ QC

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

dangkhoa1227

Thành viên mới
Tham gia
18/9/08
Bài viết
17
Được thích
0
Chào các bậc cao thủ,
Em vửa tạo 1 form dữ liệu như file, ý em là txttienphat và txtcpkhac nếu không nhập vào thì vẫn cộng được vào tổng cp. Nhưng em làm mãi, mà nó vẫn báo lỗi. Các bác giúp em với nhé, em đang tự học nên còn rất gà mờ ...
Em còn tính làm 1 form doanh thu rồi tổng hợp công nợ theo khách hàng, số xe nữa, nếu được các bậc cao thủ hướng dẫn em với nhé.
Em cảm ơn nhiều lắm
 

File đính kèm

Còn cái lỗi đó có thể khắc phục như sau:
Private Sub txttienphat_AfterUpdate()
Dim txttienphat As Single
If Me.txttienphat = "" Then Me.txttienphat.Value = 0
Me.txttienphat = Format(Me.txttienphat, "#,###,###")
End Sub
Tương tự với ô chiphikhac
Để hạn chế nhập ký tự không phải là số vào một ô nào đó có thể dùng sự kiện:
Private Sub txtngay_Change()
If Len(Me.txtngay) < 1 Then Exit Sub
If IsNumeric(Right(Me.txtngay, 1)) = False Then
Me.txtngay = Left(Me.txtngay, Len(Me.txtngay) - 1)
MsgBox "Chi duoc nhap ky tu so vao o ngay"
End If
End Sub
Thay "txtngay" bằng tên textbox muốn hạn chế nhập
 
Upvote 0
Nếu có thể đổi sang 2003 mình xem cho bạn
 
Upvote 0
Sao ô ngày tháng lại để kiểu số
Định dạng 1 ô trong form như thế nào vậy bạn, mình gà mờ quá, bạn thông cảm ^^
Còn cái lỗi đó có thể khắc phục như sau:
Private Sub txttienphat_AfterUpdate()
Dim txttienphat As Single
If Me.txttienphat = "" Then Me.txttienphat.Value = 0
Me.txttienphat = Format(Me.txttienphat, "#,###,###")
End Sub
Tương tự với ô chiphikhac
Để hạn chế nhập ký tự không phải là số vào một ô nào đó có thể dùng sự kiện:
Private Sub txtngay_Change()
If Len(Me.txtngay) < 1 Then Exit Sub
If IsNumeric(Right(Me.txtngay, 1)) = False Then
Me.txtngay = Left(Me.txtngay, Len(Me.txtngay) - 1)
MsgBox "Chi duoc nhap ky tu so vao o ngay"
End If
End Sub
Thay "txtngay" bằng tên textbox muốn hạn chế nhập​
Cảm ơn bạn nhiều lắm, mình đang học hỉ về VBA, có những người đi trước chỉ dẫn là điều rất may mắn của mình ^^
Nếu có thể đổi sang 2003 mình xem cho bạn​
Mình gởi bạn file 2003 nhé. Thanks bạn nhiều
 

File đính kèm

Upvote 0
Còn cái lỗi đó có thể khắc phục như sau:
Private Sub txttienphat_AfterUpdate()
Dim txttienphat As Single
If Me.txttienphat = "" Then Me.txttienphat.Value = 0
Me.txttienphat = Format(Me.txttienphat, "#,###,###")
End Sub
Tương tự với ô chiphikhac
Để hạn chế nhập ký tự không phải là số vào một ô nào đó có thể dùng sự kiện:
Private Sub txtngay_Change()
If Len(Me.txtngay) < 1 Then Exit Sub
If IsNumeric(Right(Me.txtngay, 1)) = False Then
Me.txtngay = Left(Me.txtngay, Len(Me.txtngay) - 1)
MsgBox "Chi duoc nhap ky tu so vao o ngay"
End If
End Sub
Thay "txtngay" bằng tên textbox muốn hạn chế nhập
Bạn Trung.afo ơi, Sao mình thay như bạn nói nó vẫn báo lỗi thế ?? hông biết mình đã làm sai thế nào, mình sửa theo file sau, bạn xem hộ mình nhé, mình cảm ơn nhiều lắm !!
 

File đính kèm

Upvote 0
Bạn làm txtsoluong_AfterUpdate như sau:
Private Sub txtsoluong_AfterUpdate()
Dim txtsoluong As Single
Dim txtdongia As Single
Dim txtthanhtien As Single
Dim txttongcp As Single
If Me.txtdongia = "" Or IsNull(Me.txtdongia) Then Exit Sub
If IsNumeric(Me.txtsoluong) And Me.txtsoluong > 0 Then
Me.txtthanhtien = Me.txtsoluong * Me.txtdongia
Else
a = MsgBox("So luong phai la so va khong duoc nho hon bang 0", vbCritical + vbOKOnly, "Loi nhap lieu")
Exit Sub
End If
If Me.txttienphat = "" Then Me.txttienphat.Value = 0
If Me.txtcpkhac = "" Then Me.txtcpkhac.Value = 0
Me.txtsoluong = Format(CDbl(Me.txtsoluong), "#,###,###")
Me.txtthanhtien = Format(CDbl(Me.txtthanhtien), "#,###,###")
Me.txttongcp = CDbl(Me.txtluong) + CDbl(Me.txtcpkhac) + CDbl(Me.txttienphat) + CDbl(Me.txtthanhtien)
Me.txttongcp = Format(CDbl(Me.txttongcp), "#,###,###")
End Sub
 
Upvote 0
Bạn làm txtsoluong_AfterUpdate như sau:
Private Sub txtsoluong_AfterUpdate()
Dim txtsoluong As Single
Dim txtdongia As Single
Dim txtthanhtien As Single
Dim txttongcp As Single
If Me.txtdongia = "" Or IsNull(Me.txtdongia) Then Exit Sub
If IsNumeric(Me.txtsoluong) And Me.txtsoluong > 0 Then
Me.txtthanhtien = Me.txtsoluong * Me.txtdongia
Else
a = MsgBox("So luong phai la so va khong duoc nho hon bang 0", vbCritical + vbOKOnly, "Loi nhap lieu")
Exit Sub
End If
If Me.txttienphat = "" Then Me.txttienphat.Value = 0
If Me.txtcpkhac = "" Then Me.txtcpkhac.Value = 0
Me.txtsoluong = Format(CDbl(Me.txtsoluong), "#,###,###")
Me.txtthanhtien = Format(CDbl(Me.txtthanhtien), "#,###,###")
Me.txttongcp = CDbl(Me.txtluong) + CDbl(Me.txtcpkhac) + CDbl(Me.txttienphat) + CDbl(Me.txtthanhtien)
Me.txttongcp = Format(CDbl(Me.txttongcp), "#,###,###")
End Sub
Cảm ơn bạn, mình đã làm được phần đó rồi, bạn có thể giúp mình thêm được không, cái phần ngày đó, mình muốn định dạng là ngày, và chỉ được nhập vào theo kiểu dd/mm/yy thôi thì mình phải làm sao vậy bạn. Rồi khi nhập liệu, không hiểu sao cái nút opdi và opve nó không nhập vào cột chuyến trong sheet "Tonghop" nữa. Cảm ơn bạn nhiều lắm
 
Upvote 0
Chưa ổn đâu bạn ơi vì nó vẫn tiềm ẩn cái lỗi trong câu lệnh của bạn. Khi Textbox rỗng hàm CDb(Null) sẽ sinh lỗi. Vậy thì bạn nên thay cái hàm này đi . Mình thử thay cho bạn test nha (Mình đã Rem câu lệnh của bạn màu đỏ và thay bằng câu của mình màu xanh)
Mã:
[CODE]
Private Sub txtsoluong_AfterUpdate()
Dim txtsoluong As Single
Dim txtdongia As Single
Dim txtthanhtien As Single
Dim txttongcp As Single
If Me.txtdongia = "" Or IsNull(Me.txtdongia) Then Exit Sub
If IsNumeric(Me.txtsoluong) And Me.txtsoluong > 0 Then
Me.txtthanhtien = Me.txtsoluong * Me.txtdongia
Else
a = MsgBox("So luong phai la so va khong duoc nho hon bang 0", vbCritical + vbOKOnly, "Loi nhap lieu")
Exit Sub
End If
Me.txtsoluong = Format(CDbl(Me.txtsoluong), "#,###,###")
Me.txtthanhtien = Format(CDbl(Me.txtthanhtien), "#,###,###")
[COLOR=#ff0000]'Me.txttongcp = CDbl(Me.txtluong) + CDbl(Me.txtcpkhac) + CDbl(Me.txttienphat) + CDbl(Me.txtthanhtien)[/COLOR]
[B][COLOR=#0000cd]Me.txttongcp = Val(Format(Me.txtluong, "0")) + Val(Format(Me.txtcpkhac, "0")) + Val(Format(Me.txttienphat, "0")) + Val(Format(Me.txtthanhtien, "0"))[/COLOR][/B]
Me.txttongcp = Format(Me.txttongcp, "#,###,###")
End Sub
[/CODE]

Riêng ô ngày bạn thay bằng DTPicker để nhập cho thuận tiện và chuẩn mực.
 
Lần chỉnh sửa cuối:
Upvote 0
Dear các bác, em đã chỉnh dc cái vấn đề số tổng, nhưng cái oplen và opve sao nó không chạy vô bảng nhập liệu của em ạ :(
 
Upvote 0
Bạn muốn nhập ngày nhanh chóng thì dùng thêm hàm này:
Function InputN(ByVal Dval As String, Optional mg As Boolean = True, Optional n As Integer = 20)
'Dval la gia tri nhap vao
'ms la dieu kien de co hien ra thong bao khi nhap xong, mac dinh la 1
'n la chon nam theo kieu 20?? hoac cac kieu nam khac 19??, mac dinh la 20
Dim l As Integer, i As Integer
l = Len(Dval)
If Len(Dval) < 1 Then Exit Function
If Len(Dval) = 1 And IsNumeric(Right(Dval, 1)) = False Then InputN = Null: Exit Function
If IsNumeric(Right(Dval, 1)) Or Right(Dval, 1) Like "/" Then
InputN = Dval
Else
InputN = Left(Dval, Len(Dval) - 1)
End If
Select Case l
Case 1 And val(Dval) > 3
InputN = "0" & Dval
Case 2 And Right(Dval, 1) Like "/"
InputN = "0" & Dval
Case 2 And val(Dval) > 31
MsgBox "Nhap ngay phai <=31", vbCritical
InputN = Left(Dval, 1)
Case 2
InputN = Dval & "/"
Case 4 And val(Right(Dval, 1)) = 1
InputN = Dval
Case 4 And val(Right(Dval, 1)) >= 2
InputN = Left(Dval, 3) & "0" & Right(Dval, 1) & "/"
Case 4 And IsNumeric(Right(Dval, 1)) = False
InputN = Left(Dval, 3)
Case 4 And val(Left(Dval, 2)) >= 30 And val(Right(Dval, 1)) = 2
MsgBox "Thang 2 khong co ngay >=30", vbCritical
InputN = Left(Dval, 3)
Case 5 And Right(Dval, 1) Like "/"
InputN = Left(Dval, 3) & "0" & Right(Dval, 2)
Case 5 And Right(Dval, 2) Like "0/"
InputN = Left(Dval, 3)
Case 5 And val(Right(Dval, 2)) > 12
'If mg = 1 Then MsgBox "Nhap thang phai <=12", vbCritical
InputN = Left(Dval, 4)
Case 5
InputN = Dval & "/"
Case 6 And val(Left(Dval, 2)) >= 30 And val(Mid(Dval, 4, 2)) = 2
InputN = Left(Dval, 4)
Case 6 To 10 And Not Mid(Dval, 6, 1) Like "/"
InputN = Left(Dval, 5) & "/"
Case 6 To 10 And val(Mid(Dval, 4, 2)) = 0
InputN = Left(Dval, 4)
Case 7 And IsNumeric(Right(Dval, 1)) = False
InputN = Left(Dval, 6)
Case 8 And IsNumeric(Right(Dval, 1)) = False
InputN = Left(Dval, 7)
Case 8
InputN = Left(Dval, 6) & Format(n, "0#") & Right(Dval, 2)
Case 3 To 10
InputN = Replace(Dval, "//", "/", 1, 2)
End Select
'If l > 11 Then InputN = Left(Dval, 6)
If l >= 3 And IsNumeric(Left(Dval, 2)) = False Then InputN = "0" & Dval
If l >= 3 And val(Left(Dval, 2)) = 0 Then InputN = Null
If l >= 3 And val(Left(Dval, 2)) > 31 Then MsgBox "Nhap ngay phai <= 31", vbCritical: InputN = Left(Dval, 1)
If l >= 3 And Not Mid(Dval, 3, 1) Like "/" Then InputN = Left(Dval, 2) & "/" & Mid(Dval, l - 2)
If l >= 5 And val(Mid(Dval, 4, 2)) > 12 Then MsgBox "Nhap thang <=12", vbCritical: InputN = Left(Dval, 4)
If l >= 10 Then
If IsDate(Format(Dval, "dd/mm/yyyy")) = False Then InputN = Left(Dval, 6): GoTo Loi 'nhap sai khong dung ngay thang bao loi
If mg = True Then 'cho hien thong bao khi nhap xong
MsgBox "-Nhap ngay thang nam thanh cong!" & Chr(13) & _
"-Ngay thang nam nhap: " & Dval & Chr(13) & _
"-Function creat by: Tran Hau Trung!", vbInformation
End If
Dval = Format(Dval, "dd/mm/yyyy")
End If
Exit Function
Loi:
MsgBox "-Nhap ngay thang nam khong thanh cong!" & Chr(13) & _
"-Kiem tra lai xem thang 2 chi co 28 or 29 ngay!" & Chr(13) & _
"-Cac thang 4, 6, 9, 11 chi co 30 ngay!" & Chr(13) & _
"-Function creat by: Tran Hau Trung!", vbCritical
End Function



Để sử dụng thì tại textbox "Ngày" bạn dùng sự kiện change
Private Sub txtngay_Change()
me.txtngay=InputN(me.txtngay,True,20) 'Số 20 để hiện năm dạng 20## có thể có hoặc không, True để hiện thông báo khi nhập xong
End Sub
 
Upvote 0
Dear các bác, em đã chỉnh dc cái vấn đề số tổng, nhưng cái oplen và opve sao nó không chạy vô bảng nhập liệu của em ạ :(
Bạn xóa 2 dòng
'If opdi Then .Offset(, 13).Value = "Di"
'If opden Then .Offset(, 13).Value = "Ve"
và thêm vào 1 dòng
.Offset(, 13).Value = IIf(frnhaplieu.opLen.Value = True, "Ði", "VÊÌ")
trong CapNhatPhieuChi là ok
 
Upvote 0
Cảm ơn bạn trung.aof và bạn sealan nhiều lắm ạ, giờ mình đã hoàn tất bảng nhập liệu phiếu chi, giờ mình sẽ tiếp tục làm những phần tiếp theo, nếu có thắc mắc, hy vọng 2 bạn tiếp tục hướng dẫn mình nhé. Cảm ơn 2 bạn nhiều !!!
 
Upvote 0
Các bạn ơi, bi giờ mình muốn ô lương sẽ được tự động cập nhật dựa vào cbdi và cbden trong sheet Luong thì phải làm như thế nào ạ ?
Em gởi các bác file em đang làm, cảm ơn các bác nhiều lắm
 

File đính kèm

Upvote 0
Các bạn ơi, sao mình xài hàm SUMPRODUCT để tìm số tiền lương cho tài xế từ chuyến đi và chuyến đến trong sheet lương, em làm như sau :
Mã:
Private Sub cbden_Afterupdate()
Me.txtluong = CDbl([SumProduct(cbden= range(DI))*(cbden=range(DEN)) * RANGE(tienluong))])
End Sub
Mà sao nó lại cho giá trị là 2015 ???
Các anh giúp em với ???
Tập tin thunghiem1 là excel 2010 còn thunghiem la 2003
Cảm ơn các anh nhiều lắm !!!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia với bạn 1 số vấn đề:
-Bạn đã sử dụng VBA thì tốt nhất là dùng VBA. Nếu dùng hàm Excel thì nó phải có lý cơ. Ở đây bạn dùng Sumproduct thì sai cả về phép tính, sai cả về cách làm.
-Bạn nên dùng cung đường thay cho từ và đến. Nó vưa gọn bớt đi 1 combobox , bỏ đi mấy checkbox chuyến lên-về, vừa tránh sai sót về chính tả. Hiện file của bạn có sai lệch giữa Combobox và sheet lương đó nha, không điều chỉnh thì tìm không được đâu.

Bạn kiểm tra lại và cho ý kiến đã nha
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom