Tổng hợp dữ liệu (1 người xem)

Liên hệ QC

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

biboylenka1

Thành viên hay hỏi
Tham gia
13/5/21
Bài viết
109
Được thích
97
Giới tính
Nam
Em xin chào anh chị diễn đàn. Em xin nhờ anh chị viết giúp em đoạn code tổng hợp dữ liệu từ sheet "NhapKho" và sheet "XuatKho" sang sheet "SoKho" sau đó lọc lại với thứ tự ngày tháng tăng dần với ạ. Em có mày mò tự record marco để làm nhưng khi chạy thì đơ máy luôn. Em xin cảm ơn!
 

File đính kèm

Dựa theo ý tưởng của ban, mình làm code cùi bắp bạn thử xem sao. code cũng là học mót trên diễn đàn thôi.
 

File đính kèm

Upvote 0
Dựa theo ý tưởng của ban, mình làm code cùi bắp bạn thử xem sao. code cũng là học mót trên diễn đàn thôi.
Cảm ơn bạn đã quan tâm. Thực sự thì mình chưa hiểu code của bạn,mình sẽ mày mò tiếp xem có hiểu được không. Mình chỉ biết record macro rồi sửa lại thôi. Công việc của mình cứ lặp đi lặp lại nên mình đang tìm cách làm đỡ mất thời gian hơn.
 
Upvote 0
Sau vài lần xem file của chủ bài đăng, mình xin có vài ý kiến sau, ngõ hầu tác giả tham khảo:

(1) Theo mình hình như lần nào chạy macro (để đưa DL (dữ liệu) từ 2 trang nhập & xuất sang 'SoKho' đều xóa cũ & chạy mới ngay từ đầu kỳ thì phải;
Chi bằng macro chỉ nên chạy từ đầu tháng hiện hành thôi, được không?
Lúc đó vô đầu chương trình macro chỉ xóa đi những DL đã nhập trước đó từ đầu tháng.
& nếu tháng DL sau 1 tháng là quá nhiều thì lại chia nhỏ chu kỳ tích lũy DL thêm nữa tùy thuộc vô tình hình thực tế sở tại.

(2) Các trang danh mục ít thay đổi; Nếu là mình mình sẽ nhốt chung vô 1 trang; Mà hình như bạn còn trang danh mục nữa; Trang này có nhốt chung thêm nữa hay không là tùy bạn!

(3) Các tiêu đề trường bạn làm đẹp thật; nhưng mình cho là không cần thiết & chỉ tổ làm nặng gánh cho chương trình mà thôi
Các trang dữ liệu này ta càng tránh tiếp xúc càng tốt, mọi cái để các macro làm việc & như vậy chuyện hoa hòe hoa sói kia của bạn trỡ nên thừa
Đó là chưa kể có cột bạn đã tương hẵn hàng vạn công thức thì hỏi chi không lếch bánh khi chạy macro.
Nếu là mình thì mình chọn ưu tiên là tốc độ xử lý DL, nếu còn thừa thì mới tiến hành diêm dúa trong 1 chừng mực nào đó.

Vài lời có thể làm bạn zận, mình xin lỗi trước vì điều đó!
 
Upvote 0
Cảm ơn bạn đã quan tâm. Thực sự thì mình chưa hiểu code của bạn,mình sẽ mày mò tiếp xem có hiểu được không. Mình chỉ biết record macro rồi sửa lại thôi. Công việc của mình cứ lặp đi lặp lại nên mình đang tìm cách làm đỡ mất thời gian hơn.
code sử dụng mảng để tổng hợp. mảng arrN là vùng dữ liệu cần tổng hợp của sh nhập kho, arrX ...., KQ là mảng kết quả trả về. vòng lặp for i= 1 to ubound(arrN) là quét từng dòng của mảng để láy kết quả đưa vào mảng KQ, Qúét hết sh Nhập rồi quét sh X, gán mảng KQ lên sh SOKHO, sau đo sort như bạn đã làm.
nếu thêm ĐK thời gian cần tổng hợp (từ... đến..) thì phải thêm dòng lệnhví dụ : if arrN(i, 3) >= TỪ and arrN(i,3)<=ĐẾN then
bên cạnh đó không nên đặt quá nhiều define name, quá nhiều công thức ở các ô sẽ ảnh hưởng đến tốc độ load file, tốc độ chạy code và làm tăng dung lương file.
 
Upvote 0
Sau vài lần xem file của chủ bài đăng, mình xin có vài ý kiến sau, ngõ hầu tác giả tham khảo:

(1)
Theo mình hình như lần nào chạy macro (để đưa DL (dữ liệu) từ 2 trang nhập & xuất sang 'SoKho' đều xóa cũ & chạy mới ngay từ đầu kỳ thì phải;

Chi bằng macro chỉ nên chạy từ đầu tháng hiện hành thôi, được không?

Lúc đó vô đầu chương trình macro chỉ xóa đi những DL đã nhập trước đó từ đầu tháng.

& nếu tháng DL sau 1 tháng là quá nhiều thì lại chia nhỏ chu kỳ tích lũy DL thêm nữa tùy thuộc vô tình hình thực tế sở tại.

(2) Các trang danh mục ít thay đổi; Nếu là mình mình sẽ nhốt chung vô 1 trang; Mà hình như bạn còn trang danh mục nữa; Trang này có nhốt chung thêm nữa hay không là tùy bạn!

(3) Các tiêu đề trường bạn làm đẹp thật; nhưng mình cho là không cần thiết & chỉ tổ làm nặng gánh cho chương trình mà thôi
Các trang dữ liệu này ta càng tránh tiếp xúc càng tốt, mọi cái để các macro làm việc & như vậy chuyện hoa hòe hoa sói kia của bạn trỡ nên thừa
Đó là chưa kể có cột bạn đã tương hẵn hàng vạn công thức thì hỏi chi không lếch bánh khi chạy macro.
Nếu là mình thì mình chọn ưu tiên là tốc độ xử lý DL, nếu còn thừa thì mới tiến hành diêm dúa trong 1 chừng mực nào đó.

Vài lời có thể làm bạn zận, mình xin lỗi trước vì điều đó!
Em cảm ơn anh đã quan tâm!
(1) Đúng rồi anh ạ, em cũng muốn làm như anh bảo chỉ đưa dữ liệu vào khi mới nhập không can thiệp đến dữ liệu cũ nhưng em mới tìm hiểu về VBA nên không biết cách làm. Trước giờ em đang làm việc thủ công và chỉ biết sử dụng công thức. Các công thức em cũng học mót từ diễn đàn sau đó về ngồi xem nó chạy thế nào rồi làm nháp đi nháp lại nhiều lần sau đó sử dụng.
(2) - Vì em toàn làm thủ công nên em chia ra 2 trang, ý tưởng của em là em sẽ làm cái "data validation" mã hàng và số lo/lot đang còn tồn >0 bên trang "XuatKho". Em cũng muốn thực hiện việc này bằng VBA nhưng trình độ hiện tại của em không làm được. :wallbash:
- Các trang danh mục em đang làm thử nên em vẫn đang để từng trang một cho đỡ rối. Khi chạy thử thấy được rồi em sẽ gom nó về một trang.
(3) - Vấn đề diêm dúa thì không phải mỗi anh mà cũng có một em nhân sự bên công ty em nhận xét rồi. "Cái file excel của anh gì mà lòe loẹt thấy gớm." ^^^^^^^^
- Còn tương hàng vạn công thức trước em làm thế để lúc nhập em chọn cho nhanh. :pinch::pinch:
Em cảm ơn anh đã góp ý! Nếu anh có thời gian rảnh anh có thể góp ý thêm cho em hoặc làm giúp em theo cách mà anh thấy hợp lý để em tham khảo được không ạ.
Bài đã được tự động gộp:

code sử dụng mảng để tổng hợp. mảng arrN là vùng dữ liệu cần tổng hợp của sh nhập kho, arrX ...., KQ là mảng kết quả trả về. vòng lặp for i= 1 to ubound(arrN) là quét từng dòng của mảng để láy kết quả đưa vào mảng KQ, Qúét hết sh Nhập rồi quét sh X, gán mảng KQ lên sh SOKHO, sau đo sort như bạn đã làm.
nếu thêm ĐK thời gian cần tổng hợp (từ... đến..) thì phải thêm dòng lệnhví dụ : if arrN(i, 3) >= TỪ and arrN(i,3)<=ĐẾN then
bên cạnh đó không nên đặt quá nhiều define name, quá nhiều công thức ở các ô sẽ ảnh hưởng đến tốc độ load file, tốc độ chạy code và làm tăng dung lương file.
Cháu cảm ơn chú! Hôm qua cháu lên diễn đàn bằng điện thoại lại không thấy tuổi của chú. cái đoạn này: "if arrN(i, 3) >= TỪ and arrN(i,3)<=ĐẾN then" cháu sẽ thử tự làm thêm. Có gì không hiểu cháu lại hỏi chú tiếp,mong chú giúp đỡ! }}}}}
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn anh đã quan tâm!
(2) Đúng rồi anh ạ, em cũng muốn làm như anh bảo chỉ đưa dữ liệu vào khi mới nhập không can thiệp đến dữ liệu cũ nhưng em mới tìm hiểu về VBA nên không biết cách làm. Trước giờ em đang làm việc thủ công và chỉ biết sử dụng công thức. Các công thức em cũng học mót từ diễn đàn sau đó về ngồi xem nó chạy thế nào rồi làm nháp đi nháp lại nhiều lần sau đó sử dụng.
. . . . . .
(1) - Các trang danh mục em đang làm thử nên em vẫn đang để từng trang một cho đỡ rối. Khi chạy thử thấy được rồi em sẽ gom nó về một trang.
(4) Cháu cảm ơn chú! . . . .
(1) Các trang danh mục ta nên gộp ngay bay giờ; Nếu để sau này gộp sẽ vướng đâu đó trong chương trình
Ví dụ:
STTMã lý doLý doGhi chúMã khoKhoGhi chú
1XKBHXuất bán hàngXuất kho bán hàngKNLKho nguyên liệu
2XKSXXuất cho sản xuấtXuất kho phục vụ mục đích sản xuấtKHCKho hóa chất
3XKTHXuất Trả hàng lạiXuất kho trả hàng cho nhà cung cấpKBBKho bao bì
4XKHUXuất hủy hàng hóaXuất kho hủy hàng hóa không phù hợpKCTKho carton
5XKKKXuất khácCác loại hình xuất kho khácKTPKho thành phẩm
6NKDKNhập tồn đầu kìNhập kho tồn đầu kỳ trước khi sử dụng file
7NKMHNhập mua hàngNhập kho mua hàng
8NKSXNhập từ sản xuấtNhập thành phẩm từ sản xuất
9NKHKNhập hoàn khoNhập kho lại những hàng đã xuất kho nhưng các bộ phận sử dụng không hết yêu cầu hoàn kho
10NKKKNhập khácCác loại hình nhập kho khác

(Cột đầu của mỗi bảng nên cách nhau 26 cột)

(2) Mình sẽ giúp bạn nhập theo chu ký tháng;
Ví dụ bất cứ ngày nào trong tháng 5 mà cho chạy macro thì những dòng nhập hay xuất phát sinh trong tháng nó sẽ xử lý.
Muốn vậy bạn cần nhập thêm cỡ chục dòng gồm nhập & xuất tháng 4 & bằng í dòng tháng 5 & đưa lên lại (Mình nhập cũng được nhưng giả lập của mình sẽ xa thực tế hơn của bạn)

(3) Mình sẽ giúp bạn sau khi có file giả lập mới của bạn

(4) Mình già lắm rồi, nếu chưa muốn nói là nhớn tuổi nhất DĐ, :D
 
Upvote 0
(4) Mình già lắm rồi, nếu chưa muốn nói là nhớn tuổi nhất DĐ, :D
Vì chưa biết tuổi nên xin gọi bằng chú vậy. Cháu khi xưng hô trên mạng khi không biết rõ thường cứ gọi anh xưng em.
Cháu gửi file giả lập theo như chú gợi ý.
Cháu cảm ơn chú đã quan tâm và giúp đỡ nhiệt tình!
 

File đính kèm

Upvote 0
Bước đầu tiên là xóa dữ liệu tháng cần cập nhật ở trang 'SoKho'
Bạn thử chạy macro này vớ 1 trong 3 tháng có trong trang tính đó
PHP:
Sub XoaDuLieuThang()
 Dim dRng As Range, Arr()
 Dim Thang As Integer, Rws As Long, Col As Integer, J As Long
 
 Thang = InputBox(Month(Date), "Ban Cân Xoa Du Lieu Tháng:")
 Sheets("SoKho").Select
 Rws = [B9].CurrentRegion.Rows.Count
 Col = [B9].CurrentRegion.Columns.Count
 Application.ScreenUpdating = False
 For J = 10 To Rws + 10
    If Month(Cells(J, "B").Value) = Thang Then
        If dRng Is Nothing Then
            Set dRng = Rows(J & ":" & J)
        Else
            Set dRng = Union(dRng, Rows(J & ":" & J))
        End If
    End If
 Next J
 MsgBox dRng.Address
 Application.ScreenUpdating = True
End Sub
 
Upvote 0
Sau đó ta tiến thêm 1 bước nữa, như sau:
PHP:
Sub TongHopKhoTheoThang()
 Dim Thang As Integer
 
 Thang = InputBox(Month(Date), "Ban Cân Xoa Du Lieu Tháng:")
 XoaDuLieuThang Thang

End Sub
Mã:
Sub XoaDuLieuThang(Thang As Integer)
 Dim dRng As Range, Arr()
 Dim Rws As Long, Col As Integer, J As Long
 
 Sheets("SoKho").Select
 Rws = [B9].CurrentRegion.Rows.Count
 Col = [B9].CurrentRegion.Columns.Count
 Application.ScreenUpdating = False
 For J = 10 To Rws + 10
    If Month(Cells(J, "B").Value) = Thang Then
        If dRng Is Nothing Then
            Set dRng = Rows(J & ":" & J)
        Else
            Set dRng = Union(dRng, Rows(J & ":" & J))
        End If
    End If
 Next J
 dRng.Delete
 Application.ScreenUpdating = True
End Sub
 
Upvote 0
Sau đó ta tiến thêm 1 bước nữa, như sau:
PHP:
[/QUOTE]
Chú ơi cháu chạy code này thì thấy code chỉ xóa dữ liệu tháng mà cháu nhập vào inputbox không thấy cập nhật lại ạ. Và code chạy lại đơ máy cháu tiếp.
 

File đính kèm

  • Untitled.png
    Untitled.png
    189.3 KB · Đọc: 10
Upvote 0
Từ từ rồi cháo sẽ nhừ!
Tiếp theo là những thứ này:

PHP:
Sub TongHopKhoTheoThang()
 Dim Thang As Integer
 
 Thang = InputBox(Month(Date), "Ban Cân Xoa Du Lieu Tháng:")
 XoaDuLieuThang Thang
 SoLieuNhapTrongThang Thang   'Dòng Lênh Mói

End Sub
Mã:
Sub SoLieuNhapTrongThang(Thg As Integer)   'Maxcro Mói   '
 Dim Rws As Long, W As Integer, J As Long, Col As Integer
 Dim Arr()
 
 With Sheets("NhapKho")
    Rws = .[b2].CurrentRegion.Rows.Count
    Arr() = .[A3].Resize(Rws, 20).Value
    ReDim ArrN(1 To UBound(Arr()), 1 To 20)
    For J = 1 To UBound(Arr())
        If Month(Arr(J, 1)) = Thg Then
            W = W + 1
            For Col = 1 To 20
                ArrN(W, Col) = Arr(J, Col)
            Next Col
        End If
    Next J
 End With
 MsgBox W     'Ban Kiêm Xem Sô Dòng Du Liêu Tháng Da Dúng Chua? Nêu Dúng Sẽ Tiêp   '
End Sub
 
Upvote 0
Chụp cái hình như vậy thì mình chịu, chả thấy mô tê mần răng!
Chí ít phải lôi cái hộp thoại thông báo lỗi qua 1 bên.
 
Upvote 0
Chuyện còn lại của macro đó là:
(*) Tìm dòng cuối của cột 'B (trang 'SoKho')'; Cộng thêm 1
(*) Chép dữ liệu trong mảng vừa tìm ra lên trang đó

Hai dòng lệnh này nhường cho bạn thử sức trong 6 tiếng!
& chúc bạn sớm thành công!
 
Upvote 0
Chuyện còn lại của macro đó là:
(*) Tìm dòng cuối của cột 'B (trang 'SoKho')'; Cộng thêm 1
(*) Chép dữ liệu trong mảng vừa tìm ra lên trang đó

Hai dòng lệnh này nhường cho bạn thử sức trong 6 tiếng!
& chúc bạn sớm thành công!
Cháu thử làm nhưng không thấy phần ghi chú được chép sang, chú sửa cho cháu với.
 

File đính kèm

Upvote 0
(1) Câu lệnh của bạn:
Mã:
wssokho.Range("B" & LrS).Resize(W, 18).Value = ArrN
có nghĩa là bạn chép dữ liệu vô các cột 'B' (2) mở rọng đến 18 cột (có nghĩa là cột 19 thôi mà)
Bạn thử tăng lên 19 hay 20 xem sao!
(2) Chúc mừng bạn
& mình nghĩ thời gian còn lại trong ngày hôm nay bạn sẽ viết được macro để lấy dữ liệu từ trang 'XuatKho' sang nữa.
& Xin chúc mừng trước.

(3) Còn sáng mai thử tìm cách gộp 2 macro lấy dữ liệu tháng này làm 1 xem sao;
Ví dụ
PHP:
Sub SoLieuNXTrongThang(Thg As Integer, Optional TenKho As SDtring = "N")
  Dim Sh As Worksheet
 If TenKho ="N" Then
    Set Sh = Sheets("NhapKho")
 ElseIf TenKho ="X" Then  'Mói Thêm  '
        Set Sh = Sheets("Xuat-Kho")
 Else
     MsgBox "Xéo Ngay!", ,"GPE.COM"
End if
'. . . . .     '
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
(1) Câu lệnh của bạn:
Mã:
wssokho.Range("B" & LrS).Resize(W, 18).Value = ArrN
có nghĩa là bạn chép dữ liệu vô các cột 'B' (2) mở rọng đến 18 cột (có nghĩa là cột 19 thôi mà)
Bạn thử tăng lên 19 hay 20 xem sao!
Cháu thử rồi nhưng sau khi chạy macro thì nó lại điền trường quy cách ở nhập kho sang ghi chú ở sổ kho.
(2) (3) Cháu sẽ thử sức.
 
Upvote 0
(1) Cháu thử rồi nhưng sau khi chạy macro thì nó lại điền trường quy cách ở nhập kho sang ghi chú ở sổ kho.
(2) (3) Cháu sẽ thử sức.
(1) Nếu trình tự các trường (cột) trong 3 trang tính là như nhau thì chuyện chép sang là đơn giản;
Nếu phải bỏ không chép 1 trường nào đó hay thay đổi trật tự thì phức tạp hơn & không thể hoàn toàn xài vòng lặp trong chuyện chép dữ liệu vô mảng được.
(2) & (3) Nhất định bạn làm được Nếu vướng thì GPE.COM sẽ giúp bạn!
 
Upvote 0
[ĐỀ BÀI TẬP CUỐI CÙNG]: Tăng tốc macro xóa dữ liệu của tháng cần tổng hợp.

Tại bài thứ 9, chúng ta đã có phương thức xóa dữ liệu 1 tháng cần tổng hợp;
Macro này có thể cải tiến bằng vài cách khác như đưa vô mảng để xử lý; Bạn chủ bài đăng thử sức xem sao, lúc rỗi!

Chúc sớm thành công!
 
Lần chỉnh sửa cuối:
Upvote 0
[ĐỀ BÀI TẬP CUỐI CÙNG]: Tăng tốc macro xóa dữ liệu của tháng cần tổng hợp.

Tại bài thứ 9, chúng ta đã có phương thức xóa dữ liệu 1 tháng cần tổng hợp;
Macro này có thể cải tiến bằng vài cách khác như đưa vô mảng để xử lý; Bạn chủ bài đăng thử sức xem sao, lúc rỗi!

Chúc sớm thành công!
Cháu cảm ơn chú. Mấy hôm nay cháu không xem lại được. Cháu sẽ thử sức khi rỗi.
 
Upvote 0
Mã:
Sub TONGHOP()
Dim wsnhap, wsxuat, wssokho As Worksheet
Dim lrwsnhap, lrwsxuat, lrwssokho As Integer
Dim Tungay, Denngay As Long
Dim i&, j&, k&
Set wsnhap = Sheets("NhapKho")
Set wsxuat = Sheets("XuatKho")
Set wssokho = Sheets("SoKho")
Dim ArrN(), ArrX(), ArrKQ()

    Application.ScreenUpdating = False
    'mo khoa sheet
    'wssokho.Unprotect "5202419"
    'xoa du lieu so kho
    wssokho.Range("B10:T20000").ClearContents
    'Dieu kien tong hop tu ngay den ngay
    Tungay = wssokho.Range("D6").Value
    Denngay = wssokho.Range("E6").Value
    'tim dong cuoi nhap xuat kho
    lrwsnhap = wsnhap.Range("A" & Rows.Count).End(xlUp).Row
    lrwsxuat = wsxuat.Range("A" & Rows.Count).End(xlUp).Row
   
    ArrN = wsnhap.Range("A3:W" & lrwsnhap).Value2
    ArrX = wsxuat.Range("A3:S" & lrwsxuat).Value2
    ReDim ArrKQ(1 To UBound(ArrN) + UBound(ArrX), 1 To 23)
   
    For i = 1 To UBound(ArrN)
    If ArrN(i, 1) >= Tungay And ArrN(i, 1) <= Denngay Then
       ArrKQ(i, 1) = i
         For j = 1 To 18
            ArrKQ(i, j) = ArrN(i, j)
         Next j
            ArrKQ(i, 19) = ArrN(i, 23)
    End If
    Next i
    For k = 1 To UBound(ArrX)
    If ArrX(k, 1) >= Tungay And ArrX(k, 1) <= Denngay Then
         For j = 1 To 19
            ArrKQ(i - 1 + k, j) = ArrX(k, j)
         Next j
    End If
    Next k
 
    wssokho.Range("B10").Resize(UBound(ArrN) + UBound(ArrX), 19) = ArrKQ
   
    wssokho.Range("B10").Sort Key1:=wssokho.Columns("B"), Order1:=xlAscending, Header:=xlGuess
   
    Application.ScreenUpdating = True
    'khoa sheet
    'wssokho.Protect "5202419"

End Sub

Cháu có sửa lại code của chú HUONGLIEN6577 ở bài #2 như chú HUONGLIEN6577 gợi ý thêm ở bài #5. Nhưng nếu 2 ô ("D6") và ("E6")trong sheet sổ kho trống thì không ra kết quả.
Bây giờ cháu muốn nếu như 2 ô này trống thì cái biến "Tungay" là ngày đầu tiên nhập dữ liệu vào file và "Denngay" là ngày hôm nay thì làm thế nào ạ?
Chú HUONGLIEN6577 và chú SA_DQ nếu rảnh thì chỉ cho cháu với ạ.
 
Upvote 0
Bây giờ cháu muốn nếu như 2 ô này trống thì cái biến "Tungay" là ngày đầu tiên nhập dữ liệu vào file và "Denngay" là ngày hôm nay thì làm thế nào ạ?
Nếu muốn có trị của TuNgay thì phải cất công đi tìm thôi;
Nới tìm: Ở trang 'NhapKho' nếu là bình thường, hay cả ở 'XuatKho' nếu là thất thường
Cách tìm thô thiển nhất là
1./ Tìm cột chứa dữ liệu ngày ở 2 trang nhập & cả xuất kho
2./ Xài hàm Min() trong Excel để tìm ngày đầu tiên trong kì sổ sách
Tìm ra thì ấn trị vô tham biến TuNgay
(Tương tự cho tham biến DenNgay)
 
Upvote 0

Cháu có sửa lại code của chú HUONGLIEN6577 ở bài #2 như chú HUONGLIEN6577 gợi ý thêm ở bài #5. Nhưng nếu 2 ô ("D6") và ("E6")trong sheet sổ kho trống thì không ra kết quả.
Bây giờ cháu muốn nếu như 2 ô này trống thì cái biến "Tungay" là ngày đầu tiên nhập dữ liệu vào file và "Denngay" là ngày hôm nay thì làm thế nào ạ?
Chú HUONGLIEN6577 và chú SA_DQ nếu rảnh thì chỉ cho cháu với ạ.
của bạn đây, hy vọng là đúng ý .
Bài đã được tự động gộp:

Nếu muốn có trị của TuNgay thì phải cất công đi tìm thôi;
Nới tìm: Ở trang 'NhapKho' nếu là bình thường, hay cả ở 'XuatKho' nếu là thất thường
Cách tìm thô thiển nhất là
1./ Tìm cột chứa dữ liệu ngày ở 2 trang nhập & cả xuất kho
2./ Xài hàm Min() trong Excel để tìm ngày đầu tiên trong kì sổ sách
Tìm ra thì ấn trị vô tham biến TuNgay
(Tương tự cho tham biến DenNgay)
Tôi lấy ngày đầu tiền của sh nhập kho và so sánh ngày cuối cùng của SH nhập và Sh Xuất, ngày nào cũ hơn thì lấy vào biến Dengay.
 

File đính kèm

Upvote 0
Tôi (1) lấy ngày đầu tiền của sh nhập kho và so sánh ngày cuối cùng của SH nhập và Sh Xuất, (2) ngày nào cũ hơn thì lấy vào biến Dengay.
(1) Nếu kho này mới thành lập (hay khánh thành) thì bạn làm vậy là đúng;
Nhưng . . . nhưng hàng năm đều có kiểm kho thì sau đó không chắc là nhập hàng trước xuất hàng đó nha.;
(2) Bạn định nghĩa giúp thế nào là ngày cũ hơn; Ví dụ ngày 30/4 & ngày 1/5 cùng năm thì ngày nào cũ hơn?

& chúc vui nha!
 
Upvote 0
(1) Nếu kho này mới thành lập (hay khánh thành) thì bạn làm vậy là đúng;
Nhưng . . . nhưng hàng năm đều có kiểm kho thì sau đó không chắc là nhập hàng trước xuất hàng đó nha.;
(2) Bạn định nghĩa giúp thế nào là ngày cũ hơn; Ví dụ ngày 30/4 & ngày 1/5 cùng năm thì ngày nào cũ hơn?

& chúc vui nha!
Tôi cũng đã nghĩ lại, đúng là làm theo bài này thì code chạy ok,
Ngày nhập liệu có thể là xuất kho dài dài rồi khi đó mới có nhập kho (như ý anh nói) thì code cũng giải quyết không ổn. Có lẽ khi ấy phải do tìm trong cả sh N và sh X để tìm ra ngày đầu tiên (từ...) và tim ra ngày mới hơn (đến ngày...), như vậy phải viết lại đoạn code: If wssokho.range("D6")=empty then......... . không biết tôi ngĩ vậy có đúng không?
(2)Tôi nhầm "ngày mới hơn" chứ không phải là "ngày cũ hơn". ngày mói hơn vói nghia là ngày cuối cùng có phat sinh ( Nhập hoặc xuất).
Cảm ơn anh đã chỉ bảo, chúc anh vui khỏe và có nhiều cống hiến
 
Upvote 0
(1) Nếu kho này mới thành lập (hay khánh thành) thì bạn làm vậy là đúng;
Nhưng . . . nhưng hàng năm đều có kiểm kho thì sau đó không chắc là nhập hàng trước xuất hàng đó nha.;
(2) Bạn định nghĩa giúp thế nào là ngày cũ hơn; Ví dụ ngày 30/4 & ngày 1/5 cùng năm thì ngày nào cũ hơn?

& chúc vui nha!
Tôi cũng đã nghĩ lại, đúng là làm theo bài này thì code chạy ok,
Ngày nhập liệu có thể là xuất kho dài dài rồi khi đó mới có nhập kho (như ý anh nói) thì code cũng giải quyết không ổn. Có lẽ khi ấy phải do tìm trong cả sh N và sh X để tìm ra ngày đầu tiên (từ...) và tim ra ngày mới hơn (đến ngày...), như vậy phải viết lại đoạn code: If wssokho.range("D6")=empty then......... . không biết tôi ngĩ vậy có đúng không?
(2)Tôi nhầm "ngày mới hơn" chứ không phải là "ngày cũ hơn". ngày mói hơn vói nghia là ngày cuối cùng có phat sinh ( Nhập hoặc xuất).
Cảm ơn anh đã chỉ bảo, chúc anh vui khỏe và có nhiều cống hiến
Cháu cảm ơn 2 chú! Cháu cũng không nghĩ đến cái này. Ý tưởng của cháu chỉ là nếu 2 ô Từ ngày,Đến ngày trống thì điền ngày đầu tiên sử dụng file từ sheet "Thongtin" và từ ngày và điền ngày hiện tại vào ô đến ngày.
 
Upvote 0
. . . . Ý tưởng của cháu chỉ là nếu 2 ô Từ ngày,Đến ngày trống thì điền ngày đầu tiên sử dụng file từ sheet "Thongtin" và từ ngày và điền ngày hiện tại vào ô đến ngày.
Thường thì hàng năm các kho phải tiến hành kiểm kê. Lượng hàng hóa (HH) sau kiểm kê sẽ phải ghi vào 1 cột nào đó ở trang 'DanhMuc' HH với tiêu đề có thể là ngày hay năm (kiểm kê)
Vậy trường hợp để trống ngày bắt đầu & ngày kết thúc thì:
a./ Ngày BD phải dò tìm bên 'DanhMuc' HH để tìm lượng tồn kho trước kỳ; Số liệu tồn này làm cơ sở để tính toán cho kỳ phát sinh
b./ Ngày cuối mà bị để trống thì lấy ngày hiện hành (là lẽ đương nhiên)
. . . . .
 
Upvote 0
Thường thì hàng năm các kho phải tiến hành kiểm kê. Lượng hàng hóa (HH) sau kiểm kê sẽ phải ghi vào 1 cột nào đó ở trang 'DanhMuc' HH với tiêu đề có thể là ngày hay năm (kiểm kê)
Cháu cũng ghi như chú đang bảo nhưng chỉ ghi số lượng với batch lúc cần lấy ngày sản xuất với hạn sử dụng ra để báo cáo cháu lại phải tìm ở file cũ.
 
Upvote 0
Như là mình thì sẽ là vầy:

SttMã hàngTên nguyên vật liệuLoạiĐơn vị tínhNăm 19Năm 20
1234567
110110001Quả cam tươiNguyên liệu tươiKg-12
213100002Pallet gỗ 1m2 x 1m2Vật tưCái11930
313100003Pallet gỗ 1m x 1m2Vật tưCái12048
413100004Pallet nhựa 1m2 x 1m2Vật tưCái1866
513100005Rổ nhựa HA - 009Vật tưCái59784
611110006Hoá chất NaOH 32%Hóa chấtKg2,790102
711110007Hoá chất HNO3 68%Hóa chấtKg1,575120
812100008Túi Aseptic Golglio 2.5LBao bìCái20513
912100009Túi Aseptic Golglio 220LBao bìCái777156
1012100010Túi Aseptic Golglio 20LBao bìCái6,360174
1112100011Thùng phuy nắp mở, đai sắt 220LBao bìCái2560
1212100012Thùng phuy nắp mở, 200LBao bìCái204210
1311110013Muối công nghiệp NaCL 99%Hóa chấtKg-228
 
Upvote 0
Mã:
Sub Tonghopthekho()
Dim wssokho, wsthekho, wsthongtin As Worksheet
Dim lrwsokho As Integer
Dim Tungay, Denngay As Long
Dim i&
Set wssokho = Sheets("SoKho")
Set wsthekho = Sheets("TheKho")
Set wsthongtin = Sheets("ThongTin")
Dim ArrS(), ArrKQ()

    Application.ScreenUpdating = False
    
    wsthekho.Range("A15:H10000").ClearContents
    
    If wsthekho.Range("B6") = Empty Then
        wsthekho.Range("B6") = wsthongtin.Range("C12").Value
    End If
    If wsthekho.Range("B7") = Empty Then
        wsthekho.Range("B7") = Date
    End If
    
    Tungay = wsthekho.Range("B6").Value
    Denngay = wsthekho.Range("B7").Value
    
    Mahang = wsthekho.Range("B9").Value
    'Tim dong cuoi so kho
    lrwsokho = wssokho.Range("B" & Rows.Count).End(xlUp).Row
    
    ArrS = wssokho.Range("B10:T" & lrwsokho).Value
    ReDim ArrKQ(1 To UBound(ArrS), 1 To 5)
    
    For i = 1 To UBound(ArrS)
        If ArrS(i, 1) >= Tungay And ArrS(i, 1) <= Denngay And ArrS(i, 7) = Mahang Then
            k = k + 1
            ArrKQ(k, 1) = ArrS(i, 1)
            ArrKQ(k, 2) = ArrS(i, 3)
            ArrKQ(k, 3) = ArrS(i, 6)
        If Left(ArrS(k, 3), 2) = "PN" Then
            ArrKQ(k, 4) = ArrS(i, 12)
            ArrKQ(k, 5) = ""
        Else
            ArrKQ(k, 4) = ""
            ArrKQ(k, 5) = ArrS(i, 12)
        End If
        End If
    Next i
    
    wsthekho.Range("B15").Resize(UBound(ArrS), 5) = ArrKQ
    Application.ScreenUpdating = True
    
End Sub

Chú SA_DQ ơi, cháu đang làm cái thẻ kho nhưng mà code cháu viết nó ra kết quả không như ý muốn, chú xem giúp cháu cái code cháu viết nó sai ở đâu với. Phần số lượng nhập xuất ở bên thẻ kho đang sai.
 

File đính kèm

Upvote 0
Chú SA_DQ ơi, cháu đang làm cái thẻ kho nhưng mà code cháu viết nó ra kết quả không như ý muốn, chú xem giúp cháu cái code cháu viết nó sai ở đâu với. Phần số lượng nhập xuất ở bên thẻ kho đang sai.
Xin lỗi anh SA_DQ, tôi mạn phép anh làm bài này nhé. Cũng không dám " đánh trống qua cửa nhà sấm" hay "cầm đèn chay trước ô tô" đâu. Mong anh thứ lỗi
Bạn đang tín nhiệm Anh SA_DQ. nhưng hãy thử code mà tôi đã sửa lại xem sao. đã sửa và thêm phần tự động điền số thứ tự, và lũy kế tồn kho theo từng ngày

Sub Tonghopthekho()
Dim wssokho, wsthekho As Worksheet
Dim lrwsokho As Integer
Dim Tungay, Denngay As Long
Dim i&
Set wssokho = Sheets("SoKho")
Set wsthekho = Sheets("TheKho")
Dim ArrS(), ArrKQ()

Application.ScreenUpdating = False

wsthekho.Range("A15:H10000").ClearContents

If wsthekho.Range("B6") = Empty Then
wsthekho.Range("B6") = wsthongtin.Range("C12").Value
End If
If wsthekho.Range("B7") = Empty Then
wsthekho.Range("B7") = Date
End If

Tungay = wsthekho.Range("B6").Value
Denngay = wsthekho.Range("B7").Value

Mahang = wsthekho.Range("B9").Value
'Tim dong cuoi so kho
lrwsokho = wssokho.Range("B" & Rows.Count).End(xlUp).Row

ArrS = wssokho.Range("B10:T" & lrwsokho).Value
ReDim ArrKQ(1 To UBound(ArrS), 1 To 7)

For i = 1 To UBound(ArrS)
DK = Left(ArrS(i, 3), 2)
If ArrS(i, 1) >= Tungay And ArrS(i, 1) <= Denngay And ArrS(i, 7) = Mahang Then
k = k + 1
ArrKQ(k, 1) = k
ArrKQ(k, 2) = ArrS(i, 1)
ArrKQ(k, 3) = ArrS(i, 3)
ArrKQ(k, 4) = ArrS(i, 6)
If DK = "PN" Then
ArrKQ(k, 5) = ArrS(i, 12)
TN = TN + ArrS(i, 12)
ArrKQ(k, 7) = TN - TX
Else
ArrKQ(k, 6) = ArrS(i, 12)
TX = TX + ArrS(i, 12)
ArrKQ(k, 7) = TN - TX
End If
End If
Next i

wsthekho.Range("A15").Resize(UBound(ArrS), 7) = ArrKQ
Application.ScreenUpdating = True
MsgBox "XONG"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lí ra bạn phải tìm ra chỗ sai của mình; & mình không tìm ra chỗ sai của bạn đâu nha;
Bạn thử nhập NgayDau & NgayCuoi cách nhau 1 hai ngày để tìm ra chỗ sai.
PHP:
Sub TongHopTheKho()
 Dim wSSoKho As Worksheet, wSTheKho As Worksheet
 Dim i&, lRwSoKho As Integer, TuNgay As Date, DenNgay As Date    '   **  '
 Dim ArrS()

 Set wSSoKho = Sheets("SoKho")
 Set wSTheKho = Sheets("TheKho")
 Application.ScreenUpdating = False
 wSTheKho.Range("A15:H10000").ClearContents ''
 If wSTheKho.Range("B6") = Empty Then
    wSTheKho.Range("B6") = Sheets("ThongTin").Range("C12").Value
 End If
 If wSTheKho.Range("B7") = Empty Then
    wSTheKho.Range("B7") = Date
 End If
 TuNgay = wSTheKho.Range("B6").Value
 DenNgay = wSTheKho.Range("B7").Value
 MaHang = wSTheKho.Range("B9").Value
'Tìm Dòng Cuói So Kho   '
 lRwSoKho = wSSoKho.Range("B" & Rows.Count).End(xlUp).Row
 ArrS = wSSoKho.Range("B10:T" & lRwSoKho).Value
 ReDim ArrKQ(1 To UBound(ArrS), 1 To 5)
 For i = 1 To UBound(ArrS)
    If ArrS(i, 1) >= TuNgay And ArrS(i, 1) <= DenNgay And ArrS(i, 7) = MaHang Then
        k = k + 1
        ArrKQ(k, 1) = ArrS(i, 1):               ArrKQ(k, 2) = ArrS(i, 3)
        ArrKQ(k, 3) = ArrS(i, 6)
        If Left(ArrS(k, 3), 2) = "PN" Then
            ArrKQ(k, 4) = ArrS(i, 12):          ArrKQ(k, 5) = ""
        Else
            ArrKQ(k, 4) = "":                   ArrKQ(k, 5) = ArrS(i, 12)
        End If
    End If
 Next i
 wSTheKho.Range("B15").Resize(UBound(ArrS), 5) = ArrKQ
 Application.ScreenUpdating = True
End Sub

& mình cho rằng thẻ kho của 1 mặt hàng là phải ghi từ ngày đầu cho đến ngày hiện hành.
 
Upvote 0
Xin lỗi anh SA_DQ, tôi mạn phép anh làm bài này nhé. Cũng không dám " đánh trống qua cửa nhà sấm" hay "cầm đèn chay trước ô tô" đâu. Mong anh thứ lỗi
Bạn đang tín nhiệm Anh SA_DQ. nhưng hãy thử code mà tôi đã sửa lại xem sao. đã sửa và thêm phần tự động điền số thứ tự, và lũy kế tồn kho theo từng ngày
Dạ không phải đâu ạ. mà tại cháu thấy chú SA_DQ rất nhiệt tình trả lười bài của cháu mặc dù cháu hỏi những câu rất buồn cười. Cháu cảm ơn chú nhiều. code đãn đúng với mong muốn của cháu.
Bài đã được tự động gộp:

Lí ra bạn phải tìm ra chỗ sai của mình; & mình không tìm ra chỗ sai của bạn đâu nha;
Bạn thử nhập NgayDau & NgayCuoi cách nhau 1 hai ngày để tìm ra chỗ sai.
Dạ vì cháu không có căn bản,cháu học bằng cách lúc rảnh cứ lên diễn đàn học mót nên cháu chưa tìm ra được chỗ sai.
& mình cho rằng thẻ kho của 1 mặt hàng là phải ghi từ ngày đầu cho đến ngày hiện hành.
Cháu làm thẻ kho này chỉ để so với thẻ cháu ghi tay bên ngoài theo tháng.
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom