Xin code tính trung bình theo nhiều điều kiện khi dữ liệu lớn (2 người xem)

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

Tôi tuân thủ nội quy khi đăng bài

tangoctuan

Thành viên hoạt động
Tham gia
22/4/08
Bài viết
154
Được thích
20
Kính nhờ các bạn hỗ trợ giúp bài toán của mình, mình có gửi file đính kèm. Từ cột A - cột BA là dữ liệu có sẵn. Cột BB và BC là kết quả mong muốn trả về (bôi màu tím) mình đang đặt công thức thủ công. Dữ liệu thực tế có trường hợp lên đến 100.000-200.000 dòng nên mong muốn một giải pháp sử dụng VBA vì nếu dùng hàm e rằng sẽ chạy rất lâu.
Công ty có dữ liệu chi phí các máy trong nhiều năm. Mình muốn tính giá trị trung bình các tháng trước và sau thời điểm chọn làm mốc cho mỗi máy.
Ví dụ với năm 2025:

Lấy 6/2025 làm mốc => kết quả mong muốn nhận được là vùng màu tím (bỏ qua giá trị của tháng mốc). Trường hợp số tháng lấy TB nhiều hơn số tháng có trong dữ liệu thì lấy tối đa có thể.
Dữ liệu thực tế sẽ như file đính kèm bao gồm nhiều năm (cột) và nhiều máy (dòng) hơn rất nhiều, thời điểm lấy làm mốc cũng khác nhau. Nhờ các bạn hỗ trợ giúp. Cảm ơn mọi người.
 

File đính kèm

Kính nhờ các bạn hỗ trợ giúp bài toán của mình, mình có gửi file đính kèm. Từ cột A - cột BA là dữ liệu có sẵn. Cột BB và BC là kết quả mong muốn trả về (bôi màu tím) mình đang đặt công thức thủ công. Dữ liệu thực tế có trường hợp lên đến 100.000-200.000 dòng nên mong muốn một giải pháp sử dụng VBA vì nếu dùng hàm e rằng sẽ chạy rất lâu.
Công ty có dữ liệu chi phí các máy trong nhiều năm. Mình muốn tính giá trị trung bình các tháng trước và sau thời điểm chọn làm mốc cho mỗi máy.
Ví dụ với năm 2025:

Lấy 6/2025 làm mốc => kết quả mong muốn nhận được là vùng màu tím (bỏ qua giá trị của tháng mốc). Trường hợp số tháng lấy TB nhiều hơn số tháng có trong dữ liệu thì lấy tối đa có thể.
Dữ liệu thực tế sẽ như file đính kèm bao gồm nhiều năm (cột) và nhiều máy (dòng) hơn rất nhiều, thời điểm lấy làm mốc cũng khác nhau. Nhờ các bạn hỗ trợ giúp. Cảm ơn mọi người.
Trong khi chờ đợi các giải pháp tốt hơn. Hãy thử tham khảo code trong file đính kèm
Nhấn nút Tính Trung bình để được kết quả từ BE3:....
 

File đính kèm

@Chủ bài đăng;
Lý ra bài loại này nên đăng ở mục này nè:
 
Kính nhờ các bạn hỗ trợ giúp bài toán của mình, mình có gửi file đính kèm. Từ cột A - cột BA là dữ liệu có sẵn. Cột BB và BC là kết quả mong muốn trả về (bôi màu tím) mình đang đặt công thức thủ công. Dữ liệu thực tế có trường hợp lên đến 100.000-200.000 dòng nên mong muốn một giải pháp sử dụng VBA vì nếu dùng hàm e rằng sẽ chạy rất lâu.
Công ty có dữ liệu chi phí các máy trong nhiều năm. Mình muốn tính giá trị trung bình các tháng trước và sau thời điểm chọn làm mốc cho mỗi máy.
Ví dụ với năm 2025:

Lấy 6/2025 làm mốc => kết quả mong muốn nhận được là vùng màu tím (bỏ qua giá trị của tháng mốc). Trường hợp số tháng lấy TB nhiều hơn số tháng có trong dữ liệu thì lấy tối đa có thể.
Dữ liệu thực tế sẽ như file đính kèm bao gồm nhiều năm (cột) và nhiều máy (dòng) hơn rất nhiều, thời điểm lấy làm mốc cũng khác nhau. Nhờ các bạn hỗ trợ giúp. Cảm ơn mọi người.
Thử code . . .
Mã:
Sub xyz()
  Dim arr(), dk(), res()
  Dim sR&, i&, j&, fY&, fD&, ck&
 
  On Error Resume Next
  With Sheets("Sheet1")
    fY = .Range("B1").Value
    fD = .Range("B2").Value
    arr = .Range("B3:AW" & .Range("A1000000").End(xlUp).Row).Value
    sR = UBound(arr)
    dk = .Range("AX3:BA3").Resize(sR).Value
  End With
  ReDim res(1 To sR, 1 To 6)
 
  For i = 1 To sR
    ck = (dk(i, 2) - fY) * 12 + dk(i, 1) - fD + 1
    For j = ck - dk(i, 3) To ck - 1
      res(i, 3) = res(i, 3) + arr(i, j)
      res(i, 4) = res(i, 4) + 1
    Next j
    res(i, 1) = res(i, 3) / res(i, 4)
    For j = ck + 1 To ck + dk(i, 4)
      res(i, 5) = res(i, 5) + arr(i, j)
      res(i, 6) = res(i, 6) + 1
    Next j
    res(i, 2) = res(i, 5) / res(i, 6)
  Next i
  Sheets("Sheet1").Range("BD3").Resize(sR, 2) = res
End Sub
Mã:
 

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

Back
Top Bottom