Lấy đơn giá trong bảng Chiết tính từ file excel xuất ra từ phần mềm dự toán

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
719
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Dear các anh/chị!
Nhờ anh chị hướng dẫn hỗ trợ code giúp em có thể Lấy đơn giá trong bảng Chiết tính từ file excel xuất ra từ phần mềm dự toán. Cụ thể
- Em đã lấy các đầu việc trong Sheet Công trình đưa sang Sheet PLHD được rồi
- Bây giờ em cần lấy đơn giá của công việc đó từ Sheet Chiết tính sang Sheet PLHD (Từ khóa của bảng phân tích công việc đó là Gxd ở cột D). Tuy nhiên số lượng dòng nó không cố định do phụ thuộc vào Vật Liêu, Nhân công, Máy thi công của Công việc đó nên trình độ em ko làm được
- Em có tạo 2 Sheet PLHD_Mong muon là kết quả em đang cần và PLHD_GPE là nơi em đã làm 1 phần nhỏ code
Mong anh chị ghé qua giúp đỡ ạ, em cám ơn
1624596049693.png1624596390155.png
Mã:
Sub Run_PLHD()
    Dim i, k, aGV(), Res()
    Dim LastRow

    With Sheet1
        aGV = .Range("A6:X" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
    End With
    sRow = UBound(aGV)
    ReDim Res(1 To sRow, 1 To 8)

    For i = 1 To sRow
        If aGV(i, 5) <> "" Then
            k = k + 1
            Res(k, 1) = k
            Res(k, 2) = aGV(i, 5)
            Res(k, 3) = aGV(i, 6)
            Res(k, 4) = aGV(i, 7)
            Res(k, 5) = aGV(i, 16)
            Res(k, 6) = 1
            Res(k, 7) = Res(k, 5) * Res(k, 6)
        End If
    Next i
   

    With Sheet57
        If k > 0 Then
        .Range("A5").Resize(k, 8).Value = Res
        End If
    End With

End Sub
 

File đính kèm

  • GPE_Tao PLHD.xls
    552 KB · Đọc: 31
Không rỏ làm cách nào phân biệt phần tư vấn
Dạ anh, phân biệt phần xây dựng dựa vào Gxd, tư vấn dựa vào khoá Gks anh ạ
Nếu tách được 2 phần này ra 2 Sheet riêng biệt được thì tốt quá ạ
Em cám ơn anh nhiều
 
Upvote 0
Dạ anh, phân biệt phần xây dựng dựa vào Gxd, tư vấn dựa vào khoá Gks anh ạ
Nếu tách được 2 phần này ra 2 Sheet riêng biệt được thì tốt quá ạ
Em cám ơn anh nhiều
Yêu cầu phải chuẩn không được thay đổi lung tung, lần sau tự làm
Chỉnh lại toàn bộ code
Mã:
Option Explicit
Sub Run_PLHD()
  Dim aCT(), aDG(), Res(), Res1(), Res2(), dic As Object
  Dim sRow&, i&, k&, k1&, k2&, ik&, tong1#, tong2#, key$, HM$, THM$
    
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = vbTextCompare
  With Sheet1 'Sheet Cong trinh
    aCT = .Range("A6:P" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(aCT)
  ReDim Res(1 To sRow, 1 To 7)
  For i = 1 To sRow
    If aCT(i, 5) = "HM" Then
      k = k + 1
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
    End If
    If aCT(i, 1) <> Empty Then
      k = k + 1
      Res(k, 1) = aCT(i, 1)
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      Res(k, 4) = aCT(i, 7)
      Res(k, 5) = aCT(i, 16)
      dic(Res(k, 1) & "|" & Res(k, 2)) = k
    End If
  Next
  Res(k + 1, 2) = "HM"
  With Sheet22 'Sheet Chiet tinh
    aDG = .Range("A3", .Range("H" & .Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(aDG)
  For i = 1 To sRow
    If aDG(i, 1) = "STT" Then HM = aDG(i - 1, 1)
    If aDG(i, 1) <> Empty Then ik = 0
    key = aDG(i, 1) & "|" & aDG(i, 2)
    If dic.exists(key) Then ik = dic(key)
    If aDG(i, 4) = "Gxd" Or aDG(i, 4) = "Gks" Then
      If ik > 0 Then
        Res(ik, 6) = aDG(i, 8)
        If Res(ik, 5) <> Empty Then
          Res(ik, 7) = Res(ik, 5) * Res(ik, 6)
        End If
      End If
      If dic.exists(HM) = False Then dic.Add HM, aDG(i, 4)
    End If
  Next i
 
  ReDim Res1(1 To k + 2, 1 To 7)
  ReDim Res2(1 To k + 2, 1 To 7)
  For i = 1 To k
    If Res(i, 2) = "HM" Then
      If dic(Res(i, 3)) = "Gxd" Then
        Call addRes(Res, k, Res1, k1, tong1, i)
      Else
        Call addRes(Res, k, Res2, k2, tong2, i)
      End If
    End If
  Next i
  THM = "T" & ChrW(7892) & "NG H" & ChrW(7840) & "NG M" & ChrW(7908) & "C"
  With Sheet57 'Sheet PLHD_GPE
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k1 > 0 Then
      .Range("A5").Resize(k1, 7).Value = Res1
      .Range("C5").Offset(k1) = THM
      .Range("G5").Offset(k1) = tong1
      .Range("C5").Offset(k1 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
  With Sheet58 'Sheet PLHD_TVTK
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k2 > 0 Then
      .Range("A5").Resize(k2, 7).Value = Res2
      .Range("C5").Offset(k2) = THM
      .Range("G5").Offset(k2) = tong2
      .Range("C5").Offset(k2 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
End Sub

Private Sub addRes(Res, sR, arr, ik, T, ByVal fRow&)
  Dim i&, j&
  For i = fRow To sR
    ik = ik + 1
    For j = 1 To 7
      arr(ik, j) = Res(i, j)
    Next j
    T = T + Res(i, 7)
    If Res(i + 1, 2) = "HM" Then Exit Sub
  Next i
End Sub
 
Upvote 0
Yêu cầu phải chuẩn không được thay đổi lung tung, lần sau tự làm
Chỉnh lại toàn bộ code
Mã:
Option Explicit
Sub Run_PLHD()
  Dim aCT(), aDG(), Res(), Res1(), Res2(), dic As Object
  Dim sRow&, i&, k&, k1&, k2&, ik&, tong1#, tong2#, key$, HM$, THM$
   
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = vbTextCompare
  With Sheet1 'Sheet Cong trinh
    aCT = .Range("A6:P" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(aCT)
  ReDim Res(1 To sRow, 1 To 7)
  For i = 1 To sRow
    If aCT(i, 5) = "HM" Then
      k = k + 1
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
    End If
    If aCT(i, 1) <> Empty Then
      k = k + 1
      Res(k, 1) = aCT(i, 1)
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      Res(k, 4) = aCT(i, 7)
      Res(k, 5) = aCT(i, 16)
      dic(Res(k, 1) & "|" & Res(k, 2)) = k
    End If
  Next
  Res(k + 1, 2) = "HM"
  With Sheet22 'Sheet Chiet tinh
    aDG = .Range("A3", .Range("H" & .Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(aDG)
  For i = 1 To sRow
    If aDG(i, 1) = "STT" Then HM = aDG(i - 1, 1)
    If aDG(i, 1) <> Empty Then ik = 0
    key = aDG(i, 1) & "|" & aDG(i, 2)
    If dic.exists(key) Then ik = dic(key)
    If aDG(i, 4) = "Gxd" Or aDG(i, 4) = "Gks" Then
      If ik > 0 Then
        Res(ik, 6) = aDG(i, 8)
        If Res(ik, 5) <> Empty Then
          Res(ik, 7) = Res(ik, 5) * Res(ik, 6)
        End If
      End If
      If dic.exists(HM) = False Then dic.Add HM, aDG(i, 4)
    End If
  Next i
 
  ReDim Res1(1 To k + 2, 1 To 7)
  ReDim Res2(1 To k + 2, 1 To 7)
  For i = 1 To k
    If Res(i, 2) = "HM" Then
      If dic(Res(i, 3)) = "Gxd" Then
        Call addRes(Res, k, Res1, k1, tong1, i)
      Else
        Call addRes(Res, k, Res2, k2, tong2, i)
      End If
    End If
  Next i
  THM = "T" & ChrW(7892) & "NG H" & ChrW(7840) & "NG M" & ChrW(7908) & "C"
  With Sheet57 'Sheet PLHD_GPE
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k1 > 0 Then
      .Range("A5").Resize(k1, 7).Value = Res1
      .Range("C5").Offset(k1) = THM
      .Range("G5").Offset(k1) = tong1
      .Range("C5").Offset(k1 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
  With Sheet58 'Sheet PLHD_TVTK
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k2 > 0 Then
      .Range("A5").Resize(k2, 7).Value = Res2
      .Range("C5").Offset(k2) = THM
      .Range("G5").Offset(k2) = tong2
      .Range("C5").Offset(k2 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
End Sub

Private Sub addRes(Res, sR, arr, ik, T, ByVal fRow&)
  Dim i&, j&
  For i = fRow To sR
    ik = ik + 1
    For j = 1 To 7
      arr(ik, j) = Res(i, j)
    Next j
    T = T + Res(i, 7)
    If Res(i + 1, 2) = "HM" Then Exit Sub
  Next i
End Sub
Anh HieuCD ơi, lại làm phiền anh lần nữa rồi ạ
Không hiểu sao Code của anh chạy rất tốt rồi, nhưng lần này không hiểu sao không lấy được Gxd đối với 1 số mã tạm tính (Mã hiệu: TT), em nhờ anh xem giúp em với ạ Em cám ơn anh rất nhiều

Phần mềm G8 chạy ra
1651751457768.png

Khi áp dụng Code của anh hiện không lấy được giá trị cho các hạng mục này
1651751517877.png
Bài đã được tự động gộp:

1651752447809.png
Nếu em đổi tên mã công việc đi thì chạy bình thường ạ, anh HieuCD kiểm tra giúp em với nhé. Em cám ơn
 

File đính kèm

  • Mong.xlsm
    393.4 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
Anh HieuCD ơi, lại làm phiền anh lần nữa rồi ạ
Không hiểu sao Code của anh chạy rất tốt rồi, nhưng lần này không hiểu sao không lấy được Gxd đối với 1 số mã tạm tính (Mã hiệu: TT), em nhờ anh xem giúp em với ạ Em cám ơn anh rất nhiều

Phần mềm G8 chạy ra
View attachment 275460

Khi áp dụng Code của anh hiện không lấy được giá trị cho các hạng mục này
View attachment 275461
Bài đã được tự động gộp:

View attachment 275463
Nếu em đổi tên mã công việc đi thì chạy bình thường ạ, anh HieuCD kiểm tra giúp em với nhé. Em cám ơn
Mã số của những công việc khác nhau phải khác nhau, không có chuyện nhập tạm
Dùng số thứ tự để nhận diện công việc
Mã:
Option Explicit
Sub Run_PLHD()
  Dim aCT(), aDG(), Res(), Res1(), Res2(), dic As Object
  Dim sRow&, i&, k&, k1&, k2&, ik&, tong1#, tong2#, key$, HM$, THM$
    
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = vbTextCompare
  With Sheet1 'Sheet Cong trinh
    aCT = .Range("A6:P" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(aCT)
  ReDim Res(1 To sRow, 1 To 7)
  For i = 1 To sRow
    If aCT(i, 5) = "HM" Then
      k = k + 1
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      HM = Res(k, 3)
    End If
    If aCT(i, 1) <> Empty Then
      k = k + 1
      Res(k, 1) = aCT(i, 1)
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      Res(k, 4) = aCT(i, 7)
      Res(k, 5) = aCT(i, 16)
      dic(Res(k, 1) & "|" & HM) = k
    End If
  Next
  Res(k + 1, 2) = "HM"
  With Sheet22 'Sheet Chiet tinh
    aDG = .Range("A3", .Range("H" & .Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(aDG)
  For i = 1 To sRow
    If aDG(i, 1) = "STT" Then HM = aDG(i - 1, 1)
    If aDG(i, 1) <> Empty Then ik = 0
    key = aDG(i, 1) & "|" & HM
    If dic.exists(key) Then ik = dic(key)
    If aDG(i, 4) = "Gxd" Or aDG(i, 4) = "Gks" Then
      If ik > 0 Then
        Res(ik, 6) = aDG(i, 8)
        If Res(ik, 5) <> Empty Then
          Res(ik, 7) = Res(ik, 5) * Res(ik, 6)
        End If
      End If
      If dic.exists(HM) = False Then dic.Add HM, aDG(i, 4)
    End If
  Next i
 
  ReDim Res1(1 To k + 2, 1 To 7)
  ReDim Res2(1 To k + 2, 1 To 7)
  For i = 1 To k
    If Res(i, 2) = "HM" Then
      If dic(Res(i, 3)) = "Gxd" Then
        Call addRes(Res, k, Res1, k1, tong1, i)
      Else
        Call addRes(Res, k, Res2, k2, tong2, i)
      End If
    End If
  Next i
  THM = "T" & ChrW(7892) & "NG H" & ChrW(7840) & "NG M" & ChrW(7908) & "C"
  With Sheet57 'Sheet PLHD_GPE
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k1 > 0 Then
      .Range("A5").Resize(k1, 7).Value = Res1
      .Range("C5").Offset(k1) = THM
      .Range("G5").Offset(k1) = tong1
      .Range("C5").Offset(k1 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
  With Sheet58 'Sheet PLHD_TVTK
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k2 > 0 Then
      .Range("A5").Resize(k2, 7).Value = Res2
      .Range("C5").Offset(k2) = THM
      .Range("G5").Offset(k2) = tong2
      .Range("C5").Offset(k2 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
End Sub

Private Sub addRes(Res, sR, arr, ik, T, ByVal fRow&)
  Dim i&, j&
  For i = fRow To sR
    ik = ik + 1
    For j = 1 To 7
      arr(ik, j) = Res(i, j)
    Next j
    T = T + Res(i, 7)
    If Res(i + 1, 2) = "HM" Then Exit Sub
  Next i
End Sub
 
Upvote 0
Mã số của những công việc khác nhau phải khác nhau, không có chuyện nhập tạm
Dùng số thứ tự để nhận diện công việc
Mã:
Option Explicit
Sub Run_PLHD()
  Dim aCT(), aDG(), Res(), Res1(), Res2(), dic As Object
  Dim sRow&, i&, k&, k1&, k2&, ik&, tong1#, tong2#, key$, HM$, THM$
   
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = vbTextCompare
  With Sheet1 'Sheet Cong trinh
    aCT = .Range("A6:P" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(aCT)
  ReDim Res(1 To sRow, 1 To 7)
  For i = 1 To sRow
    If aCT(i, 5) = "HM" Then
      k = k + 1
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      HM = Res(k, 3)
    End If
    If aCT(i, 1) <> Empty Then
      k = k + 1
      Res(k, 1) = aCT(i, 1)
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      Res(k, 4) = aCT(i, 7)
      Res(k, 5) = aCT(i, 16)
      dic(Res(k, 1) & "|" & HM) = k
    End If
  Next
  Res(k + 1, 2) = "HM"
  With Sheet22 'Sheet Chiet tinh
    aDG = .Range("A3", .Range("H" & .Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(aDG)
  For i = 1 To sRow
    If aDG(i, 1) = "STT" Then HM = aDG(i - 1, 1)
    If aDG(i, 1) <> Empty Then ik = 0
    key = aDG(i, 1) & "|" & HM
    If dic.exists(key) Then ik = dic(key)
    If aDG(i, 4) = "Gxd" Or aDG(i, 4) = "Gks" Then
      If ik > 0 Then
        Res(ik, 6) = aDG(i, 8)
        If Res(ik, 5) <> Empty Then
          Res(ik, 7) = Res(ik, 5) * Res(ik, 6)
        End If
      End If
      If dic.exists(HM) = False Then dic.Add HM, aDG(i, 4)
    End If
  Next i
 
  ReDim Res1(1 To k + 2, 1 To 7)
  ReDim Res2(1 To k + 2, 1 To 7)
  For i = 1 To k
    If Res(i, 2) = "HM" Then
      If dic(Res(i, 3)) = "Gxd" Then
        Call addRes(Res, k, Res1, k1, tong1, i)
      Else
        Call addRes(Res, k, Res2, k2, tong2, i)
      End If
    End If
  Next i
  THM = "T" & ChrW(7892) & "NG H" & ChrW(7840) & "NG M" & ChrW(7908) & "C"
  With Sheet57 'Sheet PLHD_GPE
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k1 > 0 Then
      .Range("A5").Resize(k1, 7).Value = Res1
      .Range("C5").Offset(k1) = THM
      .Range("G5").Offset(k1) = tong1
      .Range("C5").Offset(k1 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
  With Sheet58 'Sheet PLHD_TVTK
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k2 > 0 Then
      .Range("A5").Resize(k2, 7).Value = Res2
      .Range("C5").Offset(k2) = THM
      .Range("G5").Offset(k2) = tong2
      .Range("C5").Offset(k2 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
End Sub

Private Sub addRes(Res, sR, arr, ik, T, ByVal fRow&)
  Dim i&, j&
  For i = fRow To sR
    ik = ik + 1
    For j = 1 To 7
      arr(ik, j) = Res(i, j)
    Next j
    T = T + Res(i, 7)
    If Res(i + 1, 2) = "HM" Then Exit Sub
  Next i
End Sub
Dạ không phải anh ạ, trong bộ định mức do nhà nước ban hành nêu không có mã công việc thì được phép dùng tạm tính ạ
 
Upvote 0
Mã số của những công việc khác nhau phải khác nhau, không có chuyện nhập tạm
Dùng số thứ tự để nhận diện công việc
Mã:
Option Explicit
Sub Run_PLHD()
  Dim aCT(), aDG(), Res(), Res1(), Res2(), dic As Object
  Dim sRow&, i&, k&, k1&, k2&, ik&, tong1#, tong2#, key$, HM$, THM$
   
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = vbTextCompare
  With Sheet1 'Sheet Cong trinh
    aCT = .Range("A6:P" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(aCT)
  ReDim Res(1 To sRow, 1 To 7)
  For i = 1 To sRow
    If aCT(i, 5) = "HM" Then
      k = k + 1
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      HM = Res(k, 3)
    End If
    If aCT(i, 1) <> Empty Then
      k = k + 1
      Res(k, 1) = aCT(i, 1)
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      Res(k, 4) = aCT(i, 7)
      Res(k, 5) = aCT(i, 16)
      dic(Res(k, 1) & "|" & HM) = k
    End If
  Next
  Res(k + 1, 2) = "HM"
  With Sheet22 'Sheet Chiet tinh
    aDG = .Range("A3", .Range("H" & .Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(aDG)
  For i = 1 To sRow
    If aDG(i, 1) = "STT" Then HM = aDG(i - 1, 1)
    If aDG(i, 1) <> Empty Then ik = 0
    key = aDG(i, 1) & "|" & HM
    If dic.exists(key) Then ik = dic(key)
    If aDG(i, 4) = "Gxd" Or aDG(i, 4) = "Gks" Then
      If ik > 0 Then
        Res(ik, 6) = aDG(i, 8)
        If Res(ik, 5) <> Empty Then
          Res(ik, 7) = Res(ik, 5) * Res(ik, 6)
        End If
      End If
      If dic.exists(HM) = False Then dic.Add HM, aDG(i, 4)
    End If
  Next i
 
  ReDim Res1(1 To k + 2, 1 To 7)
  ReDim Res2(1 To k + 2, 1 To 7)
  For i = 1 To k
    If Res(i, 2) = "HM" Then
      If dic(Res(i, 3)) = "Gxd" Then
        Call addRes(Res, k, Res1, k1, tong1, i)
      Else
        Call addRes(Res, k, Res2, k2, tong2, i)
      End If
    End If
  Next i
  THM = "T" & ChrW(7892) & "NG H" & ChrW(7840) & "NG M" & ChrW(7908) & "C"
  With Sheet57 'Sheet PLHD_GPE
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k1 > 0 Then
      .Range("A5").Resize(k1, 7).Value = Res1
      .Range("C5").Offset(k1) = THM
      .Range("G5").Offset(k1) = tong1
      .Range("C5").Offset(k1 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
  With Sheet58 'Sheet PLHD_TVTK
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k2 > 0 Then
      .Range("A5").Resize(k2, 7).Value = Res2
      .Range("C5").Offset(k2) = THM
      .Range("G5").Offset(k2) = tong2
      .Range("C5").Offset(k2 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
End Sub

Private Sub addRes(Res, sR, arr, ik, T, ByVal fRow&)
  Dim i&, j&
  For i = fRow To sR
    ik = ik + 1
    For j = 1 To 7
      arr(ik, j) = Res(i, j)
    Next j
    T = T + Res(i, 7)
    If Res(i + 1, 2) = "HM" Then Exit Sub
  Next i
End Sub
Cám ơn anh rất nhiều ạ
 
Upvote 0
Mã số của những công việc khác nhau phải khác nhau, không có chuyện nhập tạm
Dùng số thứ tự để nhận diện công việc
Mã:
Option Explicit
Sub Run_PLHD()
  Dim aCT(), aDG(), Res(), Res1(), Res2(), dic As Object
  Dim sRow&, i&, k&, k1&, k2&, ik&, tong1#, tong2#, key$, HM$, THM$
   
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = vbTextCompare
  With Sheet1 'Sheet Cong trinh
    aCT = .Range("A6:P" & .Range("F" & .Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(aCT)
  ReDim Res(1 To sRow, 1 To 7)
  For i = 1 To sRow
    If aCT(i, 5) = "HM" Then
      k = k + 1
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      HM = Res(k, 3)
    End If
    If aCT(i, 1) <> Empty Then
      k = k + 1
      Res(k, 1) = aCT(i, 1)
      Res(k, 2) = aCT(i, 5)
      Res(k, 3) = aCT(i, 6)
      Res(k, 4) = aCT(i, 7)
      Res(k, 5) = aCT(i, 16)
      dic(Res(k, 1) & "|" & HM) = k
    End If
  Next
  Res(k + 1, 2) = "HM"
  With Sheet22 'Sheet Chiet tinh
    aDG = .Range("A3", .Range("H" & .Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(aDG)
  For i = 1 To sRow
    If aDG(i, 1) = "STT" Then HM = aDG(i - 1, 1)
    If aDG(i, 1) <> Empty Then ik = 0
    key = aDG(i, 1) & "|" & HM
    If dic.exists(key) Then ik = dic(key)
    If aDG(i, 4) = "Gxd" Or aDG(i, 4) = "Gks" Then
      If ik > 0 Then
        Res(ik, 6) = aDG(i, 8)
        If Res(ik, 5) <> Empty Then
          Res(ik, 7) = Res(ik, 5) * Res(ik, 6)
        End If
      End If
      If dic.exists(HM) = False Then dic.Add HM, aDG(i, 4)
    End If
  Next i
 
  ReDim Res1(1 To k + 2, 1 To 7)
  ReDim Res2(1 To k + 2, 1 To 7)
  For i = 1 To k
    If Res(i, 2) = "HM" Then
      If dic(Res(i, 3)) = "Gxd" Then
        Call addRes(Res, k, Res1, k1, tong1, i)
      Else
        Call addRes(Res, k, Res2, k2, tong2, i)
      End If
    End If
  Next i
  THM = "T" & ChrW(7892) & "NG H" & ChrW(7840) & "NG M" & ChrW(7908) & "C"
  With Sheet57 'Sheet PLHD_GPE
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k1 > 0 Then
      .Range("A5").Resize(k1, 7).Value = Res1
      .Range("C5").Offset(k1) = THM
      .Range("G5").Offset(k1) = tong1
      .Range("C5").Offset(k1 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
  With Sheet58 'Sheet PLHD_TVTK
    i = .Range("C" & .Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("A5:H" & i).ClearContents
    If k2 > 0 Then
      .Range("A5").Resize(k2, 7).Value = Res2
      .Range("C5").Offset(k2) = THM
      .Range("G5").Offset(k2) = tong2
      .Range("C5").Offset(k2 + 1) = "Doc so tien" 'Tu lo nhé
    End If
  End With
End Sub

Private Sub addRes(Res, sR, arr, ik, T, ByVal fRow&)
  Dim i&, j&
  For i = fRow To sR
    ik = ik + 1
    For j = 1 To 7
      arr(ik, j) = Res(i, j)
    Next j
    T = T + Res(i, 7)
    If Res(i + 1, 2) = "HM" Then Exit Sub
  Next i
End Sub
Dạ thưa anh HieuCD !
Hơi tham lam một chút trong chủ đề này, em nhờ anh tính tổng giúp em các công việc của hạng mục luôn trong code của anh với được không ạ. Em cám ơn anh
1655794935689.png
 
Upvote 0
Upvote 0
Bạn tự viết sub tính tổng, trước dòng lệnh end sub của Sub Run_PLHD thêm lệnh call sub tính tổng
Hix em viết mà nó chạy tất cả các Cell ra giá trị tổng anh HieuCD
Mã:
Sub TongHM()

    Set sh_PLHD = Sheets("PLHD")          'Sheet Phu luc Hop dong
    With sh_PLHD    'Sheet Cong trinh
        aCT = .Range("A9:H" & .Range("C" & .Rows.count).End(xlUp).row).value
    End With
    sRow = UBound(aCT)
    ReDim res(1 To sRow, 1 To 14)
    For i = 2 To sRow
        If aCT(i, 2) <> "HM" Then
            k = k + 1
            tong = tong + aCT(k, 7)
        Else
            aCT(k, 7) = tong: tong = 0
        End If
        'MsgBox tong
    Next i
    With sh_PLHD    'Sheet PLHD_GPE
        If k > 0 Then
        .Range("A9").Resize(k, 7).value = tong
        End If
    End With
  
End Sub
 
Upvote 0
Hix em viết mà nó chạy tất cả các Cell ra giá trị tổng anh HieuCD
Mã:
Sub TongHM()

    Set sh_PLHD = Sheets("PLHD")          'Sheet Phu luc Hop dong
    With sh_PLHD    'Sheet Cong trinh
        aCT = .Range("A9:H" & .Range("C" & .Rows.count).End(xlUp).row).value
    End With
    sRow = UBound(aCT)
    ReDim res(1 To sRow, 1 To 14)
    For i = 2 To sRow
        If aCT(i, 2) <> "HM" Then
            k = k + 1
            tong = tong + aCT(k, 7)
        Else
            aCT(k, 7) = tong: tong = 0
        End If
        'MsgBox tong
    Next i
    With sh_PLHD    'Sheet PLHD_GPE
        If k > 0 Then
        .Range("A9").Resize(k, 7).value = tong
        End If
    End With
 
End Sub
Code viết theo cấu trúc file mong.xlsm , tự chỉnh phù hợp với file thực tế
Set sh_PLHD = Sheets("PLHD_GPE") 'Sheet Phu luc Hop dong
arr = sh_PLHD.Range("A5:H" & sh_PLHD.Range("C1000000").End(xlUp).Row).Value
sh_PLHD.Range("A5").Resize(sRow, 7).Value = arr
Mã:
Sub TongHM()
  Dim sh_PLHD As Worksheet, arr(), sRow&, i&, iR&
    Set sh_PLHD = Sheets("PLHD_GPE")          'Sheet Phu luc Hop dong
    arr = sh_PLHD.Range("A5:H" & sh_PLHD.Range("C1000000").End(xlUp).Row).Value
    sRow = UBound(arr)
    For i = 1 To sRow
      If arr(i, 2) = "HM" Then
        iR = i
        arr(iR, 7) = 0
      Else
        arr(iR, 7) = arr(iR, 7) + arr(i, 7)
      End If
    Next i
    sh_PLHD.Range("A5").Resize(sRow, 7).Value = arr
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom