Dùng vòng lặp để tách mỗi lần 3 giá trị của 1 mã cho đến hết

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Quangdz0512

Thành viên mới
Tham gia
29/7/23
Bài viết
40
Được thích
21
Hiện em có 1 tính huống, mong muốn dùng vòng lặp để tách mỗi lần 3 serial của 1 mã hàng mang đi, nếu số lượng serial không chia hết cho 3 thì lần cuối cùng sẽ lấy số còn lại.
Chi tiết như ví dụ đính kèm.
Em không chú trọng vào việc để dữ liệu vào đâu, nên việc trình bày kết quả mong muốn này tại sheet1 đó chỉ là minh họa, vì mỗi lần mang đi đó em đưa vào nhiều file khác nhau và bố trí không theo quy tắc nào cả. Chỉ mong muốn vòng lặp cho mỗi mã, hết mã này tới mã khác.
Em cảm ơn.
 

File đính kèm

  • Vong lap.xlsx
    10.2 KB · Đọc: 25
Phần sau đây nếu bạn thích thì đọc, khpopng thì bỏ qua:
Nên bỏ thói quen bắt chước người ta dùng ký hiệu dấu hai chấm ":" để nối nhiều lệnh vào một dòng.
Kỹ thuật giảm số dòng không hẳn là kỹ thuật tốt.
Ngày xưa, thập niên 70-80, tài nguyên máy tính rất ít, mối dòng của Basic thường cần khoảng 12 bytes để định địa chỉ. Nối lệnh tiết kiệm được những địa chỉ này.
Nhưng đó là thời thượng cổ. Thời mà máy PDP-11 (DEC), chiếc máy kinh điển trong ngành giáo dục ĐH Mẽo, chỉ có 16 bit địa chỉ. Tức là chỉ chạy được địa chỉ xấp xỉ 32 K (có nhiêu ấy mà nó vẫn chạy được, thế mới gọi là kinh điển).
Đọc đoạn này cháu ghi nhận ý kiến của chú. Sẽ thấy đổi. Đúng là gom lại để cho ngắn code thật ạ. Nhưng cháu cũng thấy là nó gây khó dễ cho người mới đọc. Và cũng có khả năng khó kiểm soát nếu phát sinh lỗi. Hihi. Cám ơn chú đã góp ý ạ
 
Upvote 0
Giờ em muốn với các mã có Số lần là 1, thì trả về kết quả tổng số Serial của mã đó ở cột K thì làm thế nào ạ?
Không khó để đu code theo các yêu cầu của bạn.
Tuy nhiên , qua các bài của bạn, có vẻ bạn đang cố dẫn mọi người đi dò dẫm từng bậc thang để lên tới tầng trên, đi tới đâu bật đèn sáng tới đó.
Mình cũng hiểu là bạn e rằng nếu cho hết dữ kiện ngay từ đầu. có thể mọi người sẽ tẩu hỏa nhập ma mà chạy hết.
Tốt nhất bạn nên cho biết, đích đến cuối cùng là gì? Các vùng, ô mà kết quả được dán vào có phải là kết quả cuối cùng không, hay chỉ là vùng, ô trung gian để giải quyết vấn đề?
Bạn muốn trả về kết quả tổng số các serial vào cột K để làm gì, hay là sau đó bạn sẽ copy nó mang đi đâu?
Vậy, từ K tới O là vùng mà các code phía trên đán dán vào, có phải là tạm thời đúng không? Nó chỉ dùng để copy đi đâu đó thôi?
Nếu đúng vậy, theo tôi, chỉ cần làm việc với cột A:B là đủ.
 
Upvote 0
Bạn giúp mình theo cách Power Query nhé
Nếu trường hợp 2 có blank thì thêm step Table.FillDown nữa là được.
Mã:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Grouped = Table.Group(Source, {"Mã"}, {{"tbl", each Table.FromColumns({{[Mã]{0}}}&List.Split(_[Serial],3))}}),
    Ketqua = Table.Combine(Grouped[tbl])
in
    Ketqua
1690778821594.png
 
Upvote 0
Không khó để đu code theo các yêu cầu của bạn.
Tuy nhiên , qua các bài của bạn, có vẻ bạn đang cố dẫn mọi người đi dò dẫm từng bậc thang để lên tới tầng trên, đi tới đâu bật đèn sáng tới đó.
Mình cũng hiểu là bạn e rằng nếu cho hết dữ kiện ngay từ đầu. có thể mọi người sẽ tẩu hỏa nhập ma mà chạy hết.
Tốt nhất bạn nên cho biết, đích đến cuối cùng là gì? Các vùng, ô mà kết quả được dán vào có phải là kết quả cuối cùng không, hay chỉ là vùng, ô trung gian để giải quyết vấn đề?
Bạn muốn trả về kết quả tổng số các serial vào cột K để làm gì, hay là sau đó bạn sẽ copy nó mang đi đâu?
Vậy, từ K tới O là vùng mà các code phía trên đán dán vào, có phải là tạm thời đúng không? Nó chỉ dùng để copy đi đâu đó thôi?
Nếu đúng vậy, theo tôi, chỉ cần làm việc với cột A:B là đủ.
Em chào anh,
Theo đúng tình huống ban đầu (bài 1) em có nêu, là em cần tách mỗi lần 3 serial để mang đi copy vào phần mềm X, nếu mã đó có nhiều hơn 3 serial thì phải copy làm nhiều lần (lần cuối có thể là số < 3). Xong mã này mới đến mã khác.
Tức là sau khi copy xong, em dán vào phần mềm và thao tác trên phần mềm nữa (tất nhiên vẫn là code - do kết nối được VBA với phần mềm đó)
Em không biết giải pháp nào có thể lặp theo cột A, xác định được vị trí tiếp theo cần copy, và số lượng cần copy tiếp
Vì vậy em nghĩ là làm 1 dữ liệu trung gian, chia sẵn số lần copy và số lượng cần copy mỗi lần (tương ứng với bài giải của các anh đã giải)

Anh có giải pháp chỉ dùng cột A:B mà chỉ rõ được số lần copy, số lượng copy từng lần thì cho em xin ạ. Kết quả trả về đâu cũng được, do phần đích đến đó sẽ là câu lệnh của em để đưa vào phần mềm.
Cụ thể hơn em cũng miêu tả tại bài #32. Em phải dùng phương thức Find để tìm và lấy dữ liệu của từng mã, hết mã đó mới Find Next đó ạ.
Bài đã được tự động gộp:

Nếu trường hợp 2 có blank thì thêm step Table.FillDown nữa là được.
Mã:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Grouped = Table.Group(Source, {"Mã"}, {{"tbl", each Table.FromColumns({{[Mã]{0}}}&List.Split(_[Serial],3))}}),
    Ketqua = Table.Combine(Grouped[tbl])
in
    Ketqua
View attachment 293328
Không có blank bạn ạ. Bạn thêm giúp mình cột chỉ ra số cột có dữ liệu của mỗi mã được không?
Ví dụ mã A là 2
Và cột tiếp theo là nếu Số cột có dữ liệu của mã đó là 1, thì đếm có bao nhiêu dòng của mã đó.
Cảm ơn bạn
 
Upvote 0
Sau nhiều năm tham gia diễn đàn tôi rút ra được một CHÂN LÝ: Đối với những bài hỏi, số lượng bài trả lời luôn tỷ lệ nghịch với khả năng diễn đạt của người hỏi.
 
Upvote 0
. . . . . Đối với những bài hỏi, số lượng bài trả lời luôn tỷ lệ nghịch với khả năng diễn đạt của người hỏi.
Cũng có những người giả ngu ngơ để ôm trọn kiến thức ngóc ngách của nhiều những người khác. . . . .
 
Upvote 0
Sau nhiều năm tham gia diễn đàn tôi rút ra được một CHÂN LÝ: Đối với những bài hỏi, số lượng bài trả lời luôn tỷ lệ nghịch với khả năng diễn đạt của người hỏi.
Không hẳn. Nhiều người lỗi tại chủ quan, hoặc trước đã có sẵn định kiến về giải thuật.

Điển hình thớt này:
1. Định kiến: tự cho là bài này giải bằng "vòng lặp"
2. Chủ quan: cho rằng mình có thể nhận một cái đầu ra "chung chung" rồi có thể bắt đầu từ đó. Đến lúc không làm được mới hé lộ thêm chi tiết. Số bài kế tiếp tùy thuộc vào khả năng tách chi tiết của thớt (cho rằng tiết lộ đến A là đủ, không nghĩ rằng A cần có B, B cần có C)

Ở bài #21 tôi đã đoán trước tình trạng này cho nên đưa ra giải thuật mà chúng tôi (dân phát triển phần mềm chuyên nghiệp) dùng để nói chuyện với khách hàng (*) trước khi bàn cãi thêm về phạm vi đồ án.
Giải thuật ấy phân biệt đầu ra làm 2 đoạn, đoạn xào nấu dữ liệu đầu vào để đưa ra tin tức ở dạng chung chung và đoạn kết thúc dùng dữ liệu chung chung để tạo đầu ra.
Đoạn kết thúc chỉ cần bên B xác định chi tiết dạng đầu ra là có thể cập nhật nhanh chóng.

(*) đây nói về loại khách hàng lơ mơ về công nghệ, ăn tiền rất đã nhưng cũng rất bực mình. Dân giỏi họ chính xác lắm, làm việc rất đã tuy rằng cái lợi nhuận (margin) và bảo hiểm (fudge factor) hơi sát
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh,

Rất cảm ơn các anh đã nhiệt tình hỗ trợ. Em cũng không nghĩ là bài này có nhiều lượt trả lời như vậy.
Những nhận xét của anh VetMini rất đúng, đúng là em có định kiến về giải thuật, một phần cũng do hạn chế về năng lực (em tay ngang tự tìm hiểu về VBA để áp dụng vào công việc thôi)
Ý kiến thứ 2 của anh, thực sự em có phần khó nói (tức phần mềm mà em nhắc đến ở đây, đưa code liên quan lên chỉ làm rối mắt các anh thôi, do đặc thù nó rất khác).
Với bài giải của anh @BuiQuangThuan em đã áp dụng thành công, khi không có code để đưa ra số lượng serial của mã chỉ 1 lần copy thì em đã dùng hàm của excel để tính và kéo cho 1 vùng nhất định trong cột.
Một lần nữa xin cảm ơn các anh đã nhiệt tình hỗ trợ và chỉ bảo. Em cũng học hỏi được nhiều nội dung từ đóng góp của các anh. Em đến với diễn đàn với mong muốn học hỏi và nhờ giúp đỡ, không có chút nào là thách đố cả.
Nếu anh nào vẫn chưa hiểu lòng em, có thể để lại email, em gửi riêng file em đã hoàn thành.

Em vẫn mong chờ đáp án từ anh @bebo021999 khi chỉ xử lý với 2 cột A:B mà không phải trung gian như định kiến giải thuật của em.
 
Upvote 0
Đến lúc không làm được mới hé lộ thêm chi tiết. Số bài kế tiếp tùy thuộc vào khả năng tách chi tiết của thớt (cho rằng tiết lộ đến A là đủ, không nghĩ rằng A cần có B, B cần có C)
Như ở bài #31 em cũng nói, chủ bài này mỗi khi bí mới thò thêm một chút thông tin nên ít ai muốn theo đuổi kiểu như vậy vì không biết đâu là đích cuối cả.
 
Upvote 0
Như ở bài #31 em cũng nói, chủ bài này mỗi khi bí mới thò thêm một chút thông tin nên ít ai muốn theo đuổi kiểu như vậy vì không biết đâu là đích cuối cả.
Lúc viết vài #21, chủ đích của tôi không ở thớt mà là chung cho các bạn học code.

Điểm chính của cấu trúc code này là tách rời phần tom góp, tổng hợp dữ liệu ra khỏi phần xuất ra.
Lúc xây xong mảng a2() là dữ liêu đã được phân tích và tổng hợp xong. Phần dựng mảng a3() là phần phụ, vì nó đoán là thớt muốn nhận đầu ra là một mảng để dán xuống bảng tính cho nên nó dựng a3() với cấu trúc như thế.
Bà con ở đây không quen sử dụng mảng cho nên không nhận ra là muốn biết một mã có bao nhiêu serials (cái mà thớt cứ càm ràm làm cách nào tính) chỉ việc lấy dòng cuối - dòng đầu + 1. Kỹ thuật phân mảng một chiều (mảng a2) ra 2 chiều (mảng 3) cũng là kỹ thuật căn bản mà dân dùng mảng ai cũng biết.
 
Upvote 0
Nếu anh nào vẫn chưa hiểu lòng em, có thể để lại email, em gửi riêng file em đã hoàn thành.

Em vẫn mong chờ đáp án từ anh @bebo021999 khi chỉ xử lý với 2 cột A:B mà không phải trung gian như định kiến giải thuật của em.
OK, Mình cũng tò mò về file của bạn. Để trao đổi thêm, bạn LH zalo mình (ở chữ ký) nhé.
 
Upvote 0
Web KT

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

Back
Top Bottom