[Giúp đỡ] Tổng hợp vật liệu, nhân công, máy thi công tư bảng PTVT (1 người xem)

Liên hệ QC

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

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
725
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Em đang làm file dự toán, vướng mắc mới tổng hợp được vật liệu từ bảng PTVT. Do nhu cầu cần tổng hợp ật liệu, nhân công, máy thi công tư bảng PTVT mà trình độ không đủ
Mong anh chị giúp đỡ sửa code để hoàn thiện file là việc, cám ơn anh chị

Mã:
Sub TongVatTu()

    
Application.ScreenUpdating = False
Sheets("THVT").Select
'Loc lay vat tu
    Dim N As Long, m As Long
    m = Sheets("THVT").Range("C65000").End(xlUp).Row
    If m > 9 Then
        Sheets("THVT").Select
        Rows("10:" & m + 1).Select
        Selection.Delete Shift:=xlUp
    End If
    'Gan n la dong cuoi cung co du lieu cua cot I (Cot Tong KL) Sheets("PTVT")
    N = Sheets("PTVT").Range("I65000").End(xlUp).Row
    For I = 7 To N
        If Sheets("PTVT").Cells(I, 5) <> "công" And Sheets("PTVT").Cells(I, 5) <> "ca" And Sheets("PTVT").Cells(I, 5) <> "%" Then
            m = Sheets("THVT").Range("C65000").End(xlUp).Row
            DVT = Sheets("PTVT").Cells(I, 5)
            If Sheets("PTVT").Cells(I, 7) <> 0 Then
                Sheets("THVT").Cells(m + 1, 2) = Sheets("PTVT").Cells(I, 4)
                Sheets("THVT").Cells(m + 1, 3) = DVT
                Sheets("THVT").Cells(m + 1, 9) = "=COUNTIF(R10C2:RC2,RC[-7])" ' Cot I cua Sheet THVT
            End If
        End If
    Next
  
'Xoa Vat tu trung va sort theo ten vat tu
    m = Sheets("THVT").Range("I65000").End(xlUp).Row
    For I = m To 10 Step -1
        Sheets("THVT").Cells(I, 9).Select
        If Sheets("THVT").Cells(I, 9) > 1 Then
           Selection.EntireRow.Delete
        End If
    Next
    m = Sheets("THVT").Range("C65000").End(xlUp).Row
    Range("B10:C" & m).Select
    Selection.Sort Key1:=Range("B10"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

'Lay tong so luong vat tu va tien cua tung vat tu
    N = Sheets("PTVT").Range("I65000").End(xlUp).Row
    m = Sheets("THVT").Range("C65000").End(xlUp).Row
    Columns("I:I").Select
    Selection.ClearContents
    For I = 10 To m
        Sheets("THVT").Cells(I, 1) = I - 9     'So TT

        Sheets("THVT").Cells(I, 4) = "=SUMIF('PTVT'!R7C4:R" & N & "C4,RC[-2],'PTVT'!R7C8:R" & N & "C8)"
        Sheets("THVT").Cells(I, 4).Select
        Selection.NumberFormat = "#,##0.000"
        Sheets("THVT").Cells(I, 5) = "=VLOOKUP(RC[-3],'Vat_Lieu'!R4C3:R1500C6,3,0)"
        Sheets("THVT").Cells(I, 5).Select
        Selection.NumberFormat = "#,##0.000"
        Sheets("THVT").Cells(I, 6) = "=VLOOKUP(RC[-4],'Vat_Lieu'!R4C3:R1500C6,4,0)"
        Sheets("THVT").Cells(I, 6).Select
        Selection.NumberFormat = "#,##0.000"
        Sheets("THVT").Cells(I, 7) = "=ROUND(RC[-2]*RC[-3],0)"
        Sheets("THVT").Cells(I, 7).Select
        Selection.NumberFormat = "#,##0.000"
        Sheets("THVT").Cells(I, 8) = "=ROUND(RC[-4]*RC[-2],0)"
        Sheets("THVT").Cells(I, 8).Select
        Selection.NumberFormat = "#,##0.000"
    Next
    
'Trang tri bang va tính tong tien vat tu
    m = Sheets("THVT").Range("F65000").End(xlUp).Row
    Range("A10:H" & m).Select
    With Selection
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
    End With
    
    Range("G" & m + 1).Select
    ActiveCell.FormulaR1C1 = "=SUM(R10C7:R" & m & "C7)"
    Selection.NumberFormat = "#,##0.000"
    Range("H" & m + 1).Select
    ActiveCell.FormulaR1C1 = "=SUM(R10C8:R" & m & "C8)"
    Selection.NumberFormat = "#,##0.000"
    
    'ActiveWorkbook.Names.Add "CL_VLieu", "=SUM(R10C8:R" & m & "C8)-SUM(R10C7:R" & m & "C7)"
    'Dat Name tinh Chenh lech vat lieu giua gia thong bao va dinh muc
    Application.Names.Add Name:="CL_VLieu", RefersTo:="=SUM(R10C8:R" & m & "C8)-SUM(R10C7:R" & m & "C7)"
    
    Range("A" & m + 1).Select
    ActiveCell.FormulaR1C1 = "."
    Range("B" & m + 1).Select
    ActiveCell.FormulaR1C1 = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG:"
    
    Range("A" & m + 1 & ":H" & m + 1).Select
    Selection.Font.FontStyle = "Bold"
    
    With Selection
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
    End With
    
    Application.ScreenUpdating = True
    'Dat vung in
    ActiveSheet.PageSetup.PrintArea = "$A$" & 1 & ":$H$" & m + 5
End Sub
 

File đính kèm

Giải pháp
Nhờ anh chị giúp đỡ, sửa phần code trên với ạ. Cám ơn anh chị nhiều
Bạn thử Code này xem thử
PHP:
Public Sub TonghopVT()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr()
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, R As Long
    Dim Ma As String, eRw As Long, Id As Long, Ic As Long, It As Long
    Dim RngVL As Range, RngMay As Range
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("Vat_lieu")
    Set RngVL = .Range("C4", .Range("C65535").End(3)).Resize(, 4)
    Set RngMay = .Range("I4", .Range("I65535").End(3)).Resize(, 4)
End With
With Sheets("PTVT")
    sArr = .Range("C4:C" & .Range("D65535").End(xlUp).Row).Resize(, 9).Value
    tArr...
Bài này nên làm theo hướng sau:
1. Dùng filter lọc vật liệu, nhân công, máy. Copy sang 1 sheet, dùng remove duplicates để lọc vật tư duy nhất, sort a-z để sắp xếp tên vật tư (cái này ko chuẩn 100% đâu nha).
2. Viết 1 hàm tổng quát để tính khối lượng vật tư=khối lượng hạng mục * định mức. Sử dụng kỹ năng filter đặt hàm cho nhanh.
Bài này mà dùng code thì rất hạn chế khi dữ liệu thay đổi, mỗi lần thay đổi phải chạy lại code, mất công.
Có mấy topic liên quan đến vấn đề này rồi đó bạn!
 
Upvote 0
Bảng dữ liệu PTVT của bạn có hơn vạn dòng; Nếu chạy vòng lặp cũng mỏi mệt ấy nhỉ?
Trong trang liệt kê có mã Vật tư, nhưng ở trang 'PTVT' lại không ghi mã của vật tư là sao?
Thông thường làm việc với mã (duy nhất) này sẽ tránh sai sót & nhanh hơn nhiều so với làm việc với tên VT
Vấn đề là mã VT này cần thiết chế 1 cách hết sức khoa học.
Mà hình như ở trang 'THVT' bạn không chỉ fải tổng hợp chỉ là vật tư, mà còn là công xá & mày thi công; Thêm nữa, fải tổng hợp theo trình tự 3 hạng mục này.

Mình cho rằng bạn cần nhập hết mã từ trang danh mục vố trang 'PTVT' mới được/nên tiếp tục công tác thống kê gì khác;
Nhưng khi đó bảng danh mục cần có đủ mã VT cho hết các loại VT của bạn.

Xin chào!
 
Upvote 0
Em đang làm file dự toán, vướng mắc mới tổng hợp được vật liệu từ bảng PTVT. Do nhu cầu cần tổng hợp ật liệu, nhân công, máy thi công tư bảng PTVT mà trình độ không đủ
Mong anh chị giúp đỡ sửa code để hoàn thiện file là việc, cám ơn anh chị
Bạn chạy thử Code này xem
PHP:
Public Sub TonghopVT()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr()
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, R As Long
    Dim Ma As String, eRw As Long, Id As Long, Ic As Long
    Dim RngVL As Range, RngMay As Range
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("Vat_lieu")
    Set RngVL = .Range("C4", .Range("C65535").End(3)).Resize(, 4)
    Set RngMay = .Range("I4", .Range("I65535").End(3)).Resize(, 4)
End With
With Sheets("PTVT")
    sArr = .Range("C4:C" & .Range("D65535").End(3).Row).Resize(, 9).Value
    tArr = .[N3:P3].Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
With Sheets("THVT")
    With .Range("A10:H5000")
        .ClearContents
        .Interior.ColorIndex = 0
        .Borders.LineStyle = 0
        .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0
        LaMa = LaMa + 1
        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64)
        dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 9).Resize(, 8).Interior.ColorIndex = 20
        .Range("A" & K + 9).Resize(, 8).Font.Bold = True
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 3) = Empty And sArr(I, 2) <> Empty Then Ma = sArr(I, 2)
            If Ma = tArr(1, N) Then
                If sArr(I, 3) <> Empty Then
                    Tem = sArr(I, 2)
                    If Not Dic.Exists(Tem) Then
                        K = K + 1: Stt = Stt + 1
                        Dic.Add Tem, K
                        dArr(K, 1) = Stt
                        dArr(K, 2) = sArr(I, 2)
                        dArr(K, 3) = sArr(I, 3)
                        dArr(K, 4) = sArr(I, 4)
                        If Ma = tArr(1, 2) Then
                            dArr(K, 5) = sArr(I, 5)
                            dArr(K, 6) = sArr(I, 6)
                        End If
                        If Ma = tArr(1, 1) Then
                            dArr(K, 5) = Application.VLookup(Tem, RngVL, 3, False)
                            dArr(K, 6) = Application.VLookup(Tem, RngVL, 4, False)
                        End If
                        If Ma = tArr(1, 3) Then
                            dArr(K, 5) = Application.VLookup(Tem, RngMay, 3, False)
                            dArr(K, 6) = Application.VLookup(Tem, RngMay, 4, False)
                        End If
                        dArr(K, 7) = "=RC[-3]*RC[-2]"
                        dArr(K, 8) = "=RC[-4]*RC[-2]"
                    Else
                        R = Dic.Item(Tem)
                        dArr(R, 4) = dArr(R, 4) + sArr(I, 4)
                    End If
                End If
            End If
        Next I
    Next N
    .Range("A10").Resize(K, 8) = dArr
    .Range("A10").Resize(K, 8).Borders.LineStyle = 1
    eRw = .Range("A65536").End(3).Row
    Ic = eRw
    For I = eRw To 10 Step -1
        If .Range("C" & I) = Empty Then
            Id = I + 1
            .Range("G" & I) = "=Sum(G" & Id & ":G" & Ic & ")"
            .Range("H" & I) = "=Sum(H" & Id & ":H" & Ic & ")"
            Ic = I - 1
        End If
    Next I
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Mà sao Vật tư, Vật liệu, Máy có Mã hiệu bạn không đưa vào cho dễ quản lý
 
Lần chỉnh sửa cuối:
Upvote 0
Bảng dữ liệu PTVT của bạn có hơn vạn dòng; Nếu chạy vòng lặp cũng mỏi mệt ấy nhỉ?
Trong trang liệt kê có mã Vật tư, nhưng ở trang 'PTVT' lại không ghi mã của vật tư là sao?
Thông thường làm việc với mã (duy nhất) này sẽ tránh sai sót & nhanh hơn nhiều so với làm việc với tên VT
Vấn đề là mã VT này cần thiết chế 1 cách hết sức khoa học.
Mà hình như ở trang 'THVT' bạn không chỉ fải tổng hợp chỉ là vật tư, mà còn là công xá & mày thi công; Thêm nữa, fải tổng hợp theo trình tự 3 hạng mục này.

Mình cho rằng bạn cần nhập hết mã từ trang danh mục vố trang 'PTVT' mới được/nên tiếp tục công tác thống kê gì khác;
Nhưng khi đó bảng danh mục cần có đủ mã VT cho hết các loại VT của bạn.

Xin chào!
Dạ thưa anh, đáng ra sẽ dùng mã vật tư cho chuẩn nhất. Tuy nhiên trong quá trình làm hay thêm nhiều vật tư nên mã chưa đồng nhất được. Hiện em đang làm theo tên vật tư
 
Upvote 0
Bạn chạy thử Code này xem
PHP:
Public Sub TonghopVT()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr()
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, R As Long
    Dim Ma As String, eRw As Long, Id As Long, Ic As Long
    Dim RngVL As Range, RngMay As Range
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("Vat_lieu")
    Set RngVL = .Range("C4", .Range("C65535").End(3)).Resize(, 4)
    Set RngMay = .Range("I4", .Range("I65535").End(3)).Resize(, 4)
End With
With Sheets("PTVT")
    sArr = .Range("C4:C" & .Range("D65535").End(3).Row).Resize(, 9).Value
    tArr = .[N3:P3].Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
With Sheets("THVT")
    With .Range("A10:H5000")
        .ClearContents
        .Interior.ColorIndex = 0
        .Borders.LineStyle = 0
        .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0
        LaMa = LaMa + 1
        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64)
        dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 9).Resize(, 8).Interior.ColorIndex = 20
        .Range("A" & K + 9).Resize(, 8).Font.Bold = True
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 3) = Empty And sArr(I, 2) <> Empty Then Ma = sArr(I, 2)
            If Ma = tArr(1, N) Then
                If sArr(I, 3) <> Empty Then
                    Tem = sArr(I, 2)
                    If Not Dic.Exists(Tem) Then
                        K = K + 1: Stt = Stt + 1
                        Dic.Add Tem, K
                        dArr(K, 1) = Stt
                        dArr(K, 2) = sArr(I, 2)
                        dArr(K, 3) = sArr(I, 3)
                        dArr(K, 4) = sArr(I, 4)
                        If Ma = tArr(1, 2) Then
                            dArr(K, 5) = sArr(I, 5)
                            dArr(K, 6) = sArr(I, 6)
                        End If
                        If Ma = tArr(1, 1) Then
                            dArr(K, 5) = Application.VLookup(Tem, RngVL, 3, False)
                            dArr(K, 6) = Application.VLookup(Tem, RngVL, 4, False)
                        End If
                        If Ma = tArr(1, 3) Then
                            dArr(K, 5) = Application.VLookup(Tem, RngMay, 3, False)
                            dArr(K, 6) = Application.VLookup(Tem, RngMay, 4, False)
                        End If
                        dArr(K, 7) = "=RC[-3]*RC[-2]"
                        dArr(K, 8) = "=RC[-4]*RC[-2]"
                    Else
                        R = Dic.Item(Tem)
                        dArr(R, 4) = dArr(R, 4) + sArr(I, 4)
                    End If
                End If
            End If
        Next I
    Next N
    .Range("A10").Resize(K, 8) = dArr
    .Range("A10").Resize(K, 8).Borders.LineStyle = 1
    eRw = .Range("A65536").End(3).Row
    Ic = eRw
    For I = eRw To 10 Step -1
        If .Range("C" & I) = Empty Then
            Id = I + 1
            .Range("G" & I) = "=Sum(G" & Id & ":G" & Ic & ")"
            .Range("H" & I) = "=Sum(H" & Id & ":H" & Ic & ")"
            Ic = I - 1
        End If
    Next I
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Mà sao Vật tư, Vật liệu, Máy có Mã hiệu bạn không đưa vào cho dễ quản lý
Code của anh/chị quá hay và chạy nhanh! Cám ơn anh/chị rất nhiều
Tuy nhiên ở đây yêu cầu chỉ lấy vật tư, nhân công, máy thi công khi có khổi lượng hao phí >0 ở cột H trong bảng PTVT đưa vào bảng THVT
Mong anh/chị sửa giúp thêm điều kiện đó ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Code của anh/chị quá hay và chạy nhanh! Cám ơn anh/chị rất nhiều
Tuy nhiên ở đây yêu cầu chỉ lấy vật tư, nhân công, máy thi công khi có khổi lượng hao phí >0 ở cột H trong bảng PTVT đưa vào bảng THVT
Mong anh/chị sửa giúp thêm điều kiện đó ạ
Cái này chỉ lấy khi ô cột H >0. Bạn xem thử
PHP:
Public Sub TonghopVT()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr()
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, R As Long
    Dim Ma As String, eRw As Long, Id As Long, Ic As Long
    Dim RngVL As Range, RngMay As Range
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("Vat_lieu")
    Set RngVL = .Range("C4", .Range("C65535").End(3)).Resize(, 4)
    Set RngMay = .Range("I4", .Range("I65535").End(3)).Resize(, 4)
End With
With Sheets("PTVT")
    sArr = .Range("C4:C" & .Range("D65535").End(xlUp).Row).Resize(, 9).Value
    tArr = .[N3:P3].Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
With Sheets("THVT")
    With .Range("A10:H5000")
        .ClearContents
        .Interior.ColorIndex = 0
        .Borders.LineStyle = 0
        .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0
        LaMa = LaMa + 1
        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64)
        dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 9).Resize(, 8).Interior.ColorIndex = 20
        .Range("A" & K + 9).Resize(, 8).Font.Bold = True
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 3) = Empty And sArr(I, 2) <> Empty Then Ma = sArr(I, 2)
            If Ma = tArr(1, N) Then
                If sArr(I, 3) <> Empty Then
                    If sArr(I, 6) <> Empty Then
                        Tem = sArr(I, 2)
                        If Not Dic.Exists(Tem) Then
                            K = K + 1: Stt = Stt + 1
                            Dic.Add Tem, K
                            dArr(K, 1) = Stt
                            dArr(K, 2) = sArr(I, 2)
                            dArr(K, 3) = sArr(I, 3)
                            dArr(K, 4) = sArr(I, 4)
                            If Ma = tArr(1, 2) Then
                                dArr(K, 5) = sArr(I, 5)
                                dArr(K, 6) = sArr(I, 6)
                            End If
                            If Ma = tArr(1, 1) Then
                                dArr(K, 5) = Application.VLookup(Tem, RngVL, 3, False)
                                dArr(K, 6) = Application.VLookup(Tem, RngVL, 4, False)
                            End If
                            If Ma = tArr(1, 3) Then
                                dArr(K, 5) = Application.VLookup(Tem, RngMay, 3, False)
                                dArr(K, 6) = Application.VLookup(Tem, RngMay, 4, False)
                            End If
                            dArr(K, 7) = "=RC[-3]*RC[-2]"
                            dArr(K, 8) = "=RC[-4]*RC[-2]"
                        Else
                            R = Dic.Item(Tem)
                            dArr(R, 4) = dArr(R, 4) + sArr(I, 4)
                        End If
                    End If
                End If
            End If
        Next I
    Next N
    .Range("A10").Resize(K, 8) = dArr
    .Range("A10").Resize(K, 8).Borders.LineStyle = 1
    eRw = .[A65536].End(xlUp).Row
    Ic = eRw
    For I = eRw To 10 Step -1
        If .Range("C" & I) = Empty Then
            Id = I + 1
            .Range("G" & I) = "=Sum(G" & Id & ":G" & Ic & ")"
            .Range("H" & I) = "=Sum(H" & Id & ":H" & Ic & ")"
            Ic = I - 1
        End If
    Next I
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Cám ơn anh/chị. Quá tuyệt ạ

Dear anh/chị PacificPR trong quá trình lập dự toán sẽ có trường hợp xảy ra là có không có hao phí của 1 trong các loại sau Vật liệu, Nhân công, Máy thi công. Hiện trường hợp đó sẽ gây lỗi References Cell do nó SUM chính nó
NHờ anh/chị tinh chỉnh Code lại giúp ạ
Thanks
 

File đính kèm

  • Loi_References_Cell.PNG
    Loi_References_Cell.PNG
    8.7 KB · Đọc: 7
  • Loi2_References_Cell.PNG
    Loi2_References_Cell.PNG
    41.3 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh chị giúp đỡ, sửa phần code trên với ạ. Cám ơn anh chị nhiều
 
Upvote 0
Lên TOP nhờ các anh chị trên 4Room sửa giúp lỗi References Cell với ạ. Cám ơn
 
Upvote 0
Nhờ anh chị giúp đỡ, sửa phần code trên với ạ. Cám ơn anh chị nhiều
Bạn thử Code này xem thử
PHP:
Public Sub TonghopVT()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr()
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, R As Long
    Dim Ma As String, eRw As Long, Id As Long, Ic As Long, It As Long
    Dim RngVL As Range, RngMay As Range
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("Vat_lieu")
    Set RngVL = .Range("C4", .Range("C65535").End(3)).Resize(, 4)
    Set RngMay = .Range("I4", .Range("I65535").End(3)).Resize(, 4)
End With
With Sheets("PTVT")
    sArr = .Range("C4:C" & .Range("D65535").End(xlUp).Row).Resize(, 9).Value
    tArr = .[N3:P3].Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
With Sheets("THVT")
    With .Range("A10:H5000")
        .ClearContents
        .Interior.ColorIndex = 0
        .Borders.LineStyle = 0
        .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0
        LaMa = LaMa + 1
        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64)
        dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 9).Resize(, 8).Interior.ColorIndex = 20
        .Range("A" & K + 9).Resize(, 8).Font.Bold = True
        It = K: Id = K + 10
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 3) = Empty And sArr(I, 2) <> Empty Then Ma = sArr(I, 2)
            If Ma = tArr(1, N) Then
                If sArr(I, 3) <> Empty Then
                    If sArr(I, 6) <> Empty Then
                        Tem = sArr(I, 2)
                        If Not Dic.Exists(Tem) Then
                            K = K + 1: Stt = Stt + 1
                            Dic.Add Tem, K
                            dArr(K, 1) = Stt
                            dArr(K, 2) = sArr(I, 2)
                            dArr(K, 3) = sArr(I, 3)
                            dArr(K, 4) = sArr(I, 4)
                            If Ma = tArr(1, 2) Then
                                dArr(K, 5) = sArr(I, 5)                              
                            End If
                            If Ma = tArr(1, 1) Then
                                dArr(K, 5) = Application.VLookup(Tem, RngVL, 3, False)
                                dArr(K, 6) = Application.VLookup(Tem, RngVL, 4, False)
                            End If
                            If Ma = tArr(1, 3) Then
                                dArr(K, 5) = Application.VLookup(Tem, RngMay, 3, False)
                                dArr(K, 6) = Application.VLookup(Tem, RngMay, 4, False)
                            End If
                            dArr(K, 7) = "=RC[-3]*RC[-2]"
                            dArr(K, 8) = "=RC[-4]*RC[-2]"
                        Else
                            R = Dic.Item(Tem)
                            dArr(R, 4) = dArr(R, 4) + sArr(I, 4)
                        End If
                    End If
                End If
            End If
        Next I
        If Stt Then
             Ic = K + 9
            dArr(It, 7) = "=Sum(G" & Id & ":G" & Ic & ")"
            dArr(It, 8) = "=Sum(H" & Id & ":H" & Ic & ")"
        End If
    Next N
    .Range("A10").Resize(K, 8) = dArr
    .Range("A10").Resize(K, 8).Borders.LineStyle = 1
 
End With
Set Dic = Nothing
End Sub
 
Upvote 1
Giải pháp
Bạn thử Code này xem thử
PHP:
Public Sub TonghopVT()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr()
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, R As Long
    Dim Ma As String, eRw As Long, Id As Long, Ic As Long, It As Long
    Dim RngVL As Range, RngMay As Range
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("Vat_lieu")
    Set RngVL = .Range("C4", .Range("C65535").End(3)).Resize(, 4)
    Set RngMay = .Range("I4", .Range("I65535").End(3)).Resize(, 4)
End With
With Sheets("PTVT")
    sArr = .Range("C4:C" & .Range("D65535").End(xlUp).Row).Resize(, 9).Value
    tArr = .[N3:P3].Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 8)
With Sheets("THVT")
    With .Range("A10:H5000")
        .ClearContents
        .Interior.ColorIndex = 0
        .Borders.LineStyle = 0
        .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0
        LaMa = LaMa + 1
        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64)
        dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 9).Resize(, 8).Interior.ColorIndex = 20
        .Range("A" & K + 9).Resize(, 8).Font.Bold = True
        It = K: Id = K + 10
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 3) = Empty And sArr(I, 2) <> Empty Then Ma = sArr(I, 2)
            If Ma = tArr(1, N) Then
                If sArr(I, 3) <> Empty Then
                    If sArr(I, 6) <> Empty Then
                        Tem = sArr(I, 2)
                        If Not Dic.Exists(Tem) Then
                            K = K + 1: Stt = Stt + 1
                            Dic.Add Tem, K
                            dArr(K, 1) = Stt
                            dArr(K, 2) = sArr(I, 2)
                            dArr(K, 3) = sArr(I, 3)
                            dArr(K, 4) = sArr(I, 4)
                            If Ma = tArr(1, 2) Then
                                dArr(K, 5) = sArr(I, 5)                           
                            End If
                            If Ma = tArr(1, 1) Then
                                dArr(K, 5) = Application.VLookup(Tem, RngVL, 3, False)
                                dArr(K, 6) = Application.VLookup(Tem, RngVL, 4, False)
                            End If
                            If Ma = tArr(1, 3) Then
                                dArr(K, 5) = Application.VLookup(Tem, RngMay, 3, False)
                                dArr(K, 6) = Application.VLookup(Tem, RngMay, 4, False)
                            End If
                            dArr(K, 7) = "=RC[-3]*RC[-2]"
                            dArr(K, 8) = "=RC[-4]*RC[-2]"
                        Else
                            R = Dic.Item(Tem)
                            dArr(R, 4) = dArr(R, 4) + sArr(I, 4)
                        End If
                    End If
                End If
            End If
        Next I
        If Stt Then
             Ic = K + 9
            dArr(It, 7) = "=Sum(G" & Id & ":G" & Ic & ")"
            dArr(It, 8) = "=Sum(H" & Id & ":H" & Ic & ")"
        End If
    Next N
    .Range("A10").Resize(K, 8) = dArr
    .Range("A10").Resize(K, 8).Borders.LineStyle = 1
 
End With
Set Dic = Nothing
End Sub

Dạ đúng rồi ạ. Tuy nhiên khối lượng vật liệu, nhân công, máy thi công phải lấy tại cột H chứ không phải cột F
Em sửa lại đoạn này từ 4 sang 6. Để tính khối lượng
dArr(K, 4) = sArr(i, 6) 'Khoi luong

Và đoạn này để tính nhân công

Else
R = Dic.Item(Tem)
dArr(R, 4) = dArr(R, 4) + sArr(i, 6)
End If
 
Lần chỉnh sửa cuối:
Upvote 0
Một lần nữa cám ơn anh chị nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom