Tổng hợp dữ liệu

Liên hệ QC

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

  • Test.xlsb
    1.3 MB · Đọc: 17
(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

  • TONG HOP SO KHO.xlsm
    4.2 MB · Đọc: 14
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

  • Test.xlsb
    1.2 MB · Đọc: 15
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
Web KT

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

Back
Top Bottom