Hoàn thiện giúp code phiếu hàng

Liên hệ QC

hphuc0210

Thành viên chính thức
Tham gia
30/3/10
Bài viết
77
Được thích
18
Em có 1 phiếu bán hàng nhưng chỉ làm được 1 vài chi tiết nhỏ còn các chi tiết lớn thì chưa làm được post lên đây xin nhờ các anh chi giúp đỡ,mọi thắc mắc em ghi trong file đính kèm rất mong được các anh chi giúp đỡ.Xin cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Em thấy có 9 lần tải nhưng chưa có anh chi nào góp ý giúp em,không biết là vấn đề của em khó giải quyết hay là em lập luân chưa rõ ràng làm các anh chi khó hiểu nên không giúp được.Có gì các anh chị góp ý giúp em để em chỉnh lại,xin cảm ơn
 
Upvote 0
Từ, từ khoai mới nhừ

Công việc viết phiếu là : Khi khách hàng mua loại nào thì đánh SL của loại đó vào cột SL sau đó chọn giá bán,nếu chọn giá tự do thì phải đánh tay thên cột CK,còn nếu chọn Gia 1 hoặc Giá 2,3,4 thì cột CK sẽ tự lấy CK ở shDanhMucHH(),sau khi đánh SL xong . . . .

Mình thì đề xuất trong file đính kèm 1 quy trình hơn ngược chút:

(*) Chọn nút chiét khấu trước (Nếu không CK thì nhập vào ô CK% & giá bán tương ứng trước khi nhập 'SL'

Vì khi nhập 'SL' macro sự kiện sẽ tự động điền các thông tin còn trống trên hàng vừa nhập 'SL'

Xem thêm trong file nha & quan trọng là không được nôn nóng!
 

File đính kèm

Upvote 0
Cảm ơn HYEN17,em không nôn nóng được giúp đỡ sớm hay muộn mà chỉ sợ là em trình bài vấn đề không đúng nghĩa gây khó khăn cho các anh chị muôn giúp thôi

Trở lại file đính kèm của HYEN17 em thấy cái phần giá nó không linh động HYEN ơi,lỡ như trong quá trình em viết phiếu em muốn đổi từ giá 1 sang giá 2 thì em phải đánh lại SL từ đầu chứ phần CK nó không tự chuyển đổi theo HYEN xem lại giúp.

Thứ 2 là ở phần giá tự do em muốn là nếu em chọn giá tự do thì công việc đánh thêm của em là "đánh thêm cột CK" chứ không đánh thêm cột giá bán,cột giá bán em muốn lúc nào cũng là = meenhgiamahang-ckmahang
 
Upvote 0
Trở lại file đính kèm của HYEN17 em thấy cái phần giá nó không linh động HYEN ơi,lỡ như trong quá trình em viết phiếu em muốn đổi từ giá 1 sang giá 2 thì em phải đánh lại SL từ đầu chứ phần CK nó không tự chuyển đổi theo HYEN xem lại giúp.

Đằng nào cũng có cái fiền fức của nó

File này thì khi nhập record sau, nhưng nếu trùng chiết khấu với record trước thì lại fải nhấp lên nút nào đó, rồi quay lại mức chiết khấu cho nó;

(Hay bạn nên làm thêm 1 nút nữa như là 1 cõi hư vô zậy, kha, kha,. . . )
 

File đính kèm

Upvote 0
HYEN ơi em thấy code ở bài viết #3 tương đối hơn bài #5,ở bài #5 này khi em nháy chuột ở dòng nào thì nó mới sữa CK ở dòng đó và ở những dòng k có SL mà em nháy chuột nó cũng hiện ra tên hàng hoá luôn nữa thật là nhứt cái đầu lâu thật,em có tìm hiểu 1 số bài viết trong diễn đàn em thấy có 1 bài viết tương đối giống bài của em nhưng em không hiểu code nên không làm theo được em chỉ đường link tới anh chi tham khoả nha

http://www.giaiphapexcel.com/forum/showthread.php?2253-Mong-c%C3%A1c-b%E1%BA%A1n-g%C3%B3p-%C3%BD-cho-ph%E1%BA%A7n-m%E1%BB%81m-nho-nh%E1%BB%8F_QLBH-c%E1%BB%A7a-t%C3%B4i-nh%C3%A9!

file ở bài #2

Thêm nữa là số phiếu em chưa thấy nó tự động tăng HYEN xem giúp

Xin chân thành cảm ơn HYEN,cảm ơn GPE
 
Lần chỉnh sửa cuối:
Upvote 0
(1) Em thấy code ở bài viết #3 tương đối hơn bài #5,ở bài #5 này khi em nháy chuột ở dòng nào thì nó mới sữa CK ở dòng đó và ở những dòng k có SL mà em nháy chuột nó cũng hiện ra tên hàng hoá luôn nữa thật là nhứt cái đầu lâu thật,

(2)
Thêm nữa là số phiếu em chưa thấy nó tự động tăng ; Xin chân thành cảm ơn GPE
(1) Thực ra code ở #3 không đúng thực tế; Vì trong 1 loạt các mặt hàng nhập khác nhau của 1 hóa đơn, không fải chúng cùng 1 cách chiết khấu.

Còn tại #5, thì đang còn khó xài; Hãy tự xóa bằng tay, khi lỡ tay tấy máy chuột lung tung trên trang tính. Chúng ta sẽ hoàn thiện tiếp

(2) Bạn thay macro cũ bắng cái ni:

PHP:
Private Sub CommandButton2_Click() 'Tao Moi'
 Dim VTr As Byte, SoHD As String, Num As Integer
 Union([B10:B58], [D10:F58]).Value = ""
 
 VTr = InStr([g5].Value, "/")
 SoHD = Mid([g5].Value, 3, VTr - 3)
 Num = CInt(SoHD)
 [g5].Value = "PX" & Right("000" & CStr(Num + 1), 4) & "/" & CStr(Year(Date) Mod 100)
End Sub
 
Upvote 0
Cảm ơn ChanhTQ@ ý em là muốn nó tăng dựa vào số phiếu ở CSDL ấy,vì theo code này mỗi lần em tạo mới là nó sẽ tăng lên 1 như vậy CSDL của em sẽ không chính xác và em sẽ không theo dõi được số HD của em đã xuất
 
Upvote 0
? ? ?

Ý em là muốn nó tăng dựa vào số phiếu ở CSDL ấy,vì theo code này. . .

Nhưng tại trang CSDL của bạn trống trơn thị ta dựa vào hư không à bạn?
 
Upvote 0
Nhưng tại trang CSDL của bạn trống trơn thị ta dựa vào hư không à bạn?

Dạ không phải,ý em nói là :Trường hợp là trong lúc em đang viết phiếu nếu khách hàng đổi ý hoặc em viết sai em muốn tạo mới lại hóa đơn,khi ấy em bấm button tạo mới cho nhanh nhưng theo code của ChanhTQ thì khi em tạo mới nó lại nhảy lên 1 số nữa rồi như vậy CSDL của em bị nhảy lên 1 số HD mất,do đó em muốn là nếu CSDL của em nếu chưa có phiếu nào thì nó sẽ là PX0001/10 còn nếu đã có PX0001/10 rồi thì phiếu kế tiếp sẽ là PX0002/10 chứ không thể là PX0004 hoặc 5 hoặc là trùng lại PX0001/10 được ạ
 
Upvote 0
À, mình hiểu rồi!

Và đây là macro mới của bạn:

PHP:
Private Sub CommandButton2_Click() 'Tao Moi'
 Dim SoHD As String, Num As Integer
 Dim Sh As Worksheet, Rng As Range, Cls As Range
 
 Union([B10:B58], [D10:F58]).Value = ""
 
 Set Sh = Sheets("CSDL")
 Set Rng = Sh.Range(Sh.[c2], Sh.[c65500].End(xlUp))
 For Each Cls In Rng
   If Cls.Value > SoHD Then SoHD = Cls.Value
 Next Cls
 If Right(SoHD, 2) < CStr(Year(Date) Mod 100) Then
   [G5].Value = "PX0001/" & CStr(Year(Date) Mod 100)
 Else
   SoHD = Mid(SoHD, 3, 4):          Num = CInt(SoHD) + 1
   [G5].Value = "PX" & Right("000" & CStr(Num), 4) & "/" & CStr(Year(Date) Mod 100)
 End If
End Sub

Lưu í nhỏ: Số hóa đơn trong năm không vượt quá 9999 số.


Góp 1 ý nhỏ với bạn về cấu trúc trang 'CSDL'

Nếu hóa đơn có nhiều mặt hàng thì CSDL của trang tính sẽ trùng lắp nhiều ở 4 trường đầu (không kể [STT]).
Cũng có nhiều người tách trang này thành 2 bảng (Table) ; Table đầu gồm 5 trường đầu; Table sau gồm các trường còn lại & có thêm trường [SoFieu] để giữ mối quan hệ giữa 2 tables này.

Bạn xem xét & quyết định điều này sớm đi nha.
 
Upvote 0
Góp 1 ý nhỏ với bạn về cấu trúc trang 'CSDL'

Nếu hóa đơn có nhiều mặt hàng thì CSDL của trang tính sẽ trùng lắp nhiều ở 4 trường đầu (không kể [STT]).
Cũng có nhiều người tách trang này thành 2 bảng (Table) ; Table đầu gồm 5 trường đầu; Table sau gồm các trường còn lại & có thêm trường [SoFieu] để giữ mối quan hệ giữa 2 tables này.

Bạn xem xét & quyết định điều này sớm đi nha.

Xin gởi lời cảm ơn chân thành đến HYEN,vì sự nhiệt tình và sự quan tâm sâu sắc của HYEN đến topic này.

Thật sự em chỉ biết cơ bản về excel mà thôi,do đó em không biết được thế nào là sự thuận tiện cũng như sự chuyên nghiệp trong cách bố trí CSDL,HYEN xem giúp làm như thế nào là tốt nhất thì xin chỉnh sữa và chỉ giúp,em vô cùng biết ơn.Thật ra em làm CSDL là vì em muốn làm thêm phần Báo Cáo về NXT (xem mặt hàng này đã bán được bao nhiêu cái trong tháng) và Danh Thu theo HD (tháng này đã bán được bao nhiêu tiền sỉ) nhưng vì chưa biết làm CSDL cũng như cách lấy Dữ Liệu như thế nào nên em không có tạo thêm shBAOCAO trong file của em mà thôi.Rất mong nhận được sự giúp đỡ của diễn đàn cũng như của HYEN

Xin chân thành cảm ơn
 
Upvote 0
Bạn xem thử file đính kèm nha

& hãy cho biết bạn cần báo cáo như thế nào? (Đưa nội dung iêu cầu của trang Report lên đi)

Sẽ có 1 vài người giúp bạn, chắc vậy!

Lưu í 1 điều nữa, là nếu khách hàng nhiều, ta nên gán cho họ mỗi người 1 mã khác nhau!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cảm ơn HYEN,phần số phiếu rất hay khi có thêm phần kiểm tra và thông báo lỗi em rất ưng ý điều đó rất cảm ơn HYEN(nếu có thể HYEN cho xin thêm phần kiểm tra trước khi Tạo Mới nếu HD chưa được Lưu thì hỏi có Lưu hay không).Phần Report em có gắng nghỉ ra để viết lên cho các anh chị giúp,phần mã khách hàng thì em có khoảng 200 KH,em đã thêm MaKH HYEN xem coi có phải như vậy k?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xin mời bạn thử nha:

PHP:
Private Sub CommandButton2_Click()                       'Tao Moi'
 Dim SoHD As String, Num As Integer, XinHoi As Byte      '<=|'
 Dim Sh As Worksheet, Rng As Range, Cls As Range
 
 Set Sh = Sheets("CSDL")
 Set Rng = Sh.Range(Sh.[c2], Sh.[c65500].End(xlUp))
1 If Rng.Find([G5].Value, , xlFormulas, xlWhole) Is Nothing Then
   XinHoi = MsgBox("Ban Khong Càn Luu Du Lieu?", 33, "Ban Chua Luu Vào CSDL")
   If XinHoi > 1 Then Exit Sub
2 End If

 Union([B10:B58], [D10:F58]).Value = "":        [G5].Interior.ColorIndex = 35

 For Each Cls In Rng
   If Cls.Value > SoHD Then SoHD = Cls.Value
 Next Cls
 If Right(SoHD, 2) < CStr(Year(Date) Mod 100) Then
   [G5].Value = "PX0001/" & CStr(Year(Date) Mod 100)
 Else
   SoHD = Mid(SoHD, 3, 4):          Num = CInt(SoHD) + 1
   [G5].Value = "PX" & Right("000" & CStr(Num), 4) & "/" & CStr(Year(Date) Mod 100)
 End If
End Sub


Còn 1 vấn đề nữa mình muốn đề xuất với bạn. Đó là rút gọn chu trình nhập dữ liệu vô 'CSDL':

Chúng ta đồng thời nhập dữ liệu vô 2 tables; Table đầu ta chỉ fải nhập 1 dòng duy nhất cho 1 hóa đơn;
Nhưng trong macro hiện có, chúng ta fải nhập vô đây nhiều lần, bằng với số dòng có trong chi tiết hàng của hóa đơn.
Thường trong thực tế, 1 khách hàng hãn hữu mua 1 mặt hàng, mà nhiều mặt hàng khác nhau (trong 1 hóa đơn)
Vậy nên ta cải biến macro nhập liệu đã có thêm chút xíu nũa, như sau:

PHP:
Private Sub CommandButton3_Click()              ' Luu'
 Dim Sh As Worksheet, Cls As Range, Rng As Range
 Dim Rws As Long, DaGhi As Boolean              '<=|'
  
 Set Sh = Sheets("CSDL"):           Rws = Sh.[B65500].End(xlUp).Offset(1).Row
 Set Cls = Sh.Range(Sh.[c1], Sh.[c65500].End(xlUp))
 If Not Cls.Find([G5].Value, , xlFormulas, xlWhole) Is Nothing Then
   MsgBox "Da Nhap Ròi, Ban Oi", , "GPE Xin Luu Ý":      Exit Sub
 End If
 For Each Cls In Range("B10:B58")
   If Cls.Value <> "" Then
      If DaGhi = False Then                     '<=|'
7         With Sh.Cells(Rws, "B")
            .Value = [C7].Value:                DaGhi = True
            .Offset(, 3).Value = "G Chu"
            .Offset(, 1).Value = [G5].Value
            .Offset(, 2).Value = [G7].Value
         End With
      End If                                    '<=|'
8      With Sh.[G65500].End(xlUp).Offset(1)
         .Value = [G5].Value   'Só Hoá Don'
         .Offset(, 1).Resize(, 5).Value = Cls.Resize(, 5).Value
      End With
   End If
 Next Cls
 With [G7].Interior
   If .ColorIndex = 35 Then .ColorIndex = 38 Else .ColorIndex = 35
 End With
End Sub

Chúc thành công.
 
Upvote 0
Thật là quí giá và vui mừng khi thấy code mỗi ngày được hoàn thiện,không biết làm gì hơn ngoài nói lời cảm ơn.Cảm ơn HYEN,cảm ơn ChanhTQ,cảm ơn diễn đàn GPE đã tạo điều kiện cho tôi được giúp đỡ.

Còn về phần lấy giá bán(rất quan trọng)rất mong nhận được sự đóng góp và chỉ dạy thêm từ mọi người,em rất mong chờ những bài viết kế tiếp.

Xin cảm ơn
 
Upvote 0
Thật là quí giá và vui mừng khi thấy code mỗi ngày được hoàn thiện,không biết làm gì hơn ngoài nói lời cảm ơn diễn đàn GPE, đã tạo điều kiện cho tôi được giúp đỡ.
Còn về phần lấy giá bán(rất quan trọng)rất mong nhận được sự đóng góp và chỉ dạy thêm từ mọi người,em rất mong chờ những bài viết kế tiếp.
Xin cảm ơn
Để cải tiến tiếp, chúng ta cần biêt số mã hàng của cơ sở bạn đang kinh doanh.

Nếu dười 50 thì ta đang ứng xử như hiện nay là tạm chấp nhận; Nhưng nếu từ 100 trở lên thì ta fải có những ứng xử khác hơn chút đĩnh mới tốt.

Vậy bạn hãy cho biết hiện nay cũng như trong tương lai sẽ khoảng bao nhiêu mặt hàng.


Góp thêm í nhỏ: Mã khách hàng như bạn đang làm là còn fí fạm 1 chữ cái trong mã. Thường các mã này ta hay người nhập liệu ít khi nhìn thấy nó. Bỡi vậy toàn các mã là "KHxxx' thì cũng như "@xxx" hay "Gxxx" mà thôi
Nhưng khi cần truy xuất thì tốc độ sẽ cải thiện lên 10 lần đó nha.
Cần nói thêm rằng, với mã như vậy, bạn vẫn ngủ ngon khi số khách hàng tăng gần 30.000 người như thường. (Thậm chí cho đến gần 8 vạn #h hàng cũng OK)
 
Upvote 0
Để cải tiến tiếp, chúng ta cần biêt số mã hàng của cơ sở bạn đang kinh doanh.

Nếu dười 50 thì ta đang ứng xử như hiện nay là tạm chấp nhận; Nhưng nếu từ 100 trở lên thì ta fải có những ứng xử khác hơn chút đĩnh mới tốt.

Vậy bạn hãy cho biết hiện nay cũng như trong tương lai sẽ khoảng bao nhiêu mặt hàng.


Góp thêm í nhỏ: Mã khách hàng như bạn đang làm là còn fí fạm 1 chữ cái trong mã. Thường các mã này ta hay người nhập liệu ít khi nhìn thấy nó. Bỡi vậy toàn các mã là "KHxxx' thì cũng như "@xxx" hay "Gxxx" mà thôi
Nhưng khi cần truy xuất thì tốc độ sẽ cải thiện lên 10 lần đó nha.
Cần nói thêm rằng, với mã như vậy, bạn vẫn ngủ ngon khi số khách hàng tăng gần 30.000 người như thường. (Thậm chí cho đến gần 8 vạn #h hàng cũng OK)

Báo cáo hiện giờ cơ sở em đang kinh doanh có tất cả là 49 mặt hàng trong đó có 38 mã hàng luôn luôn cố định còn lại 11 mặt hàng có thể sẽ thay đổi(thay đổi là nó sẽ không ra nữa mà thay bằng 1 mặt hàng khác gần giống ấy nên em không liệt kê nó vào phần nào đây) và tương lai chắc có thể lên khoản 60 mặt hàng

Về phần mã khách hàng,hi nếu đặt theo dạng @xxx nó truy xuất nhanh hơn thì em xin làm vậy,thật tình em không biết mình đang làm 1 vấn đề chuyên nghiệp đến thế,nên mọi vấn đề nhờ HYEN chỉ dạy thêm (thật sự em vô cùng biết ơn)
 
Upvote 0
Fần lấy giá bán, . . .

Còn về phần lấy giá bán(rất quan trọng)rất mong nhận được sự đóng góp và chỉ dạy thêm từ mọi người,em rất mong chờ những bài viết kế tiếp.

Đây chưa hẵn là là cải tiến, nhưng mấy cái nút radio đó ta có thể đưa hết thành 1 ô nào đó có Validation; Lúc đó ta chỉ bấm trỏ chuột tại 1 ô thôi; Khỏi fải di chuyển, tránh mau hư chuột!

Còn nếu muốn nhập hết 1 lượt toàn bộ các mặt hàng trong hóa đơn xong mới lọc như macro đầu tiên của topic thì cũng được. Bằng cách ta thêm 1 cột để lựa chiệt khấu cho từng mật hàng khác nhau.
Như vậy sau khi ta nhập số lượng & chiết khầu cho mặt hàng bằng với mệnh giá (CK (chiết khậu) =0 ), & nhập tiếp chiết khầu của các mặt hàng có chiết khấu, ta cho chạy macro lọc. Nhưng lúc này, macro lọc sẽ fải bổ sung thông tin cần thiết từ trang 'HHoa' sang cho đủ đầy, rồi mới lọc.

Các việc này còn tùy thuộc vô thói quen nghề nghiệp của bạn.

Sẵn lòng hỗ trợ tiếp, nếu bạn thầy cần.

Chúc vui!
 
Upvote 0
Đây chưa hẵn là là cải tiến, nhưng mấy cái nút radio đó ta có thể đưa hết thành 1 ô nào đó có Validation; Lúc đó ta chỉ bấm trỏ chuột tại 1 ô thôi; Khỏi fải di chuyển, tránh mau hư chuột!

Hi ChanhTQ nói chuyện cũng vui quá nhỉ,em không sợ hư chuột đâu.Thật ra vấn đề của em không phải là radio hay là Validation cái nào em cũng sử dụng được hết chẳn qua em dùng radio vì nhìn rõ ràng hơn,trực quan hơn thôi.

Sở dĩ em làm thêm mấy cái radio để tự điền giá bán là vì các anh chị biết không?

Hằng ngày em phải tiếp và bán gần 100 đến 150 người khách đến mua hàng nên công việc của em rất là bận,trước kia khi em chưa áp dụng excel vào buôn bán thì em phải viết tay hàng trăm cái HD bán lẻ(mua ngoài chợ)mỗi ngày,nào là viết tên khách hàng,nào là viết tên hàng,nào là viết SL,nào là viết CK,nào là viết Giá bán,nào là bấm máy tính để ra thành tiền sau cùng cộng lại ôi thôi nó mất rất nhiều công và thời gian.Nhưng công việc lại đòi hỏi sự nhanh và chính xác vì sai 1 phát là mất nhiều tiền lắm,và dạo trước em có vào GPE nhờ các anh chi giúp tạo 1 file HD để tính toán cho nhanh lúc đó em được anh ndu giúp đỡ tạo được file HD và hiện giờ em vẫn còn dùng file đó.Nhưng qua thời gian sử dụng em thấy file HD trước đây làm còn nhiều điều thiếu sót nên hôm nay em cãi tiến thêm chút,file HD trước đây khi em viết HD là em phải đánh Số HD+Tên KH+SL+CK cũng hơi tốn nhiều thời gian và vẫn còn sai sót VD:em có MaHH A20 CK 6.5% giá bán 18,7,MaHH B20 CK 50% giá bán 10,lúc em lập HD em đã đánh nhầm CK A20 CK 50%,như vậy là em đã bị lỗ :(, nếu may mắn gặp người tốt thì người ta tính lại còn gặp người xấu thì họ đi luôn.Do đó hôm nay em muốn excel tự điền CK và cho dù em xuất sai MaHH thì cũng không sai CK.

Đó là sự trăn trở của em,do đó em rất mong các anh chi GPE giúp em,em chân thành cảm ơn
 
Upvote 0
Web KT

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

Back
Top Bottom