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ầnGử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
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?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
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.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.
Đâ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ụ.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õ:
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!
- 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?
À là cái file ở cái bài gì hôm qua hỏi hả?Đâ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ụ.
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À 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.
Chạy code file đính kèmMì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.
Ô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.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 đó)
Đúng rồi bạn, nhưng ko hiểu sao mình đặt find *** mà nó trả kết quả * hay ** đều trả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.
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 saiNhư 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.
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))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)
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ứ!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.
Thank bạn. bạn cho mình hỏi khai báo như này nghĩa là gì nữa nhé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ứ!
& : long -> i& ~ i as longThank 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)
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& : 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ế!
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àyOkie, 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.
cảm ơn bác nhé. Nhưng sao lại thế nhỉ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
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ác nhé. Nhưng sao lại thế nhỉ![]()
Cảm ơn bạn nhiều. lại phiền bạn chỉ giáoVì 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é![]()
Về cơ bản hàm if này có 3 phần(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
Tuyệt vời, cảm ơn bạn, đọc mãi mới hiểu, kaka.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
Đú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ếtCá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.
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.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
![]()
Cảm ơn bạn, mình sẽ tìm hiểu thêm Script Recording & PlaybackKinh 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