Nhờ mọi người giúp đỡ về tính tổng hợp định mức theo đặt hàng.

Liên hệ QC
Tham gia
31/3/21
Bài viết
12
Được thích
0
Chào mọi người,mình có một file dữ liệu bao gồm đơn hàng và định mức nguyên liệu sử dụng theo đơn hàng ,bạn nào biết giúp mình tính toán tổng hợp định mức nguyên liệu sử dụng theo ngày với.
Xin cảm ơn
 

File đính kèm

  • Tinh toan theo dinh muc.xlsx
    237.3 KB · Đọc: 38
Thế thì bạn đặt ngày đầu tại C2 5/7 để làm gì, dẫn đến code chạy không đúng?
Mình thường cắt/xóa bớt các ngày quá khứ đi khi không cần thiết nữa,form của mình sẽ liên tục 31 cột các ngày liền nhau nếu xóa 5 ngày quá khứ thì sẽ phải thêm 5 ngày phía sau, dù gì đi nữa nếu dữ liệu lấy chuẩn theo ngày khi cột ngày ở vị trí nào đi nữa thì luôn có cảm giác yên tâm hơn khi không phải kiểm tra lại ngày tháng phải không bạn.
 
Upvote 0
Mình thường cắt/xóa bớt các ngày quá khứ đi khi không cần thiết nữa,form của mình sẽ liên tục 31 cột các ngày liền nhau nếu xóa 5 ngày quá khứ thì sẽ phải thêm 5 ngày phía sau, dù gì đi nữa nếu dữ liệu lấy chuẩn theo ngày khi cột ngày ở vị trí nào đi nữa thì luôn có cảm giác yên tâm hơn khi không phải kiểm tra lại ngày tháng phải không bạn.
OT thấy code của Thầy @Ba Tê viết rất tối ưu nên chỉnh lại một chút trong đoạn từ "With Sheets("TONGHOP") đến End With", bạn thử đảo lộn các ngày của sheet "TONGHOP" xem được không ạ?

Mã:
    '....
    With Sheets("TONGHOP")
        sArr = .Range("A2", .Range("A2").End(xlDown)).Value

        '~~~~~~~~~~~~~~~~~~~~~~~~~~~ thêm đoạn này
        Dim Ngay(), iDate As Date
        Ngay = .Range("C1", .Range("C1").End(xlToRight)).Value
        J = UBound(Ngay, 2)
        For I = 1 To J
            iDate = Ngay(1, I)
            If Not Dic.Exists(iDate) Then
                Dic.Add iDate, I
            End If
        Next I
        '~~~~~~~~~~~~~~~~~~~~~~~~~~~ kết thúc thêm
        
        R2 = UBound(sArr)
        ReDim KQ(1 To R2, 1 To 31)
        For I = 1 To R2
            Dic.Item(sArr(I, 1)) = I
        Next I
        '---------------------------------------
        For I = 1 To R
            For J = 4 To MaxCol Step 2
                If Dic.Exists(dArr(I, J)) Then
                    '~~~~~~~~~~~~~~~~~~~~~~~~~~~ thêm + sửa đoạn này
                    iDate = dArr(I, 1)
                    Col = Dic(iDate) 'Day(dArr(I, 1))
                    '~~~~~~~~~~~~~~~~~~~~~~~~~~~ kết thúc thêm
                    Rws = Dic.Item(dArr(I, J))
                    KQ(Rws, Col) = KQ(Rws, Col) + dArr(I, 3) * dArr(I, J + 1)
                End If
            Next J
        Next I
        .Range("C2").Resize(R2, 31) = KQ
    End With
   ' ...
 
Upvote 0

File đính kèm

  • Tinh toan theo dinh muc (2).rar
    136.5 KB · Đọc: 12
Upvote 0
Upvote 0
Mình xin hỏi xíu @Chủ bài đăng: Sao CQ bạn lại có mã mẹ & mã con vậy?
Mình mường tượng là Mã mẹ như NC002 (nước chấm) gồm mã các con như đường 5Kg; ớt 100gr, bột nêm 150 gr
& NC001 gồm đường 4Kg, tỏi 150 gr & gừng 200gr. . . .
Phải vậy không bạn?

Hay trong xây dựng có bê tông mác 150, 250, 300,. . . . (gồm lượng nước, xi măng & đá, cát khác nhau(?)
 
Upvote 0
Upvote 0
Đây là macro để biến cấu trúc 'DM_A' giống cấu trúc 'DM_B' (để cho ai thích tham khảo):

PHP:
Sub GopBang()
 Dim J As Long, Cot As Integer, W As Integer, Hg As Byte
 Dim Arr(), Ma As String
 
 With Sheets("DM_A")
    Arr() = [B3].CurrentRegion.Offset(3).Value
    ReDim aKQ(1 To UBound(Arr()), 1 To 17)
    [E2].Resize(UBound(Arr()), 17).Value = aKQ()
    For J = 1 To UBound(Arr())
        If Arr(J, 1) <> Ma Then
            W = W + 1:              Hg = 1
            For Cot = 1 To 3
                aKQ(W, Cot) = Arr(J, Cot)
            Next Cot
            Ma = Arr(J, 1)
        Else
            Hg = Hg + 1
            For Cot = 2 * Hg To 2 * Hg + 1
                aKQ(W, Cot) = Arr(J, IIf(Cot = 2 * Hg, 2, 3))
            Next Cot
        End If
    Next J
 End With
 [E2].Resize(W, 17).Value = aKQ()
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là macro để biến cấu trúc 'DM_A' giống cấu trúc 'DM_B' (để cho ai thích tham khảo):

PHP:
Sub GopBang()
 Dim J As Long, Cot As Integer, W As Integer, Hg As Byte
 Dim Arr(), Ma As String
 
 With Sheets("DM_A")
    Arr() = [B3].CurrentRegion.Offset(3).Value
    ReDim aKQ(1 To UBound(Arr()), 1 To 17)
    [E2].Resize(UBound(Arr()), 9).Value = aKQ()
    For J = 1 To UBound(Arr())
        If Arr(J, 1) <> Ma Then
            W = W + 1:              Hg = 1
            For Cot = 1 To 3
                aKQ(W, Cot) = Arr(J, Cot)
            Next Cot
            Ma = Arr(J, 1)
        Else
            Hg = Hg + 1
            For Cot = 2 * Hg To 2 * Hg + 1
                aKQ(W, Cot) = Arr(J, IIf(Cot = 2 * Hg, 2, 3))
            Next Cot
        End If
    Next J
 End With
 [E2].Resize(W, 17).Value = aKQ()
End Sub
Bác SA ơi, con thấy chuyển 'DM_B' giống cấu trúc 'DM_A' thì mới ra dáng CSDL hơn ạ.
Bởi vì theo 'DM_B' không kiểm soát được số cột nguyên liệu, nếu có 5 loại nguyên liệu thì lại thêm cột,còn 'DM_A' thì nhìn chuẩn chỉnh, liên tục, mẫu cố định tạo cảm giac logic hơn.
 
Upvote 0
Thì cũng phải nhường ai đó hay ngay chính bạn thử viết chứ nhỉ, Ăn 1 mình đau tức, làm 1 mình cực thân mà!
$$$$@
 
Upvote 0
Thì cũng phải nhường ai đó hay ngay chính bạn thử viết chứ nhỉ, Ăn 1 mình đau tức, làm 1 mình cực thân mà!
$$$$@
Nếu có vấn đề gì, Bác góp ý thêm cho con ạ:
Mã:
Option Explicit

Sub chuyenForm_B_to_A()
    Dim data(), res(), i As Long, j As Long, k As Long, sMaMe As String, sMaCon As String, dinhmuc As Double
    With ThisWorkbook.Worksheets("DM_B")
        i = .Cells(.Rows.Count, "A").End(xlUp).Row
        If i > 2 Then data = .Range("A3:G" & i).Value Else Exit Sub
        ReDim res(1 To UBound(data, 1), 1 To 3)
        For i = LBound(data, 1) To UBound(data, 1)
            If Not TypeName(data(i, 1)) Like "Error*" Then
                For j = 2 To UBound(data, 2) - 1 Step 2
                    sMaMe = data(i, 1): sMaCon = data(i, j): dinhmuc = data(i, j + 1)
                    If Len(sMaCon) > 0 Then
                        k = k + 1
                        res(k, 1) = sMaMe
                        res(k, 2) = sMaCon
                        res(k, 3) = dinhmuc
                    End If
                Next j
            End If
        Next i
    End With
    With ThisWorkbook.Worksheets("DM_A")
        i = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
        If k > 0 Then .Cells(i, 1).Resize(k, 3).Value = res
    End With
End Sub
 
Upvote 0
Góp ý cho bạn ư, từ tổng thể đến cá thể nha:

A: Ở trang 'DM_B' mình trích ra 1 số dòng dữ liệu (DL) (có đánh số ở cột phải nhất) như sau:

Nguyên liệu 2Nguyên liệu 3Nguyên liệu 4
Mã mẹMã conĐịnh mức cần cho mã conMã conĐịnh mức cần cho mã conMã conĐịnh mức cần cho mã con(Dòng DL)
AS02814AS005551AS0052050
AS02813AS005561AS0052050
AS02812AS005551AS0052050
AS02811AS0052025
6​
AS02810AS0052025
AS02809AS006251AS0052050
AS02808AS0052050
9​
AS02807AS005561AS0052050
AS02806AS006160.5
AS02805AS006161
AS02804AS005201
AS02803AS005551AS0052025
AS02802AS005561AS0052025
AS01948AS005151AS00292100
890​
AS01947AS0029225
891​
AS01946AS005202AS0029250
892​
AS01945AS006192AS0073725
893​
AS02801
AS02800
AS02799
AS02798
AS02797
AS02796
AS02795
AS02794
AS02793
AS02792
AS02791
AS02790

Nhòm vô bảng trích này ta thấy gì, có phải:

1./ Có rất nhiều dòng DL chỉ có mã mẹ, không có mã con;
Ta phải tìm hiểu ở trang 'TongHop' xem thử các mã mẽ này có hay không trong cột mã; Nếu nó không có trong 'TongHop' thì ta xử lý ( ngõ hầu nhằm cải biến) nó là vô ích
1.1./ Nhân đây ta cũng cần kiểm lại trang 'DM_A' xem có cần kiện toàn (bỏ bớt hay vô hiệu hóa) những dòng 'thừa' này không (ngõ hầu cải thiện tốc độ xử DL)

2./ Vì mã mẹ không có (cột) khối lượng nên thực ra phải hỏi lại chủ bài đăng là CQ bạn í chắc đang zởn chơi trong chuyện xây dựng bộ mã như vậy;
[Thông thường theo mình hiểu thì:
Muốn đổ bê tông móng băng cần (giả dụ) 5.4 tấn vữa mác 200 ;
Nhưng đổ bê tông (làm) đường thì cần 13 tấn mác 300
Có như vậy ta có thể mới tổng hợp được khối lượng xi măng, đá mi, cát & chi tiết hơn nữa là nước (ví dụ đổ bê tông dựng cột 500KV trên núi) là bao nhiêu

B. (Phần khó chịu nè)

Cần lưu ý thêm về tên các tham biến
1./ Nếu chỉ dùng 1 ký tự thì nên cố gắng xài các kí tự J, Z, W, J. Điều này ngõ hầu bàn phím vi tính của bạn hư đều các phím hơn chăng!
(Nâng cao tuổi thọ bàn phím!)
1.1./ Nếu xài 1 ký tự thì nên xài chữ in như trên, Nhằm tận dụng trình biên dịch kiểm soát dùm ta lỗi chính tả thô thiển không đán
2./ Tham biến 'dinhmuc' (cũng như mục 1.1 đã nêu) nên khai báo là 'DinhMuc'; Nhưng khi nhập trên bàn phím ta chỉ nhập 'dinhmuc' là vẹn đôi đường rồi;
. . . . . (tạm thời là vậy!)

Chúc các bạn vui khỏe trãi qua đợt ôn dịch này!
 
Upvote 0
Mã:
Option Explicit

Sub chuyenForm_B_to_A()
    Dim data(), res(), i As Long, j As Long, k As Long, sMaMe As String, sMaCon As String, dinhmuc As Double
    With ThisWorkbook.Worksheets("DM_B")
        ...
End Sub

Nếu trường hợp 1 mã SP (mã mẹ) gồm 10 mã Nguyên Vật Liệu (mã con) để làm ra, thì cái Sheet [DM_B] có biến động số cột rồi. Có SP cần 3, 4 NVL, có Sp cần 9,10 NVL --> code hiện tại chưa tính tới vụ này.
Nhâp dữ liệu theo kiểu sheet [DM_A] là chuẩn nhất. Bảng dữ liệu không bị biến động số cột.
 
Lần chỉnh sửa cuối:
Upvote 0
Góp ý cho bạn ư, từ tổng thể đến cá thể nha:

A: Ở trang 'DM_B' mình trích ra 1 số dòng dữ liệu (DL) (có đánh số ở cột phải nhất) như sau:

Nguyên liệu 2Nguyên liệu 3Nguyên liệu 4
Mã mẹMã conĐịnh mức cần cho mã conMã conĐịnh mức cần cho mã conMã conĐịnh mức cần cho mã con(Dòng DL)
AS02814AS005551AS0052050
AS02813AS005561AS0052050
AS02812AS005551AS0052050
AS02811AS0052025
6​
AS02810AS0052025
AS02809AS006251AS0052050
AS02808AS0052050
9​
AS02807AS005561AS0052050
AS02806AS006160.5
AS02805AS006161
AS02804AS005201
AS02803AS005551AS0052025
AS02802AS005561AS0052025
AS01948AS005151AS00292100
890​
AS01947AS0029225
891​
AS01946AS005202AS0029250
892​
AS01945AS006192AS0073725
893​
AS02801
AS02800
AS02799
AS02798
AS02797
AS02796
AS02795
AS02794
AS02793
AS02792
AS02791
AS02790

Nhòm vô bảng trích này ta thấy gì, có phải:

1./ Có rất nhiều dòng DL chỉ có mã mẹ, không có mã con;
Ta phải tìm hiểu ở trang 'TongHop' xem thử các mã mẽ này có hay không trong cột mã; Nếu nó không có trong 'TongHop' thì ta xử lý ( ngõ hầu nhằm cải biến) nó là vô ích
1.1./ Nhân đây ta cũng cần kiểm lại trang 'DM_A' xem có cần kiện toàn (bỏ bớt hay vô hiệu hóa) những dòng 'thừa' này không (ngõ hầu cải thiện tốc độ xử DL)

2./ Vì mã mẹ không có (cột) khối lượng nên thực ra phải hỏi lại chủ bài đăng là CQ bạn í chắc đang zởn chơi trong chuyện xây dựng bộ mã như vậy;
[Thông thường theo mình hiểu thì:
Muốn đổ bê tông móng băng cần (giả dụ) 5.4 tấn vữa mác 200 ;
Nhưng đổ bê tông (làm) đường thì cần 13 tấn mác 300
Có như vậy ta có thể mới tổng hợp được khối lượng xi măng, đá mi, cát & chi tiết hơn nữa là nước (ví dụ đổ bê tông dựng cột 500KV trên núi) là bao nhiêu

B. (Phần khó chịu nè)

Cần lưu ý thêm về tên các tham biến
1./ Nếu chỉ dùng 1 ký tự thì nên cố gắng xài các kí tự J, Z, W, J. Điều này ngõ hầu bàn phím vi tính của bạn hư đều các phím hơn chăng!
(Nâng cao tuổi thọ bàn phím!)
1.1./ Nếu xài 1 ký tự thì nên xài chữ in như trên, Nhằm tận dụng trình biên dịch kiểm soát dùm ta lỗi chính tả thô thiển không đán
2./ Tham biến 'dinhmuc' (cũng như mục 1.1 đã nêu) nên khai báo là 'DinhMuc'; Nhưng khi nhập trên bàn phím ta chỉ nhập 'dinhmuc' là vẹn đôi đường rồi;
. . . . . (tạm thời là vậy!)

Chúc các bạn vui khỏe trãi qua đợt ôn dịch này!
Cảm ơn Bác Sa đã góp ý, Bác ơi con chưa hiểu các số mà Bác đánh trong cột (Dòng DL) có ý nghĩa gì, con kiểm tra thấy dữ liệu vẫn chuyển sang sheet "DM_A" bình thường ạ ạ.

Nếu trường hợp 1 mã SP (mã mẹ) gồm 10 mã Nguyên Vật Liệu (mã con) để làm ra, thì cái Sheet [DM_B] có biến động số cột rồi. Có SP cần 3, 4 NVL, có Sp cần 9,10 NVL --> code hiện tại chưa tính tới vụ này.
Nhâp dữ liệu theo kiểu sheet [DM_A] là chuẩn nhất. Bảng dữ liệu không bị biến động số cột.
Xin chào anh @ongke0711 :D , dạ cảm ơn đã ủng hộ và đồng quan điểm với OT ạ.
 
Upvote 0
. . . . ., Bác ơi con chưa hiểu các số mà Bác đánh trong cột (Dòng DL) có ý nghĩa gì, con kiểm tra thấy dữ liệu vẫn chuyển sang sheet "DM_A" bình thường ạ ạ.
Ý mình là ở trang 'DM_B' này có 126 dòng không có số lượng định mức; & như vậy việc xử lý các dòng này (để tạo bảng với thiết kế mới) là vô nghĩa.
Thà bỏ chúng đi cho đỡ tốn điện.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom