Mình muốn tạo 1 FORM để nhập số liệu vào hóa đơn . mình tìm trên diễn dàn có 1 bạn tạo được 1 FROM rất hay, mình muốn làm tương tự như vậy theo số liệu riêng của mình mà không được.
Mình muốn tao1 Form gồm 3 tabship là 3 loại máy làm ra các sản phẩn đó
Mỗi tab có 1 listbox bên trong gồm danh sách gồm Mã hang, tên hàng ,Giá ...theo kiểu checkbox để mình tick .
Và thêm 1 Cmdbuttom để sau khi lựa chon các mặt hàng mình nhấn để tự nhập dữ liệu vào hóa đơn.
Rất mong mọi người giúp đỡ or có Form khác phù hợp hơn.
Thanks
Mình muốn tạo 1 FORM để nhập số liệu vào hóa đơn . mình tìm trên diễn dàn có 1 bạn tạo được 1 FROM rất hay, mình muốn làm tương tự như vậy theo số liệu riêng của mình mà không được.
Mình muốn tao1 Form gồm 3 tabship là 3 loại máy làm ra các sản phẩn đó
Mỗi tab có 1 listbox bên trong gồm danh sách gồm Mã hang, tên hàng ,Giá ...theo kiểu checkbox để mình tick .
Và thêm 1 Cmdbuttom để sau khi lựa chon các mặt hàng mình nhấn để tự nhập dữ liệu vào hóa đơn.
Rất mong mọi người giúp đỡ or có Form khác phù hợp hơn.
Thanks
Một kiểu yêu cầu giúp hơi kỳ cục tiêu đề giữa sheet DATA so với sheet HÓA ĐƠN không giống nhau, hơi khó khăn cho việc tạo Form nhưng cũng có thể làm được.
Vậy khi nhập HÓA ĐƠN BÁN HÀNG xong rồi thì lưu nó vào sheet nào?
Mình cũng đang định hỏi làm như thế nào để lưu được hóa đơn sang 1 Sheet mới mà vẫn giữ được mẫu hóa đơn gốc.
Tại mình ko hiểu nhiều về excel nên mình chỉ đưa ra các ý tưởng về 1 Form như vậy . Chắc hơi kỳ cục thật ...hj hj
Bạn có form nào khác hay cách quản lý hóa đơn nào tôt hơn xin cho mình ý kiến với.
Thanks bạn nhiều
Mình bê cái Form bạn thích về cho bạn.
Mình có sửa lại Code cho hợp lý bạn kiểm tra xem sao
(Mình dùng Exc2003 nên phải Convert, bạn kiểm tra xem có lỗi không)
Mình bê cái Form bạn thích về cho bạn.
Mình có sửa lại Code cho hợp lý bạn kiểm tra xem sao
(Mình dùng Exc2003 nên phải Convert, bạn kiểm tra xem có lỗi không)
Trước tiên mình cám ơn bạn đã giúp đỡ. hihi
Nhưng ban ơi cho mình hỏi bạn nhập danh sách đó vào listbox thế nào vậy. mình tìm hiểu mãi ko biết làm thê nào.
Mà danh sách trong listbox ko có ĐƠN GIÁ mà lúc nhập ra vẫn có đơn giá vậy bạn. hi hi
Mình hơi hiếu kì mong bạn giúp đỡ.
Nếu có thời gian bạn có thế chia listbox thành 3 tab như mình đã nói ở trên được ko.
Tại mình thấy nếu sau này có nhiều loại mặt hàng thì sẽ khó cho việc tìn mã.
Thanks ban nhiều
À còn nữa nếu có thể bạn làm giúp mình làm thế nào để lưu hóa đơn sang 1 sheet mới mà vẫn giữ được Mẫu Hóa Đơn nhe
Và cách làm mã hóa đơn tự nhảy số sau mỗi lần lưu hóa đơn mới ý.
Rất mong hồi âm của bạn. thanks you so so much
Cám ơn bạn rât rất nhiều nhé.
FORM bạn làm rất ứng ý theo ý mình , tuy nhiên khi nhập hóa đơn thường hay quên nhập tên khách hàng và mã khác hàng , ngày và số HĐ. Bạn có thể tạo cho mình thêm một vài list hay combobox nhỏ trên đầu FORM để điền Số HĐ, Ngày , Khách hàng và Mã khách hàng tương ứng được ko, hi hi
Mình có tạo thêm 1 sheet có tên và mã khách hàng rồi
Mình có thêm 1 Sheet SỔ NỢ nữa. mình muốn mỗi lần hóa đơn được lưu sẽ cộng luôn phần NỢ vào sổ nợ và Thêm luôn ngày và giá trị của hóa đơn cuối cùng vào SỔ NỢ cho mỗi khách hàng để dễ quản lý .
À còn nữa , mình muốn lưu hóa đơn vào một Sheet mới , ko lẫn vào sheet DATA, ban nãy mình có sửa các mục lưu HĐ trong DATA thành có dấu nên bị lỗi hết cả. hi hi Đúng là nghịch dại.
Đưng trách mình hỏi nhiều nhé, hihi Giúp người thì giúp cho trót nha bạn
Rất mong bạn giúp đỡ.
Đây là file mới của mình.
Đúng ngày Chủ nhật mình sẽ làm mới cho bạn, bạn cứ suy tính kỹ đi:
-Cấu trúc Form ra sao.
-Data có những gì
-Báo cáo ra sao
Chứ thế này thì vỡ hết. Toanf bộ Code phải sửa lại, mà dặm lại mới khổ và lỗi khó tránh
Vậy mình tổng hợp ý kiến của mình nha.
#1: Về FORM mình muốn có thê một phần để nhập ở trên đầu của FORM là Mã HĐ và Ngày( nên lập listtime cho dễ nhập) và list tên khách hang và MÃ khách hàng tương tự.
#2: Mình muốn thêm 1 cột MÃ khách hàng trong sheet lưu hóa đơn nhá.
#3: Mình muốn lưu HĐ ra một sheet khác sheet DATA, mình muốn quản lý hóa đơn theo từng tháng vậy khi hết tháng mình muốn lưu hóa đơn sang 1 sheet mới mình phải làm thế nào vậy.
#4: Phần lưu hóa đơn của bạn hình như có lỗi vì khi ấn lưu nó thường hiện lên " chỉ những dòng có MÃ và Lượng mới được lưu " tuy nhiên khi ấn OK hóa đơn vẫn được lưu.
#5: Theo mình nên bỏ phần CHÚ Ý ở phần sửa hoá đơn vì ko ai lại đi sửa mã hóa đơn cả
#6: Mình có lập thêm 1 sheet SỔ NỢ để quản lý nợ theo tưng khách hàng, mình muốn khi Ấn lưu hóa đơn thì Phần nợ sẽ được cộng vào dổ nợ và nhập thêm thời gian và tổng giá trị hóa đơn giao dịch gần nhất.( tuy nhiên có 1 vấn đề là khi nhập hóa đơn sai thì khoản nợ cộng vào SỔ NỢ sẽ sai nên khi sửa lại hóa đơn thì mình phải lấy số Nợ ở hóa đơn mới - số Nợ của hóa đơn cũ rồi mời cộng với sổ nợ Vì
Kho NỢ Mới > Nợ cũ thì tức là khoản nợ thực tế lớn hơn khoản nợ đã cộng vào sổ nợ do đó Nợ Mới - Nợ Cũ sẽ là sô dương nên khi cộng vào SỔ NỢ thì đây chính là khoản nợ còn thiều chưa cộng
Ngược khi NỢ Mơi < Nợ Cũ thì tức là số nợ thực tế thấp hơn số nợ đã cộng do đó NỢ Mới - Nợ Cũ sẽ là số âm nên khi cộng vào SỔ NỢ thì đây chính là khoản Nợ cộng thừa bị giảm đi.
Ko biết ý tưởng này của mình cólanfm được ko nếu bạn có ý kiến nào tốt hơn thì giúp mình với nhé......
Thanks ban nhiêu.
Thật may là có ban nếu ko mình có mầy mò cả năm cũng ko ra hihi hihi
Bạn nên tham khảo đề tài này: http://www.giaiphapexcel.com/forum/...t-bảng-tính-chuyên-nghiệp&p=499382#post499382
Việc xây dựng mô hình tổng quát rất quan trọng, mới chỉ như vậy nhưng khi bạn thay đổi sẽ thay đổi hết. Vậy nên mình muốn bạn xác định thật kỹ mô hình file của bạn trước khi bắt tay vào làm chi tiết.
Mình tham gia với bạn 1 số mục bạn nêu:
#1: Có thể để dạng như vậy hoặc thiết kế form. Các yêu cầu bạn nêu đơn giản thôi.
#2: Đương nhiên cần thì phải làm thôi nhưng nó sẽ sửa toàn bộ code nhập vào xuất ra.
#3:Lưu sang Sheet khác cũng được nhưng theo mình cả năm nên để theo 1 sheet, việc báo cáo sẽ có báo cáo tổng hợp công nợ từ ngày đến ngày quy củ chứ ai lại dùng Data bao giờ. Tóm lại các sheet: Data, Danh Mục, Info v.v... không nên màu mè và chỉnh sửa, cần báo cáo thì rút dữ liệu ra sheet khác.
#4: Hoàn toàn không có lỗi: Việc đó có nghĩa là nếu tiện tay bạn nháy 5 dòng mã nhưng bạn chỉ nhập số lượng cho ba dòng thì chỉ lưu ba dòng đầy đủ thôi. (Cơ chế nhập các phần mềm kế toán dạng nhiều dòng 1 chứng từ đều vậy thôi)
#5: Tuỳ bạn thôi nhưng đấy là hết sức quan trọng, vì khi nhập vào mà sửa số HD thì coi như Hoá đơn mới. Bạn cứ thử xem.
#6: Về công nợ về sau sẽ có sổ tổng hợp công nợ, Bảng kê chi tiết công nợ theo KH chứ.
#Bis: Sau phải bổ xung Form thu tiền hàng (Nếu KH không mua mà chỉ trả nợ), nhâp Đ/c như xoá nợ, bổ xung nợ như nợ dài quá phải trả lãi.
Một vấn đề nữa, nếu theo dõi cả kho hàng thì lại thêm cả phần nhập hàng nữa.
Vậy nha bạn nghiên cứu kỹ đi, sau đó bạn bắt tay làm lại, khó khăn mình và anh em hỗ trợ.
thanks ban
Mình sẽ nghiên cứu kỹ hơn, tại Nhà mình chỉ là sản xuất hộ gia đình nên cũng không cần quản lý quá quy mô. hihi
Nêu có gi không hiểu giúp đỡ mình nhé.
Giải thích hộ mình đoạn code này với :
Sub Button1_Click()
Dim Cl As Range, i, j
'Kiem tra truoc khi nhap
If Ktra() Then
'Xoa nhung chung tu trung so
i = Sheet1.Cells(Sheet1.Rows.Count, 10).End(3).Row Do If Sheet1.Cells(i, 10).Value = Sheet2.[C6].Value Then Sheet1.Cells(i, 10).Resize(, 12).Delete Shift:=xlUp End If i = i - 1 If i = 2 Then Exit Do Loop
i = Sheet1.Cells(Sheet1.Rows.Count, 10).End(3).Row
Đặt i bằng dòng cuối cùng có dữ liệu
Do
Vòng lặp Do If Sheet1.Cells(i, 10).Value = Sheet2.[C6].Value Then
Nếu số chứng từ bằng số chứng từ nhập vào thì xóa đi (Khi Load để an toàn như mất điện, hay hủy sửa thì vẫn còn chứng từ cũ ) giờ xóa cũ đi để nhập mới
Sheet1.Cells(i, 10).Resize(, 12).Delete Shift:=xlUp
Xóa dòng chứng từ đó.
End If i = i - 1
nếu i=2 thì dừng lại vì từ dòng 2 là tiêu đề If i = 2 Then Exit Do Loop
Nói chung đây là vòng lặp ngược từ dưới lên để khi xóa dòng không ảnh hưởng điều chỉnh i
i = Sheet1.Cells(Sheet1.Rows.Count, 10).End(3).Row
Đặt i bằng dòng cuối cùng có dữ liệu
Do
Vòng lặp Do If Sheet1.Cells(i, 10).Value = Sheet2.[C6].Value Then
Nếu số chứng từ bằng số chứng từ nhập vào thì xóa đi (Khi Load để an toàn như mất điện, hay hủy sửa thì vẫn còn chứng từ cũ ) giờ xóa cũ đi để nhập mới
Sheet1.Cells(i, 10).Resize(, 12).Delete Shift:=xlUp
Xóa dòng chứng từ đó.
End If i = i - 1
nếu i=2 thì dừng lại vì từ dòng 2 là tiêu đề If i = 2 Then Exit Do Loop
Nói chung đây là vòng lặp ngược từ dưới lên để khi xóa dòng không ảnh hưởng điều chỉnh i
A mình hiểu rồi.
Mình viết code cho lệnh này rồi nó cứ chạy mãi trong VÒNG ko next lệnh tiếp, hóa ra là vậy hihi
Tìm tòi thế này mất thời gian nhưng hiểu được rồi thì sẽ nhớ lâu kaka
Thanks ban nhiều
Sheet1.Cells(i, 10).Resize(0, 12).Delete Shift:=xlUp
Đây là lệnh thay đổi kích thước vùng chọn, nếu dòng âm sẽ vượt lên trên, và cột âm sẽ dịch sang trái.
Tức là ô (dòng i cột 10) của sheet1 nới vùng về bên phải 12 ô (Tính cả ô mốc) nới lên trên xuống dưới =0
Ví dụ i=2, tên của Sheet1 là DATA
Địa chỉ của ô mốc là: DATA!J2
Mở rộng về bên phải 12(cả mốc) vag lên xuống 0 thành vùng : DATA!J2:U2
i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(2).Row
Do
If Sheet4.Cells(i, 1).Value = Sheet2.[C6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
If i = 1 Then Exit Do
Loop
Mình đổi lại code như thế này để lưu sa sang sheet 4 mà sao vẫn bị lỗi, nhấn f8 nó cữ chạy mãi ko ra được khỏi vòng.
Giúp mình với.
Mình muốn up file của mình lên cho bạn xem là sao lai ko được nhỉ....??????
Bạn Sealand ơi Giúp mình với ..... Cả ngày CN ko ra khỏi nhà ngồi tìm tài liệu đọc đọc đau hết cả mắt rồi viết code sai bung bét hết cả .... Chắc phải có người dạy tận nơi thì mới hiểu được mất huhu KHÓ QUÁ.... Như thế này thì bao giờ mình mới làm xong cái Form này để quản lý hóa đơn cho BA mình đây ... huhuhuhuhu Mình còn nhiều vấn đề quá, bạn giúp mình với..
#1 :Sửa cho mình đoạn code về DO LOOP nha
Bạn viết cho mình vài thêm vài code theo Form này với.
#2 hần điền tên khách hàng thì chỉ cần chọn Tỉnh thì sẽ hiện ra các khách hàng ở tỉnh đó và khi chọn được Tên khách hàng thì sẽ hiện ra mã khách hàng tương ứng.( Mình biết dùng Data Validation để làm trên excel nhưng khi làm trên form thì mình bó tay.)
#3 : Phần Ngày hóa đơn thì khi tick chọn To Day thì nó sẽ tự động hiển thì ngày hôm nay , còn nếu ko thì có sẽ hiện ra listtime để mình chon .
#4 : Phần số hóa đơn thì nhập bằng tay
Rồi sau khi click IN PUT nó sẽ tự động điền thông tin như " Mã HĐ , Ngày , Tên KH và Mã KH " vào hóa đơn.
#5 :Rồi viết thêm cho mình cái code để để tính tổng NỢ ở Dưới cùng hóa đơn ý.( cái này dễ nhất mà viết vẫn ko đc... huhu)
KHÓ CHẾT MẤT ........huhuhuhu
Mình chưa xem file nhưng các Bác ấy đã giúp bạn.
Trời ạ, các đối số của hàm, lệnh sai 1 ly đi 1 dặm, bạn phải nhớ cho kỹ. Trong code nó là con số 3 tương đương xlUp
Một mẹo để khi viết khỏi sai:
Khi bạn viết Sheet1.Cells(Sheet1.Rows.Count, 10).End(3)
Nhưng bạn cóc nhớ End(?) bạn viết tạm như sau: sheet1.Range("J10").end(
J10 là ô bất kỳ trong cột 10. Đây là cách viết cơ bản nên khi bạn mở ngoặc Code đã nha nhá cho bạn 4 kiểu chhọn di chuyển, bạn chọn theo ý hoặc điền theo số thứ tự 1-4. Khi quen nhập số sẽ nhanh hơn. Bạn chép lấy câu đoạn lệnh tương ứng vào Code của mình.
Đã yêu Excel VBA thì những cái này nên có sổ tay ghi lại, bao giờ thuộc rồi thì truyền cho hậu thế.
Bạn lưu ý trong file của bạn: Mã hàng, Mã khách hàng là duy nhất. Như vậy khi dùng Hàm hay VBA mới tìm được.
Trong khi đó bảng Mã KH có 2 mã CTTB, 2 mã CTTN . Trường hợp bạn không muốn thay các ký tự mã thì tốt nhất các mã có 2 phần:
-Phần Ký tự. Như bảng mã của bạn. Tốt nhất chỉ Ten KH không thêm cô chú anh chị trong mã, khi tìm sau này sẽ tiện hơn nhiếu Ví du: Cô Thắng Thái Nguyên bạn tạo mã THANG01
-Phần số TT: 01,02...
Ví dụ CTTN : Cô Thắng Thái Nguyên bạn thêm 01 thành CTTN01. Khi gặp Cô Thanh Thái Nguyên bạn tạo mã CTTN02
Đây là file mình chỉnh sửa , mình có viết lại 1 số code nhưng có vẻ hơi dài, mọi người xem góp ý để mình hoàn thiện cái Form này
Duy chỉ có cái code này( Báo lỗi ở phần màu đỏ)
Private Sub CmdLuuHD_Click()
Dim Cl As Range, i, j
'Kiem tra truoc khi nhap
If Ktra() Then
'Xoa nhung chung tu trung so
i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
Do If Sheet4.Cells(i, 1).Value = Sheet2.[C6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
If i = 2 Then Exit Do
Loop
'Nhap du lieu vao luu
Set Cl = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Offset(1)
For i = 11 To 29
If Sheet2.Cells(i, 3) <> "" And Sheet2.Cells(i, 7) <> 0 Then
Cl.Value = Sheet2.[C6].Value
Cl.Offset(, 1).Value = Sheet2.[G6].Value
Cl.Offset(, 2).Value = Sheet2.[G8].Value
Cl.Offset(, 3).Value = Sheet2.[D8].Value
Cl.Offset(, 4).Value = Sheet2.Cells(i, 3).Value
Cl.Offset(, 5).Value = Sheet2.Cells(i, 4).Value
Cl.Offset(, 6).Value = Sheet2.Cells(i, 5).Value
Cl.Offset(, 7).Value = Sheet2.Cells(i, 6).Value
Cl.Offset(, 8).Value = Sheet2.Cells(i, 7).Value
Cl.Offset(, 9).Value = Sheet2.Cells(i, 8).Value
Cl.Offset(, 10).Value = Sheet2.[H30].Value
Cl.Offset(, 11).Value = Sheet2.[H31].Value
Cl.Offset(, 12).Value = Sheet2.[H32].Value
Cl.Offset(, 13).Value = Sheet2.[H33].Value
Cl.Offset(, 14).Value = Sheet2.[H34].Value
Cl.Offset(, 15).Value = Sheet2.[H35].Value
Set Cl = Cl.Offset(1)
End If
Next
End If
Union(Sheet2.[C6], Sheet2.[G6], Sheet2.[D8], Sheet2.[G8], Sheet2.[C11:H29], Sheet2.[H30:H35]).ClearContents
Sheet2.[C6].Select
End Sub
Lúc đầu mình viết như trên thì chạy được, nhưng ko hiểu tại sao một lúc sau khi mình viết những code khác nó lại bị lỗi.
Mình check đi check lại giống y như mình viết lúc đầy mà ko hiểu sao vẫn lỗi.
[COLOR=#0000cd]i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
Do
If i < 2 Then Exit Do
If Sheet4.Cells(i, 1).Value = Sheet2.[C6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
Loop[/COLOR]
Hoặc bạn viết như sau cho gọn:
Mã:
[COLOR=#0000cd]i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
Do While i > 1
If Sheet4.Cells(i, 1).Value = Sheet2.[C6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
Loop[/COLOR]
2/ Chỉnh Code Private Sub CmdLuuHD_Click():
Đoạn cuối bạn để sai vị trí nên khi thiếu dữ liệu đáng lẽ quay vào sửa thì lại bị nó xoá mất. Bạn thay đoạn sau:
Mã:
.............................
Next
End If
Union(Sheet2.[C6], Sheet2.[G6], Sheet2.[D8], Sheet2.[G8], Sheet2.[C11:H29], Sheet2.[H30:H35]).ClearContents
Sheet2.[C6].Select
End Sub
Bạn thay như sau:
Mã:
..........................
Next
CmdNhapMoi_Click 'Tan dung code da co khong nen viet lai
End If
End Sub
3/ Sửa code cho nút nhập mới để làm thêm 2 việc:
-Xem trong Hồ sơ số HD lớn nhất là bao nhiêu rồi cộng 1 để điền vào số HD mới (Thêm chữ HD vào đầu và 5 chữ số), nếu người dùng đồng ý thì không phải sửa nữa.
-Vì hoá đơn thường nhập cùng ngày nên nếu đã có thì lấy lại ngày cũ, nếu chưa có thì bằng ngày hôm nay
Bạn chép đè Sub CmdNhapMoi_Click() bằng Sub và Hàm sau:
Mã:
Private Sub CmdNhapMoi_Click()
Dim Cl As Range, So As Long
With Sheet2
If .[G6] = "" Or Not IsDate(.[G6]) Then .[G6].Value = Date
Union(.[C6], .[D8], .[G8], .[C11:H29], .[H30:H35]).ClearContents
For Each Cl In Sheet4.Range("A2:A" & Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row)
If Val(TachSo(Cl)) > So Then So = Val(TachSo(Cl))
Next
.[C6].Value = "HD" & Right("00000" & So + 1, 5)
.[C6].Select
End With
End Sub
'-------------------------------
Function TachSo(Cell As Range) As Double
Dim Temp As Object
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "[^0-9]"
TachSo = IIf(Temp.Replace(Cell, "") = "", 0, Temp.Replace(Cell, ""))
End Function
4/ Bạn xem lại Sub Command_Chon_Click() mình viết như thế nào bạn điều chỉnh lại, bạn bỏ do....loop... nên nó chỉ Load đúng 1 dòng rồi thôi.
[COLOR=#0000cd]i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
Do
If i < 2 Then Exit Do
If Sheet4.Cells(i, 1).Value = Sheet2.[C6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
Loop[/COLOR]
Hoặc bạn viết như sau cho gọn:
Mã:
[COLOR=#0000cd]i = Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row
Do While i > 1
If Sheet4.Cells(i, 1).Value = Sheet2.[C6].Value Then
Sheet4.Cells(i, 1).Resize(, 12).Delete Shift:=xlUp
End If
i = i - 1
Loop[/COLOR]
2/ Chỉnh Code Private Sub CmdLuuHD_Click():
Đoạn cuối bạn để sai vị trí nên khi thiếu dữ liệu đáng lẽ quay vào sửa thì lại bị nó xoá mất. Bạn thay đoạn sau:
Mã:
.............................
Next
End If
Union(Sheet2.[C6], Sheet2.[G6], Sheet2.[D8], Sheet2.[G8], Sheet2.[C11:H29], Sheet2.[H30:H35]).ClearContents
Sheet2.[C6].Select
End Sub
Bạn thay như sau:
Mã:
..........................
Next
CmdNhapMoi_Click 'Tan dung code da co khong nen viet lai
End If
End Sub
3/ Sửa code cho nút nhập mới để làm thêm 2 việc:
-Xem trong Hồ sơ số HD lớn nhất là bao nhiêu rồi cộng 1 để điền vào số HD mới (Thêm chữ HD vào đầu và 5 chữ số), nếu người dùng đồng ý thì không phải sửa nữa.
-Vì hoá đơn thường nhập cùng ngày nên nếu đã có thì lấy lại ngày cũ, nếu chưa có thì bằng ngày hôm nay
Bạn chép đè Sub CmdNhapMoi_Click() bằng Sub và Hàm sau:
Mã:
Private Sub CmdNhapMoi_Click()
Dim Cl As Range, So As Long
With Sheet2
If .[G6] = "" Or Not IsDate(.[G6]) Then .[G6].Value = Date
Union(.[C6], .[D8], .[G8], .[C11:H29], .[H30:H35]).ClearContents
For Each Cl In Sheet4.Range("A2:A" & Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row)
If Val(TachSo(Cl)) > So Then So = Val(TachSo(Cl))
Next
.[C6].Value = "HD" & Right("00000" & So + 1, 5)
.[C6].Select
End With
End Sub
'-------------------------------
Function TachSo(Cell As Range) As Double
Dim Temp As Object
Set Temp = CreateObject("VBScript.RegExp")
Temp.Global = True
Temp.Pattern = "[^0-9]"
TachSo = IIf(Temp.Replace(Cell, "") = "", 0, Temp.Replace(Cell, ""))
End Function
4/ Bạn xem lại Sub Command_Chon_Click() mình viết như thế nào bạn điều chỉnh lại, bạn bỏ do....loop... nên nó chỉ Load đúng 1 dòng rồi thôi.
Mình đã làm như bạn nói và các code đều OK hết hihi
Thanks bạn nhiều. Bạn Tiếp tục giúp mình Hoàn thành cái FORM nữa nha
Còn nữa, mình nên cho cái tác dụng Cập Nhật ngày và Số HĐ vào Nút Nhap Lại hay nút PUT IN trên form thì hay hơn hả bạn
Bạn có ý kiến nào Giúp mình quản lý NỢ tốt hơn không.
Nên thống kê ra Đầu Kỳ , Trong Kỳ , Cuối KỲ không bạn
Tại mình không có nhiều kinh nghiệm về tài chính lắm nên không biết như thế nào thì tốt hơn. hi hi
Bạn cứ làm tốt việc cập nhật đi đã, việc khai thác sẽ có cách thoả đáng.
Mình thấy cách cùng làm thế này hay hơn nhỉ, sau khi hoàn thành bạn sẽ được nhiều hơn.
Bạn cứ làm tốt việc cập nhật đi đã, việc khai thác sẽ có cách thoả đáng.
Mình thấy cách cùng làm thế này hay hơn nhỉ, sau khi hoàn thành bạn sẽ được nhiều hơn.
Bạn Sealand ơi , mình mới chỉ viết được Code của PUT IN như này nè
Private Sub cndPutIn_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Sheet2
If Trim(Me.txtNumber.Value) = "" Then
MsgBox "VUI LONG NHAP MA HOA DON", 16, "THONG BAO"
Exit Sub
End If
If Trim(Me.cmbtime.Value) = "" Then
MsgBox "VUI LONG NHAP NGAY HOA DON", 16, "THONG BAO"
Exit Sub
End If
If Trim(Me.cmbName1.Value) = "" Then
MsgBox "VUI LONG NHAP TEN KHACH HANG", 16, "THONG BAO"
Exit Sub
End If
ws.Cells(6, 3).Value = Me.txtNumber.Value
ws.Cells(6, 7).Value = Me.cmbtime.Value
ws.Cells(8, 4).Value = Me.cmbName1.Value
ws.Cells(8, 7).Value = Me.cmbCode1.Value
Sửa mãi ko được đoạn code của bạn cập nhật Số HĐ và ngày tháng viết trong Sheet hóa đơn để viết vào phím PUT IN.
Tại mình ko hiểu vài đoạn này( Đoạn màu đỏ)
Private Sub CmdNhapMoi_Click()
Dim Cl As Range, So As Long
With Sheet2
If .[G6] = "" Or Not IsDate(.[G6]) Then .[G6].Value = Date
Union(.[C6], .[D8], .[G8], .[C11:H29], .[H30:H35]).ClearContents For Each Cl In Sheet4.Range("A2:A" & Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row) If Val(TachSo(Cl)) > So Then So = Val(TachSo(Cl)) Next .[C6].Value = Right("00000" & So + 1, 5) .[C6].Select End With End Sub '------------------------------- Function TachSo(Cell As Range) As Double Dim Temp As Object Set Temp = CreateObject("VBScript.RegExp") Temp.Global = True Temp.Pattern = "[^0-9]" TachSo = IIf(Temp.Replace(Cell, "") = "", 0, Temp.Replace(Cell, "")) End Function
Nhất là cái "TachSo(Cl)" với "So" của bạn là gì.
Và bạn có thể gợi ý cho mình cachhs liên kết các mục như Tỉnh , Khách hàng , Mã KH được ko. Mình viết theo mẫu Code của bạn bên dưới nhưng viết ko sai. Bạn có thể giải thích cho mình hiểu thêm đoạn này nữa được ko
Private Sub cbbName_Change() Dim i Dim cVal As String cVal = LCase(Trim(cbbName.Value)) For i = 0 To LBData.ListCount - 1 If LCase(Trim(LBData.List(i, 1))) = cVal Then LBData.ListIndex = i End If Next i End Sub
Hì, mình không biết bản lĩnh của bạn đến đâu nhưng giờ cũng tung hoành rồi đây:
1/Giải thích đoạn 1:
Mã:
[COLOR=#ff0000]Function TachSo(Cell As Range) As Double[/COLOR]
[COLOR=#ff0000]Dim Temp As Object[/COLOR]
[COLOR=#ff0000] Set Temp = CreateObject("VBScript.RegExp")[/COLOR]
[COLOR=#ff0000] Temp.Global = True[/COLOR]
[COLOR=#ff0000] Temp.Pattern = "[^0-9]"[/COLOR]
[COLOR=#ff0000] TachSo = IIf(Temp.Replace(Cell, "") = "", 0, Temp.Replace(Cell, ""))[/COLOR]
[COLOR=#ff0000]End Function[/COLOR]
Đây là 1 hàm tự người dùng tạo ra làm cái việc tách bỏ ký tự trong 1 ô ví du;
ô A2 có nội dung là HD00012
khi nhập =Tachso(A2)=00012. Mục đích nếu bạn nhập số HD là số thì không sao chứ nhập HD-002 thì không tính toán được.
Mã:
[COLOR=#ff0000]For Each Cl In Sheet4.Range("A2:A" & Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row)[/COLOR]
[COLOR=#ff0000]If Val(TachSo(Cl)) > So Then So = Val(TachSo(Cl))[/COLOR]
[COLOR=#ff0000]Next[/COLOR]
[COLOR=#ff0000].[C6].Value = Right("00000" & So + 1, 5)[/COLOR]
[COLOR=#ff0000].[C6].Select[/COLOR]
[COLOR=#ff0000]End With[/COLOR]
[COLOR=#ff0000]End Sub[/COLOR]
So là biến ta khai báo bằng lệnh Dim ở trên dạng Long nên khởi đầu nó bằng 0 For Each Cl In Sheet4.Range("A2:A" & Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row)
lần lượt từng ô trong cột số HD If Val(TachSo(Cl)) > So Then So = Val(TachSo(Cl))
Nếu số HD sau khi bỏ ký tự lớn hơn So thì ta gán So bằng số đó Next
Hết vòng lặp ta có So là số hoá đơn lớn nhất đã có trong Cột .[C6].Value = Right("00000" & So + 1, 5)
Khi thêm mới thì số HD bằng số lớn nhất (So) cộng 1. (Ta định dạng số HD bằng 5 chữ số ví dụ 00001 .[C6].Select
Chon ô số HD
2/Đoạn Code 2:
Mã:
[COLOR=#ff0000]Private Sub cbbName_Change()[/COLOR]
[COLOR=#ff0000]Dim i[/COLOR]
[COLOR=#ff0000]Dim cVal As String[/COLOR]
[COLOR=#ff0000]cVal = LCase(Trim(cbbName.Value))[/COLOR]
[COLOR=#ff0000] For i = 0 To LBData.ListCount - 1[/COLOR]
[COLOR=#ff0000] If LCase(Trim(LBData.List(i, 1))) = cVal Then[/COLOR]
[COLOR=#ff0000] LBData.ListIndex = i[/COLOR]
[COLOR=#ff0000] End If[/COLOR]
[COLOR=#ff0000] Next i[/COLOR]
[COLOR=#ff0000]End Sub[/COLOR]
Đây là đoạn Code sự kiện của Combobox cbbName. Khi cbbName thay đổi nó phát sinh sự kiện
cVal = LCase(Trim(cbbName.Value))
Gans biến cVal=chuỗi trong cbbName For i = 0 To LBData.ListCount - 1
Lần lượt từ dòng đầu đến dòng cuối của LBDT If LCase(Trim(LBData.List(i, 1))) = cVal Then
Nếu dòng thứ i =cVal thì đặt thuuọc tính ListIndex của LBDT bằng i (Thực chất là chọn dòng i trên LBDT) LBData.ListIndex = i
Đúng ra là thêm dòng lệnh sau ở đây Exit For
Có nghĩa là nếu tìm thấy dòng nào thì chọn dòng đó và thoát luôn, còn bạn viết vậy nó tìm thấy và chọn rồi nhưng vẫn phải lượt cho hết các dòng còn lại của LBDT End If Next i
Sao mình viết đoạn code này toàn báo lỗi vậy huhu ( Lỗi phần màu đỏ)
Private Sub CmdNhapHang_Click() Dim Cl As Range, So As Long With Sheet2 Range("c11").Select frmData.Show For Each Cl In Sheet4.Range("A2:A" & Sheet4.Cells(Sheet4.Rows.Count, 1).End(3).Row) If Val(TachSo(Cl)) > So Then So = Val(TachSo(Cl)) Next Me.txtNumber.Value = Right("00000" & So + 1, 5) End With End Sub '------------------------------- Function TachSo(Cell As Range) As Double Dim Temp As Object Set Temp = CreateObject("VBScript.RegExp") Temp.Global = True Temp.Pattern = "[^0-9]" TachSo = IIf(Temp.Replace(Cell, "") = "", 0, Temp.Replace(Cell, "")) End Function
Còn phần ngày tháng mình viết được như thế này
Private Sub OptToDay_Click() If OptToDay.Value = True Then Me.cmbtime.Value = Date End Sub
Nhưng vẫn không tạo được một listtime nếu trường hợp muốn nhập ngày nào đó mà ko phải ToDay
Bạn giúp mình với.
Còn phần Tên khách hàng mà mã khách hàng mình có thể đặt vùng dữ liệu gồm tên khách hàng và mã khách hang là "KHACH" rồi viết đoạn code thê này có được ko bạn (Chắc là không được hihi)
Private Sub cmbName1_Change() Dim i Dim cVal As String cVal = LCase(Trim(cmbName1.Value)) For i = 1 To Range("KHACH").ListCount If LCase(Trim(Range("KHACH").List(i, 1))) = cVal Then Range("KHACH").ListIndex = i
Exit For End If
Next i
End Sub
Còn phần liên kết giũa Tỉnh và tên khách hàng thì mình ko biết viết thế nào cả. Mình chỉ biết dùng DataValidation để làm trên excel chứ không biết viết nó thành code thê nào.
À hay là dùng macros nhỉ , kaka để mình thử nghịch tý xem sao
1-Nếu không nhầm thì bạn viết sai tên ô điêù khiển.
Me.txtNumber.Value = Right("00000" & So + 1, 5)
sửa thành
[B6].Value = Right("00000" & So + 1, 5)
2-Mình chả hiểu gì cả vì không có file thực tế khó mà đoán bạn định làm gì. Mặt khác, trong ngôn ngữ VBA nó có tên gọi và thuật ngữ hẳn hoi chứ tự bạn gọi listtime khó mà biết bạn định nói gì, nếu chưa biết thì hỏi lại.
3-Hoàn toàn hợp lệ, nhưng theo mình không nên vì đã Code thì hạn chế kết hợp với Công thức và Name vì người dùng có thể làm vỡ code của bạn bất kỳ lúc nào
4-Lần sau khi hỏi phải kèm file để kiểm tra và hiệu chỉnh ngay trên file nha.
1-Nếu không nhầm thì bạn viết sai tên ô điêù khiển.
Me.txtNumber.Value = Right("00000" & So + 1, 5)
sửa thành
[B6].Value = Right("00000" & So + 1, 5)
2-Mình chả hiểu gì cả vì không có file thực tế khó mà đoán bạn định làm gì. Mặt khác, trong ngôn ngữ VBA nó có tên gọi và thuật ngữ hẳn hoi chứ tự bạn gọi listtime khó mà biết bạn định nói gì, nếu chưa biết thì hỏi lại.
3-Hoàn toàn hợp lệ, nhưng theo mình không nên vì đã Code thì hạn chế kết hợp với Công thức và Name vì người dùng có thể làm vỡ code của bạn bất kỳ lúc nào
4-Lần sau khi hỏi phải kèm file để kiểm tra và hiệu chỉnh ngay trên file nha.
#.Mình muốn khi bật FORM lên thì phần số HĐ sẽ tự cập nhật trong phần số HĐ trên FORM luôn ý.
#.Còn Listtime ý mình là một danh sách thời gian để lựa chọn ý. (sorry vì gọi tên một cách tùy tiện hihi)
#.Bạn giúp mình viêt code để khi chọn các tỉnh thì phần tên khách hàng chỉ hiện tên khách hàng ở tỉnh đó và khi chọn tên khách hàng xong thì tự hiện ra MÃ KH tương ứng.
#.A còn phần Danh sách tên các tỉnh trong FORM mình cũng cùng NAME để đưa vào FORM, Có cách nào tối ưu hơn để đưa danh sách đó vào FORM mà ko dùng NAME ko bạn
#.Còn về đoạn CODE
Private Sub cmbName1_Change() Dim i Dim cVal As String cVal = LCase(Trim(cmbName1.Value)) For i = 1 To Range("KHACH").ListCount If LCase(Trim(Range("KHACH").List(i, 1))) = cVal Then Range("KHACH").ListIndex = i
Exit For End If
Next i
End Sub
Bạn có cách nào khác để hạn chế dùng NAME ko bạn.
Thanks
Mình thêm 1 DTPicker (Mình đoán bạn gọi nó là ListTime)
Các vấn đề khác xem trong file nha
Muốn thay Name thì dùng Code xác định vùng, hoặc dùng Code định Name nếu ai xoá hay chỉnh sủa Name thì Code vẫn xác định theo yêu cầu của mình.
Mình thêm 1 DTPicker (Mình đoán bạn gọi nó là ListTime)
Các vấn đề khác xem trong file nha
Muốn thay Name thì dùng Code xác định vùng, hoặc dùng Code định Name nếu ai xoá hay chỉnh sủa Name thì Code vẫn xác định theo yêu cầu của mình.
Bạn ơi sao nó báo lỗi rồi. phần nào cũng báo lỗi.
Mà nếu mính muốn số hóa đơn và Thời gian nó cập nhật trên FORM trước sau mới PUT IN ra Hóa đơn được ko bạn
Code xác định vùng có phải là Range(A1:E10) đúng ko bạn
Bạn xem lại giúp mình với
Mình ko ấn được vào ô Ngày . Nó hiện dấu gạch chéo ý.
Bạn giúp mình viết code cho Tỉnh - Khách hàng- Mã hóa đơn với. mình ko biết bắt đầu từ đâu cả huhu
Mình làm được rồi ., trên thanh toolbox nó có thêm 1 NewPage trong đó có DTPicker nhưng mình không hiểu để làm j. ô Ngày tháng trên Sheet vẫn bị gạch chéo .
Bạn giúp mình viết code cho phần Tỉnh - Khách hàng -Mã khách hàng đi bạn .
Giúp mình nhé
Khi đã có nó rồi thì bạn dùng được DTPicker, còn dùng về sau thì bạn khám phá thôi.
(Bạn tải ở bài cũ #38 về đi, file này DTPicker bị hỏng rồi. Nếu về bị co dãn, bạn mở Toolbox rồi co nó lại nha)
Mình sắp hoàn thiện hết FORM rồi.
Chỉ còn mỗi đoạn Code cho phần Tỉnh - Khách hàng - Mã Khách hàng thôi.
Mình ko biết làm thế nào cả, mình hết cách rồi
Giúp mình với huhu
Mình xem bạn làm Form thấy nửa nạc nửa mỡ. Đã nhập đủ thông tin thì còn để sheet Hoá đơn làm gì?
Phần báo cáo nợ bạn làm vậy thì sao mà xem hay in, mình nói rồi bạn cứ làm tốt phần nhập liệu đi.
Bạn nên nghiên cứu lại xem nào?
Mình xem bạn làm Form thấy nửa nạc nửa mỡ. Đã nhập đủ thông tin thì còn để sheet Hoá đơn làm gì?
Phần báo cáo nợ bạn làm vậy thì sao mà xem hay in, mình nói rồi bạn cứ làm tốt phần nhập liệu đi.
Bạn nên nghiên cứu lại xem nào?
Vậy chỉ nên dùng FORM để nhập hàng hóa thôi còn đúng ko bạn, còn các mục khác như mã hóa đơn, ngày, khách hàng thì làm trên Sheet đúng ko.
OK mình sẽ làm theo ý bạn. hihi
Đúng rồi, các ô số ,ngày, mã khách hàng mhập trên sheet để tiện hoặc có form riêng. Riêng form Danh sách hàng không nên đưa quá nhiều Control lên form, không trang trí kiểu đẩy Font chữ lên quá to trong khi List làm việc và nội dung qua bé làm mất cân đối và chậm load form. Khi cần ta nháy là nó phải lên ngay chứ chậm rề rề thì chán chết.
Đúng rồi, các ô số ,ngày, mã khách hàng mhập trên sheet để tiện hoặc có form riêng. Riêng form Danh sách hàng không nên đưa quá nhiều Control lên form, không trang trí kiểu đẩy Font chữ lên quá to trong khi List làm việc và nội dung qua bé làm mất cân đối và chậm load form. Khi cần ta nháy là nó phải lên ngay chứ chậm rề rề thì chán chết.
Bạn xem mình giản lược đi thế này đã được chưa.
Còn phần Tỉnh - tên khách hàng- Mã khách hàng mình không biết code trên sheet thế nào để tránh phải dùng Name như bạn nói.
Giúp mình với
Bạn Sealand ơi xem hộ mình sai chỗ nào với.
Khi chưa nhập Tên khách hàng với mã KH thì nhấn NHẬP HÀNG ko sao
nhưng khi điền Khách hàng mã hàng vào rồi ân NHẬP hàng là báo lỗi là sao vậy bạn
Giúp mình với