Cộng dữ liệu trong mảng 2 chiều. (1 người xem)

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

nhatrangsea

Thành viên mới
Tham gia
10/12/11
Bài viết
3
Được thích
1
Chào các bạn, lần đầu tiên post bài nên nếu có gì không phải mong các bạn bỏ qua. Mình đang vướng ở phần tính toán mảng 2 chiều từ dữ liệu của mảng khác, số liệu của mảng quá lớn nên tính rất chậm, mình đang tìm cách rút gọn lại để tính nhanh hơn nhưng chưa nghĩ ra. Mình có gửi file dữ liệu đính kèm.

Lưu ý : File đính kèm chỉ mình chỉ rút gọn trong 1 tháng mẫu, file gốc bao gồm cả 12 tháng nên rất lớn.

Yêu cầu công việc : Tính tổng từng loại vật tư trong Sheet "XUAT KHO" tương ứng với từng ngày trong tháng và đưa vào vị trí tương ứng trong Sheet "TONG HOP"

Phương án giải quyết :
1. Dùng hàm SUMIFS của Excel để tính trực tiếp trên từng cell -> kết quả : tính trong 1 tháng thì tạm ổn, tính toàn bộ cho 24 tháng máy tính "ngu luôn" ==> không khả thi.
2. Dùng VBA.
2a. Đọc toàn bộ chủng loại vật tư trong Sheet "TONG HOP" đưa vào mảng TH.
2b. Đọc toàn bộ chủng loại vật tư trong Sheet "XUAT KHO" đưa vào mảng DATA.
2c. Dùng vòng lặp FOR để so sánh dữ liệu trong mảng DATA với TH, nếu trùng cả tên vật tư & ngày thì cộng dồn số liệu và đưa vào vị trí tương ứng trong mảng TH
- Sau khi tính toán xong thì ghi lại toàn bộ giá trị của mảng TH vào Sheet "TONG HOP" theo vị trí tương ứng.
Kết quả : tốc độ xử lý có nhanh hơn phương án 1 nhưng cũng vẫn chậm


Mình nghĩ phương án dùng vỏng FOR ở phần 2C có lẽ chưa tối ưu nên đang tìm cách giải quyết mà chưa ra. Mong các bạn giúp đỡ. Xin cảm ơn.
 

File đính kèm

đọc ko cũng muốn oải luôn
tôi làm thử bằng pivot, bạn xem có đúng ý ko
 

File đính kèm

Upvote 0
đọc ko cũng muốn oải luôn
tôi làm thử bằng pivot, bạn xem có đúng ý ko

Thank bác nhiều, tính mình khi muốn hỏi 1 vấn đề j về lập trình là phải diễn giải chi tiết rõ ràng để người # hiểu nên hơi dài dòng. Phương án xài Pivol của bác hay quá & nói thật là chưa từng rờ qua cái Pivol này !$@!!, chắc phải xem lại coi thế nào :D
 
Upvote 0
Chào các bạn, lần đầu tiên post bài nên nếu có gì không phải mong các bạn bỏ qua. Mình đang vướng ở phần tính toán mảng 2 chiều từ dữ liệu của mảng khác, số liệu của mảng quá lớn nên tính rất chậm, mình đang tìm cách rút gọn lại để tính nhanh hơn nhưng chưa nghĩ ra. Mình có gửi file dữ liệu đính kèm.

Lưu ý : File đính kèm chỉ mình chỉ rút gọn trong 1 tháng mẫu, file gốc bao gồm cả 12 tháng nên rất lớn.

Yêu cầu công việc : Tính tổng từng loại vật tư trong Sheet "XUAT KHO" tương ứng với từng ngày trong tháng và đưa vào vị trí tương ứng trong Sheet "TONG HOP"

Phương án giải quyết :
1. Dùng hàm SUMIFS của Excel để tính trực tiếp trên từng cell -> kết quả : tính trong 1 tháng thì tạm ổn, tính toàn bộ cho 24 tháng máy tính "ngu luôn" ==> không khả thi.
2. Dùng VBA.
2a. Đọc toàn bộ chủng loại vật tư trong Sheet "TONG HOP" đưa vào mảng TH.
2b. Đọc toàn bộ chủng loại vật tư trong Sheet "XUAT KHO" đưa vào mảng DATA.
2c. Dùng vòng lặp FOR để so sánh dữ liệu trong mảng DATA với TH, nếu trùng cả tên vật tư & ngày thì cộng dồn số liệu và đưa vào vị trí tương ứng trong mảng TH
- Sau khi tính toán xong thì ghi lại toàn bộ giá trị của mảng TH vào Sheet "TONG HOP" theo vị trí tương ứng.
Kết quả : tốc độ xử lý có nhanh hơn phương án 1 nhưng cũng vẫn chậm


Mình nghĩ phương án dùng vỏng FOR ở phần 2C có lẽ chưa tối ưu nên đang tìm cách giải quyết mà chưa ra. Mong các bạn giúp đỡ. Xin cảm ơn.

Mã:
Sub TH()
Dim a(), c As Range
Set s = Selection
ReDim a(1 To s.Count, 1 To 31)
For Each cell In s
i = i + 1
Set c = Sheets("XUAT KHO").UsedRange.Find(cell, , , xlWhole)
If Not c Is Nothing Then
fa = c.Address
Do
    a(i, c.Offset(, -3)) = a(i, c.Offset(, -3)) + c.Offset(, 2)
    Set c = Sheets("XUAT KHO").UsedRange.FindNext(c)
Loop While c.Address <> fa
End If
Next
s(1).Offset(, 1).Resize(i, 31) = a
End Sub
chọn vùng dữ liệu trong cột B sheet TONG HOP rồi chạy code trên
 
Upvote 0
Mã:
Sub TH()
Dim a(), c As Range
Set s = Selection
ReDim a(1 To s.Count, 1 To 31)
For Each cell In s
i = i + 1
Set c = Sheets("XUAT KHO").UsedRange.Find(cell, , , xlWhole)
If Not c Is Nothing Then
fa = c.Address
Do
    a(i, c.Offset(, -3)) = a(i, c.Offset(, -3)) + c.Offset(, 2)
    Set c = Sheets("XUAT KHO").UsedRange.FindNext(c)
Loop While c.Address <> fa
End If
Next
s(1).Offset(, 1).Resize(i, 31) = a
End Sub
chọn vùng dữ liệu trong cột B sheet TONG HOP rồi chạy code trên

Quá hay, phải ghi vào sổ tay mới được. Thank bác nhiều
 
Upvote 0
Chào các bạn, lần đầu tiên post bài nên nếu có gì không phải mong các bạn bỏ qua. Mình đang vướng ở phần tính toán mảng 2 chiều từ dữ liệu của mảng khác, số liệu của mảng quá lớn nên tính rất chậm, mình đang tìm cách rút gọn lại để tính nhanh hơn nhưng chưa nghĩ ra. Mình có gửi file dữ liệu đính kèm.

Lưu ý : File đính kèm chỉ mình chỉ rút gọn trong 1 tháng mẫu, file gốc bao gồm cả 12 tháng nên rất lớn.

Yêu cầu công việc : Tính tổng từng loại vật tư trong Sheet "XUAT KHO" tương ứng với từng ngày trong tháng và đưa vào vị trí tương ứng trong Sheet "TONG HOP"

Phương án giải quyết :
1. Dùng hàm SUMIFS của Excel để tính trực tiếp trên từng cell -> kết quả : tính trong 1 tháng thì tạm ổn, tính toàn bộ cho 24 tháng máy tính "ngu luôn" ==> không khả thi.
2. Dùng VBA.
2a. Đọc toàn bộ chủng loại vật tư trong Sheet "TONG HOP" đưa vào mảng TH.
2b. Đọc toàn bộ chủng loại vật tư trong Sheet "XUAT KHO" đưa vào mảng DATA.
2c. Dùng vòng lặp FOR để so sánh dữ liệu trong mảng DATA với TH, nếu trùng cả tên vật tư & ngày thì cộng dồn số liệu và đưa vào vị trí tương ứng trong mảng TH
- Sau khi tính toán xong thì ghi lại toàn bộ giá trị của mảng TH vào Sheet "TONG HOP" theo vị trí tương ứng.
Kết quả : tốc độ xử lý có nhanh hơn phương án 1 nhưng cũng vẫn chậm


Mình nghĩ phương án dùng vỏng FOR ở phần 2C có lẽ chưa tối ưu nên đang tìm cách giải quyết mà chưa ra. Mong các bạn giúp đỡ. Xin cảm ơn.
Nếu không muốn lọc theo năm và tháng thì bỏ 2 dk đó ra
Đảm bảo chạy nhấp nháy là xong
PHP:
Sub tonghop()
Dim data(), Xuat(), i,  thang, nam
With Sheet1
   thang = CLng(Mid(.[c5], 7, 1))
   nam = CLng(Right(.[c5], 4))
   data = .Range(.[A7], .[A65536].End(3)).Resize(, 2).Value
   ReDim Preserve data(1 To UBound(data), 1 To 33)
End With
With Sheet2
   Xuat = .Range(.[A2], .[A65536].End(3)).Resize(, 6).Value  
End With
With CreateObject("scripting.dictionary")
For i = 1 To UBound(data)
   .Item(data(i, 2)) = i
Next
For i = 1 To UBound(Xuat)
   If CLng(Xuat(i, 3)) = nam Then
      If CLng(Xuat(i, 2)) = thang Then
         If .exists(Xuat(i, 4)) Then
            data(.Item(Xuat(i, 4)), Xuat(i, 1) + 2) = _
            data(.Item(Xuat(i, 4)), Xuat(i, 1) + 2) + Xuat(i, 6)
         End If
      End If
   End If
Next
End With
Sheet1.[A7].Resize(UBound(data), 33) = data
End Sub
 
Upvote 0

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

Back
Top Bottom