Dùng hàm Consolidate nhưng bị sai, nhờ các anh chị xem giúp! (1 người xem)

Liên hệ QC

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

phuong0712

Thành viên mới
Tham gia
15/8/12
Bài viết
3
Được thích
0
Chào các anh chị trên diễn đàn,
Nhờ kinh nghiệm và chia sẻ của các anh chị em trên diễn đàn, mình đã học được rất nhiều kiến thức phục vụ cho công việc, đa số đều từ các chỉ dẫn của anh chị mình đều mày mò được, cảm ơn các anh, chị, em rất nhiều.
Tuy nhiên, mấy ngày nay mình đang làm báo cáo tổng hợp chi phí NV, mình dùng hàm CONSOLIDATE để tổng hợp các giá trị của các bảng tính khác nhau. Tuy nhiên lại ra cột đúng, cột sai, mình xin gửi file attach nhờ các anh chị em xem giúp
Trong file của mình: Sheet Consolidate là tổng hợp của 2 bảng tính tại sheet T8 và T9, các cột mình kiểm tra đều đúng nhưng riêng cột tổng cộng thì bị sai (mình bôi đỏ)
Nhờ các cao thủ tìm nguyên nhân giúp, đây mình mới cộng 2 tháng, cộng 12 tháng nữa sợ kết quả bị nhầm mà số liệu nhiều ko kiểm tra hết
Xin cảm ơn các anh, chị, em

Phương
 

File đính kèm

Chào các anh chị trên diễn đàn,
Nhờ kinh nghiệm và chia sẻ của các anh chị em trên diễn đàn, mình đã học được rất nhiều kiến thức phục vụ cho công việc, đa số đều từ các chỉ dẫn của anh chị mình đều mày mò được, cảm ơn các anh, chị, em rất nhiều.
Tuy nhiên, mấy ngày nay mình đang làm báo cáo tổng hợp chi phí NV, mình dùng hàm CONSOLIDATE để tổng hợp các giá trị của các bảng tính khác nhau. Tuy nhiên lại ra cột đúng, cột sai, mình xin gửi file attach nhờ các anh chị em xem giúp
Trong file của mình: Sheet Consolidate là tổng hợp của 2 bảng tính tại sheet T8 và T9, các cột mình kiểm tra đều đúng nhưng riêng cột tổng cộng thì bị sai (mình bôi đỏ)
Nhờ các cao thủ tìm nguyên nhân giúp, đây mình mới cộng 2 tháng, cộng 12 tháng nữa sợ kết quả bị nhầm mà số liệu nhiều ko kiểm tra hết
Xin cảm ơn các anh, chị, em

Phương
Vì trên tiêu đề bạn có 2 cái TỔNGCỘNG: 1 cái cột H và 1 cái cột P
Giờ bạn sửa H1 thành TỔNGCỘNG1, P1 thành TỔNGCỘNG2 ở cả 2 sheet... xong, làm lại sẽ có kết quả khác
 
Chào các anh chị trên diễn đàn,
Nhờ kinh nghiệm và chia sẻ của các anh chị em trên diễn đàn, mình đã học được rất nhiều kiến thức phục vụ cho công việc, đa số đều từ các chỉ dẫn của anh chị mình đều mày mò được, cảm ơn các anh, chị, em rất nhiều.
Tuy nhiên, mấy ngày nay mình đang làm báo cáo tổng hợp chi phí NV, mình dùng hàm CONSOLIDATE để tổng hợp các giá trị của các bảng tính khác nhau. Tuy nhiên lại ra cột đúng, cột sai, mình xin gửi file attach nhờ các anh chị em xem giúp
Trong file của mình: Sheet Consolidate là tổng hợp của 2 bảng tính tại sheet T8 và T9, các cột mình kiểm tra đều đúng nhưng riêng cột tổng cộng thì bị sai (mình bôi đỏ)
Nhờ các cao thủ tìm nguyên nhân giúp, đây mình mới cộng 2 tháng, cộng 12 tháng nữa sợ kết quả bị nhầm mà số liệu nhiều ko kiểm tra hết
Xin cảm ơn các anh, chị, em

Phương
cái này là do tiêu đề của bạn bị trùng tên . nên nó chí lấy có 1 cột thôi . sửa thành tổng cộng 1 và tổng công 2 xem kết qua như ý. nên nhớ rằng table,consolidate, pivot table các tiêu đề phải duy nhất thì kết quả mới đúng
 
Chào các anh chị trên diễn đàn,
Nhờ kinh nghiệm và chia sẻ của các anh chị em trên diễn đàn, mình đã học được rất nhiều kiến thức phục vụ cho công việc, đa số đều từ các chỉ dẫn của anh chị mình đều mày mò được, cảm ơn các anh, chị, em rất nhiều.
Tuy nhiên, mấy ngày nay mình đang làm báo cáo tổng hợp chi phí NV, mình dùng hàm CONSOLIDATE để tổng hợp các giá trị của các bảng tính khác nhau. Tuy nhiên lại ra cột đúng, cột sai, mình xin gửi file attach nhờ các anh chị em xem giúp
Trong file của mình: Sheet Consolidate là tổng hợp của 2 bảng tính tại sheet T8 và T9, các cột mình kiểm tra đều đúng nhưng riêng cột tổng cộng thì bị sai (mình bôi đỏ)
Nhờ các cao thủ tìm nguyên nhân giúp, đây mình mới cộng 2 tháng, cộng 12 tháng nữa sợ kết quả bị nhầm mà số liệu nhiều ko kiểm tra hết
Xin cảm ơn các anh, chị, em

Phương

Tổng hợp kiểu này bằng VBA coi được không
 

File đính kèm

đương nhiên được, nhưng mà: Vba mà đi "thi" với thằng consolidate và pivottable thì chỉ có nước hít khói
ẹc... ẹc...
đương nhiên là thua rồi.mà không biết code của quang hải mà so với dic thì cái nào nhanh hơn bác tuấn nhỉ.nhưng code của quang hải viết rất gọn VÀ đẹp.
 
đương nhiên là thua rồi.mà không biết code của quang hải mà so với dic thì cái nào nhanh hơn bác tuấn nhỉ.nhưng code của quang hải viết rất gọn VÀ đẹp.
Mình để ý thì thấy rằng sử dụng dictionary chạy chậm hơn 1/2 thời gian
Cụ thể code này so với code dùng mảng trong file của bài 4 thì hậm hơn nhiều, không biết mình có nhầm lẫn gì không
PHP:
Sub tong2()
Dim kq(1 To 1000, 1 To 20), sh As Worksheet, i, dl, n, d As Object, k, t
t = Timer
Set d = CreateObject("scripting.dictionary")
With Sheet3
  .Range(.[b4], .[b4].End(4)).Resize(, 20).ClearContents
End With
For Each sh In Worksheets
  If sh.Name <> "Consolidate" Then
    dl = sh.Range(sh.[a2], sh.[a2].End(4).Offset(1)).Resize(, 20).Value
      For i = 1 To UBound(dl)
        If dl(i, 1) <> "" Then
          If Not d.exists(dl(i, 1)) Then
            k = k + 1
            d.Add dl(i, 1), k
            For n = 1 To 20
              kq(k, n) = kq(k, n) + dl(i, n)
            Next
          Else
            For n = 2 To 20
              kq(d.Item(dl(i, 1)), n) = kq(d.Item(dl(i, 1)), n) + dl(i, n)
            Next
          End If
        End If
      Next
  End If
Next
Sheet3.[a4:t1000].ClearContents
Sheet3.[a4].Resize(k, 20) = kq
MsgBox Timer - t
End Sub
 
Lần chỉnh sửa cuối:
mình để ý thì thấy rằng sử dụng dictionary chạy chậm hơn 1/2 thời gian
cụ thể code này so với code dùng mảng trong file của bài 4 thì hậm hơn nhiều, không biết mình có nhầm lẫn gì không
PHP:
sub tong2()
dim kq(1 to 1000, 1 to 20), sh as worksheet, i, dl, n, d as object, k, t
t = timer
set d = createobject("scripting.dictionary")
with sheet3
  .range(.[b4], .[b4].end(4)).resize(, 20).clearcontents
end with
for each sh in worksheets
  if sh.name <> "consolidate" then
    dl = sh.range(sh.[a2], sh.[a2].end(4).offset(1)).resize(, 20).value
      for i = 1 to ubound(dl)
        if dl(i, 1) <> "" then
          if not d.exists(dl(i, 1)) then
            k = k + 1
            d.add dl(i, 1), k
            for n = 1 to 20
              kq(k, n) = kq(k, n) + dl(i, n)
            next
          else
            for n = 1 to 20
              kq(d.item(dl(i, 1)), n) = kq(d.item(dl(i, 1)), n) + dl(i, n)
            next
          end if
        end if
      next
  end if
next
sheet3.[a4:t1000].clearcontents
sheet3.[a4].resize(k, 20) = kq
msgbox timer - t
end sub
chạy chậm hơn là đúng. Vì anh để ý kết quả cột a xem nhé
 

File đính kèm

chạy chậm hơn là đúng. Vì anh để ý kết quả cột a xem nhé

Bị nhầm chỗ này, tuy nhiên vẫn thấy chậm hơn ban đầu
Else
for n = 2 to 20
kq
(d.item(dl(i, 1)), n) = kq(d.item(dl(i, 1)), n) + dl(i, n)
next

Công nhận cách sử dụng Consolidate hay thật, tiếc là mình không quen sử dụng, phải luyện thôi.
 
Nếu dùng consolidate thì ngắn gọn, nhưng không biết làm sao để đưa các sheet cần vào trong mảng để khi mình thêm sheet thì không cần sửa lại code

PHP:
Sub consolidate()
  [A3].consolidate Array("'T8'!R1C1:R6542C2", "'T9'!R1C1:R6542C21"), 9, 1, 1
End Sub
 
Nếu dùng consolidate thì ngắn gọn, nhưng không biết làm sao để đưa các sheet cần vào trong mảng để khi mình thêm sheet thì không cần sửa lại code

PHP:
Sub consolidate()
  [A3].consolidate Array("'T8'!R1C1:R6542C2", "'T9'!R1C1:R6542C21"), 9, 1, 1
End Sub

Thì For... Next để lấy địa chỉ Range của từng sheet chứ sao nữa
 
Cái code này cùng lắm for 1 to 12 là cùng.do dữ liệu. Chỉ có. Hai sheet nên add trực tiếp cho rồi

Có 1 cái khó là chúng ta cũng chẳng biết sẽ tổng hợp từ sheet nào đến sheet nào nữa. Nhiều khi cắc cớ, tổng hợp sheet1, sheet4, sheet5, sheet 6 hoặc tổng hợp toàn bộ, trừ 1 sheet nào đó chẳng hạn ---> Khi ấy nếu viết code dạng tổng quát sẽ khó vô cùng
Tôi nghĩ rằng nên viết theo kiểu này:
PHP:
Sub ConsolData(ByVal wksArray, sRng As String, rTarget As Range)
Biến wksArray là 1 mảng chứa các tên sheet cần tổng hợp ---> Do người dùng tự khai báo (tức là giao cái phần "cắc cớ" này cho người dùng)
Biến sRng là địa chỉ vùng dữ liệu (dạng chuổi) ---> Do người dùng tự khai báo
Biến rTarget là nơi đặt kết quả ---> Do người dùng tự khai báo
Xong, viết thêm 1 sub, khai báo gì tùy thích rồi chạy ConsolData theo các biến đã khai báo
 
Có 1 cái khó là chúng ta cũng chẳng biết sẽ tổng hợp từ sheet nào đến sheet nào nữa. Nhiều khi cắc cớ, tổng hợp sheet1, sheet4, sheet5, sheet 6 hoặc tổng hợp toàn bộ, trừ 1 sheet nào đó chẳng hạn ---> Khi ấy nếu viết code dạng tổng quát sẽ khó vô cùng
Tôi nghĩ rằng nên viết theo kiểu này:
PHP:
Sub ConsolData(ByVal wksArray, sRng As String, rTarget As Range)
Biến wksArray là 1 mảng chứa các tên sheet cần tổng hợp ---> Do người dùng tự khai báo (tức là giao cái phần "cắc cớ" này cho người dùng)
Biến sRng là địa chỉ vùng dữ liệu (dạng chuổi) ---> Do người dùng tự khai báo
Biến rTarget là nơi đặt kết quả ---> Do người dùng tự khai báo
Xong, viết thêm 1 sub, khai báo gì tùy thích rồi chạy ConsolData theo các biến đã khai báo

Khó quá anh ơi, chắc em phải theo kiểu cổ xưa thôi cho chắc ăn. Khi nào thấy được code thì may ra em có thể edit lại để ứng dụng
 
Khó quá anh ơi, chắc em phải theo kiểu cổ xưa thôi cho chắc ăn. Khi nào thấy được code thì may ra em có thể edit lại để ứng dụng

Chẳng khó gì đâu! Suy nghĩ đi
(vì nếu tôi đưa code lên thì chú lại.. hối hận sao nó dễ quá)
Ẹc... Ẹc...
 
Có 1 cái khó là chúng ta cũng chẳng biết sẽ tổng hợp từ sheet nào đến sheet nào nữa. Nhiều khi cắc cớ, tổng hợp sheet1, sheet4, sheet5, sheet 6 hoặc tổng hợp toàn bộ, trừ 1 sheet nào đó chẳng hạn ---> Khi ấy nếu viết code dạng tổng quát sẽ khó vô cùng
Tôi nghĩ rằng nên viết theo kiểu này:
PHP:
Sub ConsolData(ByVal wksArray, sRng As String, rTarget As Range)
Biến wksArray là 1 mảng chứa các tên sheet cần tổng hợp ---> Do người dùng tự khai báo (tức là giao cái phần "cắc cớ" này cho người dùng)
Biến sRng là địa chỉ vùng dữ liệu (dạng chuổi) ---> Do người dùng tự khai báo
Biến rTarget là nơi đặt kết quả ---> Do người dùng tự khai báo
Xong, viết thêm 1 sub, khai báo gì tùy thích rồi chạy ConsolData theo các biến đã khai báo
anh nói vậy mà suy nghĩ từ qua đến giờ mà đầu óc cứ mơ mơ màng màng. nghĩ hỏng ra. có khi code chỉ có vài dòng mà nghỉ không ra , giống như ứng dụng vba vào pivot table của sư phụ ptm0412 nếu sư phụ ko đưa code lên có mà em nghỉ cả năm chưa chắc ra kq
 
Lần chỉnh sửa cuối:
Code Consolidate sai chỗ nào

Mình dùng For .. Next để tạo chuỗi tam
Xét chuỗi tam sau khi chạy hết vòng lập sẽ tương đương chuỗi trong mãng Array("'T1... "'T12) như trong code
Nhưng khi khai báo MANG=Array(tam) thì code không chạy được

Khi cho chạy trực tiếp chuỗi trong mãng thì chạy được

Anh chị xem giúp code thế nào cho đúng

PHP:
Sub consolidate()
Dim MANG, sh, tam
For Each sh In Worksheets
  If sh.Name <> "Consolidate" Then
   tam = tam & """'" & sh.Name & "'!R1C1:R6542C21"", "
  End If
Next
tam = Left(tam, Len(tam) - 2)
MANG = Array(tam)
'MANG = Array("'T1'!R1C1:R6542C21", "'T2'!R1C1:R6542C21", "'T3'!R1C1:R6542C21", "'T4'!R1C1:R6542C21", "'T5'!R1C1:R6542C21", "'T6'!R1C1:R6542C21", "'T7'!R1C1:R6542C21", "'T8'!R1C1:R6542C21", "'T9'!R1C1:R6542C21", "'T10'!R1C1:R6542C21", "'T11'!R1C1:R6542C21", "'T12'!R1C1:R6542C21")
[A3].consolidate MANG, 9, 1, 1
End Sub
 
Khai báo Mang = Array(...) thì bên trong 2 dấu () phải là các phần tử (dạng chuỗi) cách nhau bởi dấu phẩy chứ, sao lại là 1 chuỗi đính liền?
Là 1 chuỗi dính liền, thì VBA hiểu là mảng 1 phần tử là 1 chuỗi dài ngoằng!

Nói cách khác:
Sự khác biệt là 1 đằng các dấu phẩy nằm chung trong 1 chuỗi, 1 đằng là nhiều chuỗi cách nhau bởi dấu phẩy.
 
Mình dùng For .. Next để tạo chuỗi tam
Xét chuỗi tam sau khi chạy hết vòng lập sẽ tương đương chuỗi trong mãng Array("'T1... "'T12) như trong code
Nhưng khi khai báo MANG=Array(tam) thì code không chạy được

Khi cho chạy trực tiếp chuỗi trong mãng thì chạy được

Anh chị xem giúp code thế nào cho đúng

PHP:
Sub consolidate()
Dim MANG, sh, tam
For Each sh In Worksheets
  If sh.Name <> "Consolidate" Then
   tam = tam & """'" & sh.Name & "'!R1C1:R6542C21"", "
  End If
Next
tam = Left(tam, Len(tam) - 2)
MANG = Array(tam)
'MANG = Array("'T1'!R1C1:R6542C21", "'T2'!R1C1:R6542C21", "'T3'!R1C1:R6542C21", "'T4'!R1C1:R6542C21", "'T5'!R1C1:R6542C21", "'T6'!R1C1:R6542C21", "'T7'!R1C1:R6542C21", "'T8'!R1C1:R6542C21", "'T9'!R1C1:R6542C21", "'T10'!R1C1:R6542C21", "'T11'!R1C1:R6542C21", "'T12'!R1C1:R6542C21")
[A3].consolidate MANG, 9, 1, 1
End Sub
Gì kỳ cục vậy trời!
Ít ra phải vầy chứ:
PHP:
Sub consolidate()
  Dim sh, wksArray(), n As Long
  For Each sh In Worksheets
    If sh.Name <> "Consolidate" Then
      n = n + 1
      ReDim Preserve wksArray(1 To n)
      wksArray(n) = "'" & sh.Name & "'!R1C1:R6542C21"
    End If
  Next
  Sheets("Consolidate").Range("A3").Consolidate wksArray, 9, 1, 1
End Sub
Viết đơn giản chơi thôi chứ nếu để xài thật thì còn phải sửa rất nhiều
 
Gì kỳ cục vậy trời!
Ít ra phải vầy chứ:
PHP:
Sub consolidate()
  Dim sh, wksArray(), n As Long
  For Each sh In Worksheets
    If sh.Name <> "Consolidate" Then
      n = n + 1
      ReDim Preserve wksArray(1 To n)
      wksArray(n) = "'" & sh.Name & "'!R1C1:R6542C21"
    End If
  Next
  Sheets("Consolidate").Range("A3").Consolidate wksArray, 9, 1, 1
End Sub
Viết đơn giản chơi thôi chứ nếu để xài thật thì còn phải sửa rất nhiều
Cũng lạ thiệt, em cũng đã code y như thế này vậy mà nó không chạy, giờ copy code của anh thì chạy ào ào.

Giờ hiểu rồi, em gán chuỗi trật lất, dư ra mấy cái dấu nháy

Arr(i) = """'" & sh.Name & "'!R1C1:R6542C21"""
 
Lần chỉnh sửa cuối:
Nếu sửa lại mấy chỗ "trật lất" đó, code có chạy không Hải?

Dạ khi em sửa lại dựa theo cách của anh NDU thì code này chạy được, nhưng anh hỏi thì chắc có gì đó không ổn với code rồi.

Anh gợi ý giúp em với

PHP:
Sub consolidate()
  Dim sh, Arr(), i As Long
  For Each sh In Worksheets
    If sh.Name <> "Consolidate" Then
      ReDim Preserve Arr(i)
      Arr(i) = "'" & sh.Name & "'!R1C1:R6542C21"
      i = i + 1
    End If
  Next
  Sheets("Consolidate").Range("A3").consolidate Arr, 9, 1, 1
End Sub
Hoặc thế này cũng chạy được
PHP:
Sub consolidate2()
Dim sh, tam
For Each sh In Worksheets
  If sh.Name <> "Consolidate" Then  tam = tam & "'" & sh.Name & "'!R1C1:R6542C21" & ","
Next
tam = Left(tam, Len(tam) - 1)
tam = Split(tam, ",")
Sheets("Consolidate").[A3].consolidate tam, 9, 1, 1
End Sub
 
Lần chỉnh sửa cuối:
Dạ khi em sửa lại dựa theo cách của anh NDU thì code này chạy được, nhưng anh hỏi thì chắc có gì đó không ổn với code rồi.
Anh gợi ý giúp em với
Không ổn ở chỗ:
Mảng là 1 chuỗi duy nhất và dài ngoằng, lại không phải tham chiếu, khi chạy consolidate nó bị lỗi SubScript out of range. Mảng 1 phần tử nhưng là tham chiếu cũng vẫn chạy nhé.

Split thì lại khác: Chuỗi dài ngoằng tách ra thành nhiều chuỗi con, mỗi chuỗi con là 1 phần tử và là 1 tham chiếu.

(Bài 19 cũng đã nói rồi, đã đọc, đã nhấn nút cám ơn, mà ... hình như đọc kiểu cưỡi ngựa xem hoa)
 
Lần chỉnh sửa cuối:
Chào mọi người!
Mọi người cho em hỏi
Em có 1 bảng trên 1 sheet, có khỏan 39000 dòng. Trong bảng này có nhiều cột, trong đó em quan tâm đến cột "code hải quan" và cột "số tồn cuối kỳ" tương ứng.
Em dùng consolidate để tổng hợp số tồn cuối kỳ theo từng code hải quan.
Nhưng lúc ra kết quả của thao tác consolidate thì có code hải quan xuất hiện tới 2 lần. Em không hiểu vì sao. Nhưng vì file nặng quá nên em ko đính kèm để mọi người xem giúp em được.
Vậy có những nguyên nhân nào có thể dẫn đến việc lọc không duy nhất này ạ?
Em cảm ơn mọi người!
P/s: khi làm consolidate em chỉ copy tiêu đề 2 cột "code hải quan" và "số tồn cuối năm" và quét vùng dữ liệu có chứa 2 cột này. Không biết đây có phải là 1 trong những nguyên nhân không?
 
Chào mọi người!
Mọi người cho em hỏi
Em có 1 bảng trên 1 sheet, có khỏan 39000 dòng. Trong bảng này có nhiều cột, trong đó em quan tâm đến cột "code hải quan" và cột "số tồn cuối kỳ" tương ứng.
Em dùng consolidate để tổng hợp số tồn cuối kỳ theo từng code hải quan.
Nhưng lúc ra kết quả của thao tác consolidate thì có code hải quan xuất hiện tới 2 lần. Em không hiểu vì sao. Nhưng vì file nặng quá nên em ko đính kèm để mọi người xem giúp em được.
Vậy có những nguyên nhân nào có thể dẫn đến việc lọc không duy nhất này ạ?
Em cảm ơn mọi người!
P/s: khi làm consolidate em chỉ copy tiêu đề 2 cột "code hải quan" và "số tồn cuối năm" và quét vùng dữ liệu có chứa 2 cột này. Không biết đây có phải là 1 trong những nguyên nhân không?
Consolidate làm việc chắc chắn không sai
Nếu bạn "nhìn" thấy 1 code xuất hiện 2 lần thì hãy kiểm tra lại, có thể 2 code này nhìn giống nhau nhưng 1 cái có khoảng trắng phía sau thì sao? ---> Kiểm tra đơn giản bằng biểu thức so sánh = chẳng hạn
Ngoài Consolidate ra, bạn cũng có thể chọn giải pháp PivotTable, vì nó có khả năng tự cập nhật khi dữ liệu nguồn thay đổi luôn
 
Em làm theo cách anh ndu96081631 chỉ, thì đúng là có những ô nhìn giống nhau nhưng bản chất lại khác nhau nên kết quả consolidate của em mới bị vậy.
Và cũng nhờ đó mà em mới biết '083khoản cách + '083 là khác nhau hoàn toàn dù nhìn vào thì 2 cell này hoàn toàn giống nhau, đều là 083 và có dấu nháy màu xanh ở góc bên trái
Em cảm ơn anh ndu ạ!
 

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

Back
Top Bottom