Cần giúp đỡ: thay công thức bằng code VBA

Liên hệ QC

newstar611

Thành viên chính thức
Tham gia
7/11/12
Bài viết
69
Được thích
3
Xin chào mọi người.

Mình đang làm báo cáo nhưng do bảng tính có nhiều công thức nên tính toán hơi chậm.

Xin mọi người giúp đỡ : thay công thức bằng code VBA để bản tính nhanh hơn (đây là bảng tính mình thu gọn để dễ đăng bài).

Chân thành cảm ơn !
 

File đính kèm

Xin chào mọi người.

Mình đang làm báo cáo nhưng do bảng tính có nhiều công thức nên tính toán hơi chậm.

Xin mọi người giúp đỡ : thay công thức bằng code VBA để bản tính nhanh hơn (đây là bảng tính mình thu gọn để dễ đăng bài).

Chân thành cảm ơn !
Cái này cần nhiều dữ liệu thêm để viết cho chuẩn chứ không thì không sét đủ các trường hợp.Mà từ dữ liệu gốc làm sao để phân nhóm sản phẩm được vậy ta.
 
Upvote 0
Xin chào mọi người.

Mình đang làm báo cáo nhưng do bảng tính có nhiều công thức nên tính toán hơi chậm.

Xin mọi người giúp đỡ : thay công thức bằng code VBA để bản tính nhanh hơn (đây là bảng tính mình thu gọn để dễ đăng bài).

Chân thành cảm ơn !
Bạn dùng SCROLL BAR như hình nhé
đ.png
 
Upvote 0
Xin chào mọi người.

Mình đang làm báo cáo nhưng do bảng tính có nhiều công thức nên tính toán hơi chậm.

Xin mọi người giúp đỡ : thay công thức bằng code VBA để bản tính nhanh hơn (đây là bảng tính mình thu gọn để dễ đăng bài).

Chân thành cảm ơn !
Xem lại các mã sản phẩm của nhóm 1B đúng không
Bảng tính thu gọn dể đăng bài, nhưng khó viết code và áp dụng vào file thật thường không được
 
Upvote 0
Xin chào mọi người.

Mình đang làm báo cáo nhưng do bảng tính có nhiều công thức nên tính toán hơi chậm.

Xin mọi người giúp đỡ : thay công thức bằng code VBA để bản tính nhanh hơn (đây là bảng tính mình thu gọn để dễ đăng bài).

Chân thành cảm ơn !
Trong file làm thủ công thấy có "NHÓM SP 1B" Nhưng đâu thấy có gì liên quan để biết đc nó là 1B đâu, vì mã của 1A và 1B giống y như nhau
 
Upvote 0
Xin chào mọi người.

Mình đang làm báo cáo nhưng do bảng tính có nhiều công thức nên tính toán hơi chậm.

Xin mọi người giúp đỡ : thay công thức bằng code VBA để bản tính nhanh hơn (đây là bảng tính mình thu gọn để dễ đăng bài).

Chân thành cảm ơn !
Bạn xem đúng không nhé.
 

File đính kèm

Upvote 0
Tăng độ khó lên đi. Giờ Sheet báo cáo chỉ có tiêu đề thôi. Còn lại mọi thứ ở dưới do code chạy mà ra...

View attachment 211776
Đây anh xem.
Mã:
Sub chitiet()
Dim arr, arr1, dic As Object, lr As Long, i As Long, j As Long, dk As String, dks As String, k As Integer, tong As Double, a As Long
Dim nhom As Double, nhom1 As Double, arr2
Set dic = CreateObject("Scripting.dictionary")
With Sheets("dulieu")
     arr = .Range("K3:p6").Value
     For i = 2 To UBound(arr, 1)
         For j = 2 To UBound(arr, 2)
             dk = arr(i, 1) & arr(1, j)
             dic.Item(dk) = arr(i, j)
         Next j
    Next i
    arr = .Range("K10:p13").Value
     For i = 2 To UBound(arr, 1)
         For j = 2 To UBound(arr, 2)
             dk = arr(i, 1) & arr(1, j)
             dic.Item(dk) = 1 - arr(i, j)
         Next j
    Next i
    lr = .Range("A" & Rows.Count).End(xlUp).Row
    If lr < 4 Then Exit Sub
    arr = .Range("A3:i" & lr).Value
    ReDim arr2(1 To UBound(arr, 1) + 100, 1 To 2)
    arr2(1, 1) = "TONG CONG": a = 1
    arr1 = .Range("L3:p3").Value
    For i = 2 To UBound(arr, 1)
        dk = arr(i, 1) & arr(1, 3)
        If Not dic.exists(dk) Then
               dic.Add dk, arr(i, 3)
         Else
            dic.Item(dk) = dic.Item(dk) + arr(i, 3)
        End If
        For j = 4 To 8
            dk = arr(i, 1) & arr(1, j)
            If Not dic.exists(dk) Then
               dic.Add dk, arr(i, 3) * arr(i, j) * dic.Item(Left(arr(i, 1), 2) & arr(1, j))
            Else
               dic.Item(dk) = dic.Item(dk) + arr(i, 3) * arr(i, j) * dic.Item(Left(arr(i, 1), 2) & arr(1, j))
            End If
        Next j
        dk = arr(i, 1) & arr(1, 9)
            If Not dic.exists(dk) Then
               dic.Add dk, arr(i, 3) * arr(i, j)
               For k = 1 To UBound(arr1, 2)
                   dks = arr(i, 1) & arr1(1, k)
                   dic.Add dks, dic.Item(dk) * dic.Item(Left(arr(i, 1), 2) & arr1(1, k))
               Next k
            Else
               dic.Item(dk) = dic.Item(dk) + arr(i, 3) * arr(i, j)
               For k = 1 To UBound(arr1, 2)
                   dks = arr(i, 1) & arr1(1, k)
                   dic.Add dks, dic.Item(dk) * dic.Item(Left(arr(i, 1), 2) & arr1(1, k))
               Next k
            End If
            If Left(arr(i, 1), 2) <> Left(arr(i - 1, 1), 2) Then
                 If Left(arr(i, 1), 1) = Left(arr(i - 1, 1), 1) Then
                      a = a + 1
                      arr2(a, 1) = "NHÓM SP " & Left(arr(i, 1), 2)
                      a = a + 1
                      arr2(a, 1) = arr(i, 1): arr2(a, 2) = arr(i, 2)
                 Else
                      a = a + 1
                      arr2(a, 1) = "NHÓM SP " & Left(arr(i, 1), 1)
                       a = a + 1
                      arr2(a, 1) = "NHÓM SP " & Left(arr(i, 1), 2)
                      a = a + 1
                      arr2(a, 1) = arr(i, 1): arr2(a, 2) = arr(i, 2)
                 End If
            Else
                a = a + 1
                arr2(a, 1) = arr(i, 1): arr2(a, 2) = arr(i, 2)
            End If
   Next i
End With
  With Sheets("Baocao")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr > 1 Then .Range("a2:o" & lr).ClearContents
       If a Then .Range("A2").Resize(a, 2).Value = arr2
       arr = .Range("A1:O" & a + 1).Value
       For i = 5 To UBound(arr, 1)
           For j = 3 To UBound(arr, 2) - 1
              dk = arr(i, 1) & arr(1, j)
              If dic.exists(dk) Then
                 arr(i, j) = dic.Item(dk)
              End If
              If j > 3 Then tong = tong + arr(i, j)
           Next j
           arr(i, j) = tong
           tong = 0
      Next i
      tong = 0: dk = Empty
      For j = 3 To UBound(arr, 2)
         For i = UBound(arr, 1) To 3 Step -1
             If arr(i, 1) <> Empty And arr(i, 2) <> Empty Then
                   tong = tong + arr(i, j)
                   nhom = nhom + arr(i, j)
                   nhom1 = nhom1 + arr(i, j)
             Else
                If Len(arr(i, 1)) > 9 Then
                   arr(i, j) = nhom1
                   nhom1 = 0
                Else
                   arr(i, j) = nhom
                   nhom = 0
               End If
            End If
        Next i
        arr(2, j) = tong
        tong = 0
    Next j
      .Range("A1:O" & a + 1).Value = arr
End With
End Sub
 

File đính kèm

Upvote 0
Đây anh xem.
Mã:
Sub chitiet()
Dim arr, arr1, dic As Object, lr As Long, i As Long, j As Long, dk As String, dks As String, k As Integer, tong As Double, a As Long
Dim nhom As Double, nhom1 As Double, arr2
Set dic = CreateObject("Scripting.dictionary")
With Sheets("dulieu")
     arr = .Range("K3:p6").Value
     For i = 2 To UBound(arr, 1)
         For j = 2 To UBound(arr, 2)
             dk = arr(i, 1) & arr(1, j)
             dic.Item(dk) = arr(i, j)
         Next j
    Next i
    arr = .Range("K10:p13").Value
     For i = 2 To UBound(arr, 1)
         For j = 2 To UBound(arr, 2)
             dk = arr(i, 1) & arr(1, j)
             dic.Item(dk) = 1 - arr(i, j)
         Next j
    Next i
    lr = .Range("A" & Rows.Count).End(xlUp).Row
    If lr < 4 Then Exit Sub
    arr = .Range("A3:i" & lr).Value
    ReDim arr2(1 To UBound(arr, 1) + 100, 1 To 2)
    arr2(1, 1) = "TONG CONG": a = 1
    arr1 = .Range("L3:p3").Value
    For i = 2 To UBound(arr, 1)
        dk = arr(i, 1) & arr(1, 3)
        If Not dic.exists(dk) Then
               dic.Add dk, arr(i, 3)
         Else
            dic.Item(dk) = dic.Item(dk) + arr(i, 3)
        End If
        For j = 4 To 8
            dk = arr(i, 1) & arr(1, j)
            If Not dic.exists(dk) Then
               dic.Add dk, arr(i, 3) * arr(i, j) * dic.Item(Left(arr(i, 1), 2) & arr(1, j))
            Else
               dic.Item(dk) = dic.Item(dk) + arr(i, 3) * arr(i, j) * dic.Item(Left(arr(i, 1), 2) & arr(1, j))
            End If
        Next j
        dk = arr(i, 1) & arr(1, 9)
            If Not dic.exists(dk) Then
               dic.Add dk, arr(i, 3) * arr(i, j)
               For k = 1 To UBound(arr1, 2)
                   dks = arr(i, 1) & arr1(1, k)
                   dic.Add dks, dic.Item(dk) * dic.Item(Left(arr(i, 1), 2) & arr1(1, k))
               Next k
            Else
               dic.Item(dk) = dic.Item(dk) + arr(i, 3) * arr(i, j)
               For k = 1 To UBound(arr1, 2)
                   dks = arr(i, 1) & arr1(1, k)
                   dic.Add dks, dic.Item(dk) * dic.Item(Left(arr(i, 1), 2) & arr1(1, k))
               Next k
            End If
            If Left(arr(i, 1), 2) <> Left(arr(i - 1, 1), 2) Then
                 If Left(arr(i, 1), 1) = Left(arr(i - 1, 1), 1) Then
                      a = a + 1
                      arr2(a, 1) = "NHÓM SP " & Left(arr(i, 1), 2)
                      a = a + 1
                      arr2(a, 1) = arr(i, 1): arr2(a, 2) = arr(i, 2)
                 Else
                      a = a + 1
                      arr2(a, 1) = "NHÓM SP " & Left(arr(i, 1), 1)
                       a = a + 1
                      arr2(a, 1) = "NHÓM SP " & Left(arr(i, 1), 2)
                      a = a + 1
                      arr2(a, 1) = arr(i, 1): arr2(a, 2) = arr(i, 2)
                 End If
            Else
                a = a + 1
                arr2(a, 1) = arr(i, 1): arr2(a, 2) = arr(i, 2)
            End If
   Next i
End With
  With Sheets("Baocao")
       lr = .Range("A" & Rows.Count).End(xlUp).Row
       If lr > 1 Then .Range("a2:o" & lr).ClearContents
       If a Then .Range("A2").Resize(a, 2).Value = arr2
       arr = .Range("A1:O" & a + 1).Value
       For i = 5 To UBound(arr, 1)
           For j = 3 To UBound(arr, 2) - 1
              dk = arr(i, 1) & arr(1, j)
              If dic.exists(dk) Then
                 arr(i, j) = dic.Item(dk)
              End If
              If j > 3 Then tong = tong + arr(i, j)
           Next j
           arr(i, j) = tong
           tong = 0
      Next i
      tong = 0: dk = Empty
      For j = 3 To UBound(arr, 2)
         For i = UBound(arr, 1) To 3 Step -1
             If arr(i, 1) <> Empty And arr(i, 2) <> Empty Then
                   tong = tong + arr(i, j)
                   nhom = nhom + arr(i, j)
                   nhom1 = nhom1 + arr(i, j)
             Else
                If Len(arr(i, 1)) > 9 Then
                   arr(i, j) = nhom1
                   nhom1 = 0
                Else
                   arr(i, j) = nhom
                   nhom = 0
               End If
            End If
        Next i
        arr(2, j) = tong
        tong = 0
    Next j
      .Range("A1:O" & a + 1).Value = arr
End With
End Sub
Cám ơn Snow25 và mọi người đã tham gia và giúp đỡ.
 
Upvote 0
Xin hỏi thêm: Có cách nào vẫn giữ các công thức tính tổng, chỉ thay đổi các dòng có phát sinh "Mã sản phẩm" không?
 
Upvote 0
Web KT

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

Back
Top Bottom