Xin code tính tổng nhiều dãy số liên tục (1 người xem)

Liên hệ QC

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

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
 
Sub tinhTong()
Call A_Cờ_E(Vùng_Anh_Chích_Em)
Msgbox "Xong phim!"
End Sub
 
Upvote 0
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
Ctrl + ↓ thì phải xác định nó đang ở cột nào? Nên cho cái dữ liệu lên để xem quy luật tổng quát sẽ chính xác hơn là bấm 5 lần
 
Upvote 0
Ctrl + ↓ thì phải xác định nó đang ở cột nào? Nên cho cái dữ liệu lên để xem quy luật tổng quát sẽ chính xác hơn là bấm 5 lần
Mình nghĩ ra cách rồi, bạn có thể giúp mình cấu trúc viết code vòng lặp kiểu như vậy đến hết trang tính không?
Cảm ơn bạn.
 
Upvote 0
Mình nghĩ ra cách rồi, bạn có thể giúp mình cấu trúc viết code vòng lặp kiểu như vậy đến hết trang tính không?
Cảm ơn bạn.
Nếu là mình thì mình cũng sẽ chia sẻ file lên để biết đâu người khác có cách hay hơn.
Rồi nếu bạn chỉ muốn hỗ trợ theo ý này của bạn thì cũng phải giải thích rõ:
  • Dữ liệu bắt đầu từ ô nào
  • Hết bảng là từ cột nào đến cột nào? không lẽ hơn 16 ngàn cột? Hay code tự xác định cột cuối trong file, hay như thế nào đó...
  • Có chính xác là ctrl + ↓ 5 lần không, 5 lần mà nhảy xuống cuối bảng (dòng hơn 1 triệu) thì có sum hay không?
Nhưng chốt lại là vẫn phải đem dữ liệu mẫu lên đây để ngắm tình hình!
 
Upvote 0
Nếu là mình thì mình cũng sẽ chia sẻ file lên để biết đâu người khác có cách hay hơn.
Rồi nếu bạn chỉ muốn hỗ trợ theo ý này của bạn thì cũng phải giải thích rõ:
  • Dữ liệu bắt đầu từ ô nào
  • Hết bảng là từ cột nào đến cột nào? không lẽ hơn 16 ngàn cột? Hay code tự xác định cột cuối trong file, hay như thế nào đó...
  • Có chính xác là ctrl + ↓ 5 lần không, 5 lần mà nhảy xuống cuối bảng (dòng hơn 1 triệu) thì có sum hay không?
Nhưng chốt lại là vẫn phải đem dữ liệu mẫu lên đây để ngắm tình hình!
Đây bạn ơi. tính tổng ở các vùng bôi cam cho số tiền phía trên. File mình nhiều dữ liệu lắm nên sẽ lặp lại liên tục, mình để lại 1 số để ví dụ.
 

File đính kèm

Upvote 0
Đây bạn ơi. tính tổng ở các vùng bôi cam cho số tiền phía trên. File mình nhiều dữ liệu lắm nên sẽ lặp lại liên tục, mình để lại 1 số để ví dụ.
À là cái file ở cái bài gì hôm qua hỏi hả?
Đấy cứ cố chấp ctrl end(xldown) 5 lần, tại sao không xét cột B là * và ** thì sum tại cột H? Có phải chính xác hơn cái bạn đang nói không? Vì file này xuất ra từ phần mềm thì chắc chắn dòng tổng nào nó cũng có ký tự * này thôi
 
Upvote 0
À là cái file ở cái bài gì hôm qua hỏi hả?
Đấy cứ cố chấp ctrl end(xldown) 5 lần, tại sao không xét cột B là * và ** thì sum tại cột H? Có phải chính xác hơn cái bạn đang nói không? Vì file này xuất ra từ phần mềm thì chắc chắn dòng tổng nào nó cũng có ký tự * này thôi
Mình cũng thử theo cách đó, tuy nhiên vùng tổng nó khác nhau nên không biết đặt như nào, mình còn làm phức tạp lên là đặt biến dòng trên và dòng dưới kết hợp thành vùng tính tổng lại càng lằng nhằng :( .
 
Upvote 0
Mình cũng thử theo cách đó, tuy nhiên vùng tổng nó khác nhau nên không biết đặt như nào, mình còn làm phức tạp lên là đặt biến dòng trên và dòng dưới kết hợp thành vùng tính tổng lại càng lằng nhằng :( .


Đưa cái code của bạn lên, một số người có thời gian nhàn rỗi sẽ sửa giúp bạn.

.
 
Upvote 0
Mình cũng thử theo cách đó, tuy nhiên vùng tổng nó khác nhau nên không biết đặt như nào, mình còn làm phức tạp lên là đặt biến dòng trên và dòng dưới kết hợp thành vùng tính tổng lại càng lằng nhằng :( .
Chạy code file đính kèm
Có lựa chọn đối chiếu tháng luôn cho bạn (theo yêu cầu cái bài cũ nào đó)
 

File đính kèm

Upvote 0
Có thể dữ liệu bạn đưa lên chưa bao quát.
Dòng có *** là tổng các dòng ** (trong phạm vi toàn bộ)
Như vậy dòng có ** sẽ là tổng các dòng * (trong phạm vi 1 vendor)
Hiện mỗi vendor chỉ có 1 dòng * và 1 dòng ** , nên 2 tổng này bằng nhau.
Mình đoán vậy thôi. Nếu đúng thì bạn đưa dữ liệu thật lên.
 
Upvote 0
Chạy code file đính kèm
Có lựa chọn đối chiếu tháng luôn cho bạn (theo yêu cầu cái bài cũ nào đó)
Ôi cảm ơn bạn nhiều nhé, đang vò đầu bứt tai nãy giờ, để mình nghiên cứu code.
Bài đã được tự động gộp:

Có thể dữ liệu bạn đưa lên chưa bao quát.
Dòng có *** là tổng các dòng ** (trong phạm vi toàn bộ)
Như vậy dòng có ** sẽ là tổng các dòng * (trong phạm vi 1 vendor)
Hiện mỗi vendor chỉ có 1 dòng * và 1 dòng ** , nên 2 tổng này bằng nhau.
Mình đoán vậy thôi. Nếu đúng thì bạn đưa dữ liệu thật lên.
Đúng rồi bạn, nhưng ko hiểu sao mình đặt find *** mà nó trả kết quả * hay ** đều trả :)) . Bác nhattanknn đã giúp mình rồi.
Cảm ơn các bác nhé
 
Upvote 0
Như bài #11 mình đã đề cập, bên trong *** (vùng ông nội) tất có nhiều vùng con ** (vùng cha) và bên trong ** tất có nhiều vùng con *
Trong VD bạn đưa lên mà bạn nhattan viết code, không tính đến điều này. Và kết quả sẽ sai.
Mình đoan chắc dữ liệu thật của bạn sẽ như mình nói. Vì file này xuất từ phần mềm ra, nên chắc chắn chẳng ai viết code mà dư 1 cái tổng **, nếu bên trong không có ít nhất 2 cái *
Hình đính kèm là code chạy sai.
Chữ đỏ bên cạnh là kq đúng.
 

File đính kèm

  • Capture.JPG
    Capture.JPG
    81 KB · Đọc: 20
Upvote 0
Như bài #11 mình đã đề cập, bên trong *** (vùng ông nội) tất có nhiều vùng con ** (vùng cha) và bên trong ** tất có nhiều vùng con *
Trong VD bạn đưa lên mà bạn nhattan viết code, không tính đến điều này. Và kết quả sẽ sai.
Mình đoan chắc dữ liệu thật của bạn sẽ như mình nói. Vì file này xuất từ phần mềm ra, nên chắc chắn chẳng ai viết code mà dư 1 cái tổng **, nếu bên trong không có ít nhất 2 cái *
Hình đính kèm là code chạy sai.
Chữ đỏ bên cạnh là kq đúng.
Cảm ơn bạn, đúng là cái file này chiết xuất từ phần mềm ra, nhưng mình chạy code của bạn Nhattan thì đúng ko thấy sai
Mình đọc đoạn code thì hiểu sẽ cộng nó với giá trị mới liên tục cho tới dòng 1 * , còn dòng 2* mình cũng chưa hiểu rõ đoạn code như nào mà cho kết quả đúng :)
p/S: nhân tiện cho mình hỏi đoạn code này có ý nghĩa là gì vậy nhỉ, vì mình quen khi khai báo biến thì phải gán với định dạng biến nào đó. ( nhất là vùng bôi đỏ)
Dim I&, Msg&, M, CompareCol&, sM&, Total#(1 To 3)


1655445969462.png
1655446112253.png
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cho mình hỏi câu lệnh này nghĩa là gì nhỉ? Nhất là đoạn chữ B, có phải cột B ko bạn?
Set Rng = .Range("A1:U" & .Cells(Rows.Count, "B").End(xlUp).Row)
Vùng dữ liệu từ A1:Ux, với x là số dòng mà nếu làm thủ công thì bạn để chuột ở dòng cuối cùng của bảng tại cột B (tức B1048576) --> Bấm ctrl + mũi tên lên (là end(xlup))
Vùng màu đỏ trên phần trích dẫn là trả về số x đấy
Trong VD bạn đưa lên mà bạn nhattan viết code, không tính đến điều này. Và kết quả sẽ sai.
Theo yêu cầu và dữ liệu thực tế của chủ thớt thì kết quả không hề sai, nó sai là do bác thêm dữ liệu vào và nói sai đấy chứ? Chưa kể là không chắc dữ liệu thực tế đã có nhiều mục con (*) như vậy. Còn nếu muốn tính thì rõ ràng dữ liệu phải có chứ làm sao tự đoán là dữ liệu họ có như vậy rồi tự tính được bác, phải xem dữ liệu bố trí thế nào để có phương án code chứ!
 
Upvote 0
Vùng dữ liệu từ A1:Ux, với x là số dòng mà nếu làm thủ công thì bạn để chuột ở dòng cuối cùng của bảng tại cột B (tức B1048576) --> Bấm ctrl + mũi tên lên (là end(xlup))
Vùng màu đỏ trên phần trích dẫn là trả về số x đấy

Theo yêu cầu và dữ liệu thực tế của chủ thớt thì kết quả không hề sai, nó sai là do bác thêm dữ liệu vào và nói sai đấy chứ? Chưa kể là không chắc dữ liệu thực tế đã có nhiều mục con (*) như vậy. Còn nếu muốn tính thì rõ ràng dữ liệu phải có chứ làm sao tự đoán là dữ liệu họ có như vậy rồi tự tính được bác, phải xem dữ liệu bố trí thế nào để có phương án code chứ!
Thank bạn. bạn cho mình hỏi khai báo như này nghĩa là gì nữa nhé :) (vì mình quen khi khai báo biến thì phải gán với định dạng biến nào đó. )
Dim I&, Msg&, M, CompareCol&, sM&, Total#(1 To 3)
 
Upvote 0
Thank bạn. bạn cho mình hỏi khai báo như này nghĩa là gì nữa nhé :) (vì mình quen khi khai báo biến thì phải gán với định dạng biến nào đó. )
Dim I&, Msg&, M, CompareCol&, sM&, Total#(1 To 3)
& : long -> i& ~ i as long
# : double -> Total#(1 to 3) ~ total(1 to 3) as double. Total này là mảng 1 chiều có cận dưới 1, cận trên 3

Nói thêm: Trong code trên, chỗ * và ** có kết quả bằng nhau, vì dữ liệu của bạn nó thế!
 
Upvote 0
& : long -> i& ~ i as long
# : double -> Total#(1 to 3) ~ total(1 to 3) as double. Total này là mảng 1 chiều có cận dưới 1, cận trên 3

Nói thêm: Trong code trên, chỗ * và ** có kết quả bằng nhau, vì dữ liệu của bạn nó thế!
cảm ơn bạn nhé, giờ thông suốt rồi . Không biết bao giờ mới đạt level như các bạn trên này :) . giờ mình mới đang tìm hiểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Okie, thank bạn nhé, giờ thông suốt rồi . Không biết bao giờ mới đạt level như các bạn trên này :) . giờ mình mới đang tìm hiểu.
Mình thì đọc hiểu là mình trả lời nhưng các bác trên đây không thích dùng ngôn ngữ pha trộn vậy đâu, lần sau đăng bài muốn được nhiều người giúp đỡ thì bạn nên hạn chế điều này
 
Upvote 0
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

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

Back
Top Bottom