Nhờ anh chị giúp tính tổng theo điều kiện cho trước bằng vba (4 người xem)

Liên hệ QC

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

huuphuoc1204

Thành viên mới
Tham gia
17/12/09
Bài viết
43
Được thích
5
Chào các anh chị trên diễn đàn. Em có một file excel cần tính tổng tự động và đối chiếu với dữ liệu cho trước, sau đó nếu thoả mãn thì coppy vùng dữ liệu đó vào vùng dữ liệu mới cụ thể như sau:
1. ở ô L25 có giá trị là 208.12, bây giờ em muốn tạo một hàm tính sum tự động từ ô P2 đến ô Pn sau cho tổng của nó nhỏ hơn số liệu ở ô L23 là 208.12 nếu từ P2 đến Pn+1 mà lớn hơn 208.12 thì tự lùi lại 1 ô để nhỏ hơn 208.12 là được. Sau đó tô vùng dữ liệu đó, và coppy vùng P2 đến Qn vào vùng A2 đến Bn
2. Ở ô L27 có có giá trị là 206.97, mình sẽ lấy giá trị ô tiếp theo (Pn+1) ngoài vùng đã chọn và so sánh ở trên, cũng tính tổng sum từ ô tiếp theo đó đến ô có giá trị nhỏ hơn 206.97 nếu cộng ô tiếp theo mà lớn hơn 206.97 thì lùi lại một ô để giá trị nhỏ hơn 206.97 là được. Cũng tô màu vùng này ( Pn+1 đến Qn+...) với màu khác và coppy vào vùng C2 đến Dn.
3. Tương tự với ô L29, L31, L33.....
Em có gửi file đính kèm và nhờ anh chị giúp giùm. Cám ơn anh chị nhiều!!
 

File đính kèm

Chào các anh chị trên diễn đàn. Em có một file excel cần tính tổng tự động và đối chiếu với dữ liệu cho trước, sau đó nếu thoả mãn thì coppy vùng dữ liệu đó vào vùng dữ liệu mới cụ thể như sau:
1. ở ô L25 có giá trị là 208.12, bây giờ em muốn tạo một hàm tính sum tự động từ ô P2 đến ô Pn sau cho tổng của nó nhỏ hơn số liệu ở ô L23 là 208.12 nếu từ P2 đến Pn+1 mà lớn hơn 208.12 thì tự lùi lại 1 ô để nhỏ hơn 208.12 là được. Sau đó tô vùng dữ liệu đó, và coppy vùng P2 đến Qn vào vùng A2 đến Bn
2. Ở ô L27 có có giá trị là 206.97, mình sẽ lấy giá trị ô tiếp theo (Pn+1) ngoài vùng đã chọn và so sánh ở trên, cũng tính tổng sum từ ô tiếp theo đó đến ô có giá trị nhỏ hơn 206.97 nếu cộng ô tiếp theo mà lớn hơn 206.97 thì lùi lại một ô để giá trị nhỏ hơn 206.97 là được. Cũng tô màu vùng này ( Pn+1 đến Qn+...) với màu khác và coppy vào vùng C2 đến Dn.
3. Tương tự với ô L29, L31, L33.....
Em có gửi file đính kèm và nhờ anh chị giúp giùm. Cám ơn anh chị nhiều!!
bạn hoàn thiện nốt nhé hết giờ làm rồi :D mình về vẫn còn sai sót mong mọi người hỗ trợ thêm
Mã:
Sub dien()
Dim a, b, c, i, j, k As Long
Dim arr, arr1, arr2()
Dim s, s1 As String
arr = Sheet3.Range("P2:q" & Sheet3.Range("P" & Rows.Count).End(xlUp).Row).Value
ReDim arr1(1 To UBound(arr, 1), 1 To 2)
b = Sheet3.Range("l25").Value
a = 0
c = 0
k = -1
  For i = 1 To UBound(arr, 1)
    c = c + 1
    a = a + arr(i, 1)
    arr1(c, 1) = arr(i, 1)
    arr1(c, 2) = arr(i, 2)
    If a > b Then
       i = i - 1
       k = k + 2
       Sheet3.Cells(2, k).Resize(c - 1, 2) = arr1
       c = 0
       a = 0
       b = Sheet3.Range("l" & 24 + k).Value
       arr1 = arr2()
       ReDim arr1(1 To UBound(arr, 1), 1 To 2)
    End If
  Next i
  k = k + 2
   Sheet3.Cells(2, k).Resize(c, 2) = arr1
 
End Sub
 
Lần chỉnh sửa cuối:
Cám ơn bạn rất nhiều. Nhờ bạn bạn giúp thêm điền vào cột I và cột J, tô màu vùng đã tính giùm mình được không?!Thật sự nhìn vào mình không hiểu cho lắm!. Với lại code chạy rất tốt với dữ liệu mình đã gửi nhưng có một vấn đề là dữ liệu ô L25, L27, L29, L31, L33 và cả vùng dữ liệu từ P2 đến Pn có thể thay đổi tuỳ người nhập. Mình đã thay đổi thử ở dòng L25 là giá trị 250 thì công thức điền vào nó lấy khoảng không đúng nữa. Cụ thể là cột C là tổng sum lớn hơn giá trị ô L27, cột G tổng sum vẫn có thể cộng thêm đến hết giá trị còn lại của cột P nhưng nó chỉ lấy đến 14.5. Mình có kèm file bạn xem lại giúp mình được không. Cám ơn bạn nhiều!
 

File đính kèm

Cám ơn bạn rất nhiều. Nhờ bạn bạn giúp thêm điền vào cột I và cột J, tô màu vùng đã tính giùm mình được không?!Thật sự nhìn vào mình không hiểu cho lắm!. Với lại code chạy rất tốt với dữ liệu mình đã gửi nhưng có một vấn đề là dữ liệu ô L25, L27, L29, L31, L33 và cả vùng dữ liệu từ P2 đến Pn có thể thay đổi tuỳ người nhập. Mình đã thay đổi thử ở dòng L25 là giá trị 250 thì công thức điền vào nó lấy khoảng không đúng nữa. Cụ thể là cột C là tổng sum lớn hơn giá trị ô L27, cột G tổng sum vẫn có thể cộng thêm đến hết giá trị còn lại của cột P nhưng nó chỉ lấy đến 14.5. Mình có kèm file bạn xem lại giúp mình được không. Cám ơn bạn nhiều!
mình sửa xong rồi nhưng nó vẫn còn vài hạn chế là khi dữ liệu nó chạy quá dòng thì mình không ngắt được bạn test lại xem nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Định làm thử nhưng xem qua file thấy cấu trúc dữ liệu thiết kế sai rồi. Phần cố định lại chặn ngay cổ họng phần biến động.
Dãy kết quả (số SFF) có biết trước tối đa là bao nhiêu đâu mà để lên trên thế kia, lúc úp xuống bảng tính nó chèn lên phần cố định thì ngồi cười. Chưa kể số lượng cặp cột kết quả cũng đâu cố định.

- Bê 2 cột P:Q về cột A:B
- Bê 2 cột K:L về cột C: D, và đẩy lên đầu luôn (từ dòng 4 chẳng hạn)
- Vùng cột A:J cũ thì đảo (lên-xuống) vị trí 2 phần điền dữ liệu và phần công thức cho nhau, rồi đẩy sang từ cột E.
 
mình sửa xong rồi nhưng nó vẫn còn vài hạn chế là khi dữ liệu nó chạy quá dòng thì mình không ngắt được bạn test lại xem nhé
Thật sự cám ơn bạn rất rất nhiều. Code chạy đúng ý mình.Nhưng có một điều mình chưa nêu rõ là L28 có giá trị lúc nào cũng lớn hơn 0, nhưng có lúc L30 =0 hoặc L32=0 hoặc L34=0 hoặc L36=0 mình muốn ví dụ như L28 thoả điều kiên thì lấy đúng khoảng P2 đến Pn nhỏ hơn L38, xét tới L30 nếu =0 thì dừng lệnh không cần xét tiếp chỉ lấy khoảng P2 đến Pn bỏ vào cột A:B, tương tự nếu L30>0 thì xét tiếp đến L32, nếu L32=0 thì dừng lệnh và coppy khoảng thoả điều kiện nhỏ hơn L30 coppy vào cột C: D .Tương tự với L34, L36.
Có một vấn đề nữa là khi đã xét các điều kiên thoả mãn trong từ ô L28, L30, L34, L36 vùng dữ liệu ở cột P2 đến Pn nó nếu dư ra nó bê luôn và dán vào cột K:L. Mình có cách nào ngắt nó và chỉ coppy vào khoảng vùng cố định A:J không bạn. Nếu nó dư thì không xét tiếp ngắt đến đó thôi. (lỗi này xảy ra khi L30, L34, L36, L38 bằng 0). Mong bạn giúp mình lần nữa!
 

File đính kèm

Thật sự cám ơn bạn rất rất nhiều. Code chạy đúng ý mình.Nhưng có một điều mình chưa nêu rõ là L28 có giá trị lúc nào cũng lớn hơn 0, nhưng có lúc L30 =0 hoặc L32=0 hoặc L34=0 hoặc L36=0 mình muốn ví dụ như L28 thoả điều kiên thì lấy đúng khoảng P2 đến Pn nhỏ hơn L38, xét tới L30 nếu =0 thì dừng lệnh không cần xét tiếp chỉ lấy khoảng P2 đến Pn bỏ vào cột A:B, tương tự nếu L30>0 thì xét tiếp đến L32, nếu L32=0 thì dừng lệnh và coppy khoảng thoả điều kiện nhỏ hơn L30 coppy vào cột C: D .Tương tự với L34, L36.
Có một vấn đề nữa là khi đã xét các điều kiên thoả mãn trong từ ô L28, L30, L34, L36 vùng dữ liệu ở cột P2 đến Pn nó nếu dư ra nó bê luôn và dán vào cột K:L. Mình có cách nào ngắt nó và chỉ coppy vào khoảng vùng cố định A:J không bạn. Nếu nó dư thì không xét tiếp ngắt đến đó thôi. (lỗi này xảy ra khi L30, L34, L36, L38 bằng 0). Mong bạn giúp mình lần nữa!
Bạn xem đúng ý chưa nhé
 

File đính kèm

Định làm thử nhưng xem qua file thấy cấu trúc dữ liệu thiết kế sai rồi. Phần cố định lại chặn ngay cổ họng phần biến động.
Dãy kết quả (số SFF) có biết trước tối đa là bao nhiêu đâu mà để lên trên thế kia, lúc úp xuống bảng tính nó chèn lên phần cố định thì ngồi cười. Chưa kể số lượng cặp cột kết quả cũng đâu cố định.

- Bê 2 cột P:Q về cột A:B
- Bê 2 cột K:L về cột C: D, và đẩy lên đầu luôn (từ dòng 4 chẳng hạn)
- Vùng cột A:J cũ thì đảo (lên-xuống) vị trí 2 phần điền dữ liệu và phần công thức cho nhau, rồi đẩy sang từ cột E.
Cám ơn bạn đã nhắc nhở, đúng là mình chưa nêu rõ giới hạn số SFF là 24 dòng không tính dòng tiêu đề( A2:J24) vì nếu giả sử L28 có giá trị lớn nhưng vùng dữ liệu lấy từ P2 đến Pn (không lớn hơn 24 dòng) khi tính tổng sum là đủ để so sánh với ô L28. Mình đã thử dùng code VBA của bạn snow25 là OK nhưng nó chỉ ngắt dòng đúng khi các L28, L30, L36, L38 >0 nhưng khi L30=0 hoặc L32=0 hoặc L34=0 hoặc L36=0 thì nó bị lỗi và coppy chạy tràn qua cột K:L. Bạn có thể giúp mình ngắt dòng theo điều kiện nếu L28 >0 (giá trị L28 bắt buộc lúc nào cũng lớn hơn 0), sau khi xét thoả mãn vùng tính sum từ ô P2 đến Pn nhỏ hơn L28 (nếu sum đó lớn hơn L28 thì lùi lại 1 ổ để giá trị đó nhỏ hơn L28) thì coppy khoảng P2: Qn đó vào cột A:B, xét tiếp L30 nếu L30=0 thì dừng lệnh và không coppy gì vào vùng C: D. Nếu L30>0 thì tính tổng sum từ ô tiếp theo Pn+1 đến P... so sánh với ô L30, và nếu thoả mãn điều kiện nhỏ hơn L30 (nếu vùng sum đó lớn hơn thì cũng lùi lại 1 ô để nhỏ hơn L30), coppy vùng Pn+1: Q... đó vào cột C: D. Tương tự với L32, L34,
L36 nếu bằng 0 thì dừng lệnh không coppy, nếu lớn hơn 0 thì xét và coppy vào các cột tiếp theo (E:F, G:H, I:J). Mình gửi file đính kèm rất mong bạn giúp đỡ. Cám ơn!
 

File đính kèm

File đính kèm

có 1 vấn đề mình làm thêm là trong trường hợp nó lơn hơn 24 dòng mình sẽ ngắt và chuyển sang bên cạnh bạn xem nhé.tại do bạn không nêu hết từ đầu cứ viết thêm vào làm linh tinh hết.
File không điền vào cột I:J khi vẫn đủ giá trị bạn ơi. Mong bạn xem lại giúp mình.
 

File đính kèm

Web KT

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

Back
Top Bottom