Xin code tính tổng nhiều dãy số liên tục

Liên hệ QC

bjboyn00b

Thành viên chính thức
Tham gia
17/12/10
Bài viết
84
Được thích
5
Gửi ACE
Mình đang bí ở khâu code tính tổng. quy luật là cứ ấn ctrl + End(xlDown) 5 lần thì sẽ sum của dãy số phía trên. lặp lại cho đến khi kết thúc bảng
Rất mong nhận được tư vấn của các bạn
 
Vì người Việt đối thoại mà không dùng tiếng Việt là không tôn trọng người khác. Không phải ai cũng chấp nhận điều đó.
Cảm ơn bạn nhiều. lại phiền bạn chỉ giáo
For I = 1 To Rng.Rows.Count
If IsNumeric(Rng(I, 8).Value) Or IsNumeric(Rng(I, 11).Value) Then ' Xét đến trường hợp nếu I-8 hoặc I-11 có giá trị
If InStr(Rng(I, 2).Value, "*") = 0 Then 'thì xét tiếp nếu I-2 không chứa * thì
Total(1) = Total(1) + Rng(I, 8).Value ' Giá trị biến total(1) bằng chính nó của bước trước cộng với I-8
Total(2) = Total(2) + Rng(I, 11).Value' tương tự giá trị biến total(2) bằng chính nó của bước trước cộng với I-11
Total(3) = Total(3) + Rng(I, 8).Value 'Giá trị biến total(3) giống như total(1) (mục đích đặt ra là để gắn Total(3) vào dòng 3*
ElseIf Rng(I, 2).Value = "***" Then'
Rng(I, 8).Value = Total(3) ' Thì tại I-8 bằng Total(3)
Else
Rng(I, 8).Value = Total(1)
Rng(I, 11).Value = Total(2)
If Rng(I, 2).Value = "**" Then
Total(1) = 0
Total(2) = 0
End If
End If
End If
Next
Đoạn code này mình không hiểu lắm, mình đang hiểu vòng lặp sẽ cộng liên tục nhưng theo mình hiểu thì đoạn lệnh Rng(I, 8).Value = Total(3) này nó đi qua sẽ cộng cả các dòng 1* và 2* , phần nào để nó bỏ đi cộng các dòng 1* và 2* nhỉ.
Nói chung từ chỗ mình không viết diễn giải nữa là mình không hiểu nguyên lý chạy .
Phiền bạn chỉ thêm mình với nhé :)
 
Upvote 0
Cảm ơn bạn nhiều. lại phiền bạn chỉ giáo
For I = 1 To Rng.Rows.Count
If IsNumeric(Rng(I, 8).Value) Or IsNumeric(Rng(I, 11).Value) Then ' Xét đến trường hợp nếu I-8 hoặc I-11 có giá trị
If InStr(Rng(I, 2).Value, "*") = 0 Then 'thì xét tiếp nếu I-2 không chứa * thì
Total(1) = Total(1) + Rng(I, 8).Value ' Giá trị biến total(1) bằng chính nó của bước trước cộng với I-8
Total(2) = Total(2) + Rng(I, 11).Value' tương tự giá trị biến total(2) bằng chính nó của bước trước cộng với I-11
Total(3) = Total(3) + Rng(I, 8).Value 'Giá trị biến total(3) giống như total(1) (mục đích đặt ra là để gắn Total(3) vào dòng 3*
ElseIf Rng(I, 2).Value = "***" Then'
Rng(I, 8).Value = Total(3) ' Thì tại I-8 bằng Total(3)
Else
Rng(I, 8).Value = Total(1)
Rng(I, 11).Value = Total(2)
If Rng(I, 2).Value = "**" Then
Total(1) = 0
Total(2) = 0
End If
End If
End If
Next
Đoạn code này mình không hiểu lắm, mình đang hiểu vòng lặp sẽ cộng liên tục nhưng theo mình hiểu thì đoạn lệnh Rng(I, 8).Value = Total(3) này nó đi qua sẽ cộng cả các dòng 1* và 2* , phần nào để nó bỏ đi cộng các dòng 1* và 2* nhỉ.
Nói chung từ chỗ mình không viết diễn giải nữa là mình không hiểu nguyên lý chạy .
Phiền bạn chỉ thêm mình với nhé :)
(A) If InStr(Rng(I, 2).Value, "*") = 0 Then 'thì xét tiếp nếu I-2 không chứa * thì
Total(1) = Total(1) + Rng(I, 8).Value ' Giá trị biến total(1) bằng chính nó của bước trước cộng với I-8
Total(2) = Total(2) + Rng(I, 11).Value' tương tự giá trị biến total(2) bằng chính nó của bước trước cộng với I-11
Total(3) = Total(3) + Rng(I, 8).Value 'Giá trị biến total(3) giống như total(1) (mục đích đặt ra là để gắn Total(3) vào dòng 3*
(B) ElseIf Rng(I, 2).Value = "***" Then'
Rng(I, 8).Value = Total(3) ' Thì tại I-8 bằng Total(3)
(C) Else
Rng(I, 8).Value = Total(1)
Rng(I, 11).Value = Total(2)
If Rng(I, 2).Value = "**" Then
Total(1) = 0
Total(2) = 0
End If
End If
End If
Next
Về cơ bản hàm if này có 3 phần
(A) Nếu cột B không chưa dấu * : rõ ràng khi đó là các dòng dữ liệu bình thường, Total(1),(2),(3) sẽ cộng hết toàn bộ giá trị
(B) Nếu cột B là dấu *** thì khi đó sẽ gán giá trị của total(3)
(C) Else: còn lại: Tức chắc chắn nó là * hoặc **, vì xét trên xuống nếu không có * là (A), 3 sao là (B) thì (C) này là * và **:
  • Nếu là * và ** thì đều gán giá trị total(1) và total(2) vào cả 2 dòng, vì nó giống nhau
  • Nếu là dòng * thì giá trị total(1) và total(2) vẫn sẽ phải giữ để sau đó gán cho dòng **, nhưng nếu gặp dòng ** rồi thì lúc đó phải reset total(1) và total(2) về lại 0 để sang chi nhánh khác tính tiếp, nếu không nó sẽ bị cộng dồn
 
Upvote 0
Cái này giống như bạn xuất ra từ SAP đúng không, mấy kiểu dữ liệu kiểu này mình gặp khá nhiều, chỉ cần 1 chút kỹ năng Excel là trong vòng vài giây là xong, không cần phải dùng tới VBA đâu bạn.
Cách làm của mình thường sử dụng là Goto Find Blanks -> Delete Rows, chỉ giữ lại số Total ở mỗi vendor rồi cộng là được mà.
Việc của bạn là tùy biến layout sao cho dễ thao tác thôi. Đấy là cách mình vẫn hay làm, cho dù dữ liệu có hàng trăm hay hàng ngàn vendor vẫn cộng lại số total tốt. Bạn có thể tham khảo.
 
Upvote 0
Về cơ bản hàm if này có 3 phần
(A) Nếu cột B không chưa dấu * : rõ ràng khi đó là các dòng dữ liệu bình thường, Total(1),(2),(3) sẽ cộng hết toàn bộ giá trị
(B) Nếu cột B là dấu *** thì khi đó sẽ gán giá trị của total(3)
(C) Else: còn lại: Tức chắc chắn nó là * hoặc **, vì xét trên xuống nếu không có * là (A), 3 sao là (B) thì (C) này là * và **:
  • Nếu là * và ** thì đều gán giá trị total(1) và total(2) vào cả 2 dòng, vì nó giống nhau
  • Nếu là dòng * thì giá trị total(1) và total(2) vẫn sẽ phải giữ để sau đó gán cho dòng **, nhưng nếu gặp dòng ** rồi thì lúc đó phải reset total(1) và total(2) về lại 0 để sang chi nhánh khác tính tiếp, nếu không nó sẽ bị cộng dồn
Tuyệt vời, cảm ơn bạn, đọc mãi mới hiểu, kaka.
Bài đã được tự động gộp:

Cái này giống như bạn xuất ra từ SAP đúng không, mấy kiểu dữ liệu kiểu này mình gặp khá nhiều, chỉ cần 1 chút kỹ năng Excel là trong vòng vài giây là xong, không cần phải dùng tới VBA đâu bạn.
Cách làm của mình thường sử dụng là Goto Find Blanks -> Delete Rows, chỉ giữ lại số Total ở mỗi vendor rồi cộng là được mà.
Việc của bạn là tùy biến layout sao cho dễ thao tác thôi. Đấy là cách mình vẫn hay làm, cho dù dữ liệu có hàng trăm hay hàng ngàn vendor vẫn cộng lại số total tốt. Bạn có thể tham khảo.
Đúng từ SAP mà ra bạn ạ , đấy là yêu cầu từ quản lý chứ làm tay thì rất nhanh , sếp mình thích tất cả tự động hóa hết :) . Dù sao cũng học hỏi được nhiều điều để sau tự áp dụng triển khai :)
 
Upvote 0
Tuyệt vời, cảm ơn bạn, đọc mãi mới hiểu, kaka.
Bài đã được tự động gộp:


Đúng từ SAP mà ra bạn ạ , đấy là yêu cầu từ quản lý chứ làm tay thì rất nhanh , sếp mình thích tất cả tự động hóa hết :) . Dù sao cũng học hỏi được nhiều điều để sau tự áp dụng triển khai :)
Kinh nghiệm của mình là bố trí layout cho cái dòng total nó nằm tách hẳn ra, layout trên SAP bạn tùy biến thoải mái mà, rồi Delete mấy cái dòng còn lại là được, chưa tới 10 giây là kiểm tra được số tổng ngay.
Không liên quan tới chủ đề nhưng nhắc đến tự động hóa SAP thì bạn có thể tìm hiểu Script Recording & Playback, nếu ứng dụng được chắc chắn sẽ vượt mong đợi của sếp bạn.


1655455635490.png
 
Upvote 0
Kinh nghiệm của mình là bố trí layout cho cái dòng total nó nằm tách hẳn ra, layout trên SAP bạn tùy biến thoải mái mà, rồi Delete mấy cái dòng còn lại là được, chưa tới 10 giây là kiểm tra được số tổng ngay.
Không liên quan tới chủ đề nhưng nhắc đến tự động hóa SAP thì bạn có thể tìm hiểu Script Recording & Playback, nếu ứng dụng được chắc chắn sẽ vượt mong đợi của sếp bạn.


View attachment 277460
Cảm ơn bạn, mình sẽ tìm hiểu thêm Script Recording & Playback :D ( nó là tính năng tích hợp trên SAP phải ko bạn? )
 
Upvote 0
Web KT

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

Back
Top Bottom