hướng dẫn code VBA tiến độ SX sử dụng vòng lặp for next kết hợp offset

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

truongnguyen1511

Thành viên mới
Tham gia
5/4/23
Bài viết
10
Được thích
-1
Xin Chào các Cao nhân
Hiện mình có ý tưởng sắp xếp tiến độ Sản xuất tự động trên file excel nhưng mình lại chưa nghĩ ra cách lấy dữ liệu theo điều kiện ntn.
Theo như file thì mình có các cột màu cam (vuông xanh dương) là dữ liệu cho trước: code (đại diện cho 1 size hàng của đơn hàng), Khối lượng đơn hàng, ngày dự kiến hoàn thành, tháng SX, dây chuyền SX ( VD có 2 dây chuyền là MM1, MM2), các cột màu xanh (Vuông đỏ) từ F->AI là sắp xếp tiến độ SX từ ngày 01.04-30.04
Mình viết code cho chạy vòng lặp từ biến i cột C đến dòng cuối và biến j từ dòng 1 đến hết 30.04, thỏa điều kiện Ngày biến j>=ngày biến i thì sẽ ghi khối lượng tương ứng từ cột F đến cột AI (vuông xanh lá), nhưng chỉ ghi đủ khối lượng <300 , lớn hơn 300 tự động dịch 1 cột ở dòng tiếp theo ghi tiếp và cũng <300, và cứ thế đến hết ( năng lực SX của dây chuyền chỉ <300/ngày đó là lý do sắp xếp tiến độ SX theo ngày)
mình nghĩ đến offset nhưng mình chưa nghĩ ra điều kiện như thế nào để lấy kq như vậy
Các cao nhân trong Diễn đàn excel chắc cũng nhiều bạn làm bên mảng kế hoạch sản xuất , hóng các cao nhân chỉ giáo
Hình ảnh ý tưởng mình có hình ảnh và file đính kèm
Xin cảm ơnHình.jpg
 

File đính kèm

  • test 1.xlsm
    35.1 KB · Đọc: 18
Nếu dùng công thức có được không, hay phải là VBA?
F4:
Mã:
=MIN($B4-SUM($E4:E4),300-SUM(F$3:F3),$B4)
Copy cho cả bảng
 

File đính kèm

  • test 1.xlsm
    89.8 KB · Đọc: 17
Upvote 0
Như file mẫu trên thì chỉ cần 1 vòng lặp.
Dùng 3 biến i, j = 6 và S=0
Cho i chạy từ 4 đến hàng cuối (tương ứng khối lượng cột B)
Mỗi lần kiểm tra điều kiện S = S+ giá trị ô Bi (hàng thứ i cột B)
Nếu S <= 300 thì điền vào ô có hàng i cột j
Nếu S > 300 thì gán j = j+1 và điền khối lượng của ô Bi vào ô hàng i cột j, gán S = 0.
 
Upvote 0
Nếu dùng công thức có được không, hay phải là VBA?
F4:
Mã:
=MIN($B4-SUM($E4:E4),300-SUM(F$3:F3),$B4)
Copy cho cả bảng
quả hàm này nếu mình thêm điều kiện, nếu MM02 thì <300, nếu MM01 thì <200, tức là mình muốn phân theo năng lực dây chuyền chạy 1 ngày, còn cái này theo hình chung là <300 cho tất cả các dây chuyền
 
Upvote 0
Mình có viết cái hàm này trên excel 365 & google sheet (mỗi công thức cho cả cột)
kể từ ô G4 thì kéo công thức qua bên phải
cột F có thể sd công thức khác, hoặc phải tạo dữ liệu mẫu trước (công thức cột G ko áp dụng cho cột F đc vì cột E có dữ liệu)
G4=LET(x;MAP($B$4:$B$133;LAMBDA(thisrow;IF(SUM($B$4:thisrow)>=SUM($F$2:F2;300);"";thisrow))); IF(((x=F4:F133)*(ISNUMBER(F4:F133))+(F4:F133<>""));0;x))
...
yêu cầu của bạn là <300 thì đoạn công thức này phải là ">=SUM($F$2:F2;300)"
...
cách hoạt động như sau
Mình dùng hàm mảng để tính tổng từng ô, nếu ô nào có số >= 300 thì trả về "" (rỗng)
rồi dùng kêt quả cột trước so sánh vs cột hiện tại
Nếu (cột trước = số [hoặc] khác rỗng) thì trả về 0

1680758783487.png
 

File đính kèm

  • Copy of test 1.xlsx
    28.4 KB · Đọc: 15
Upvote 0
Mình có viết cái hàm này trên excel 365 & google sheet (mỗi công thức cho cả cột)
kể từ ô G4 thì kéo công thức qua bên phải
cột F có thể sd công thức khác, hoặc phải tạo dữ liệu mẫu trước (công thức cột G ko áp dụng cho cột F đc vì cột E có dữ liệu)
G4=LET(x;MAP($B$4:$B$133;LAMBDA(thisrow;IF(SUM($B$4:thisrow)>=SUM($F$2:F2;300);"";thisrow))); IF(((x=F4:F133)*(ISNUMBER(F4:F133))+(F4:F133<>""));0;x))
...
yêu cầu của bạn là <300 thì đoạn công thức này phải là ">=SUM($F$2:F2;300)"
...
cách hoạt động như sau
Mình dùng hàm mảng để tính tổng từng ô, nếu ô nào có số >= 300 thì trả về "" (rỗng)
rồi dùng kêt quả cột trước so sánh vs cột hiện tại
Nếu (cột trước = số [hoặc] khác rỗng) thì trả về 0

View attachment 288532
cảm ơn bạn để mình tham khảo
Bài đã được tự động gộp:

Như file mẫu trên thì chỉ cần 1 vòng lặp.
Dùng 3 biến i, j = 6 và S=0
Cho i chạy từ 4 đến hàng cuối (tương ứng khối lượng cột B)
Mỗi lần kiểm tra điều kiện S = S+ giá trị ô Bi (hàng thứ i cột B)
Nếu S <= 300 thì điền vào ô có hàng i cột j
Nếu S > 300 thì gán j = j+1 và điền khối lượng của ô Bi vào ô hàng i cột j, gán S = 0.
cảm ơn em để anh thử xem ntn
 
Upvote 0
cảm ơn bạn để mình tham khảo
Bài đã được tự động gộp:


cảm ơn em để anh thử xem ntn
em viết cho nó chạy thử được ko anh viết mà nó chạy chưa đúng ý
Bài đã được tự động gộp:

Mình có viết cái hàm này trên excel 365 & google sheet (mỗi công thức cho cả cột)
kể từ ô G4 thì kéo công thức qua bên phải
cột F có thể sd công thức khác, hoặc phải tạo dữ liệu mẫu trước (công thức cột G ko áp dụng cho cột F đc vì cột E có dữ liệu)
G4=LET(x;MAP($B$4:$B$133;LAMBDA(thisrow;IF(SUM($B$4:thisrow)>=SUM($F$2:F2;300);"";thisrow))); IF(((x=F4:F133)*(ISNUMBER(F4:F133))+(F4:F133<>""));0;x))
...
yêu cầu của bạn là <300 thì đoạn công thức này phải là ">=SUM($F$2:F2;300)"
...
cách hoạt động như sau
Mình dùng hàm mảng để tính tổng từng ô, nếu ô nào có số >= 300 thì trả về "" (rỗng)
rồi dùng kêt quả cột trước so sánh vs cột hiện tại
Nếu (cột trước = số [hoặc] khác rỗng) thì trả về 0

View attachment 288532
Mình xài phiên bản Excel 2016 nên công thức này bó tay rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Hì hì, vậy là sau khi tra thì chắc "rành rồi" nhỉ. Lần sau rút kinh nghiệm nhé.
Kaka là tên 1 app hát karaoke trên điện thoại. --=0
Bếu là âm thanh thì đó là tiếng khọt khẹt của ngwoif bị suyển.
Nếu là danh tự thì đó là tên tiếng Anh một loài kéc ở Tân Tây Lan

Nhưng tiếng ho, tiếng Pháp tiếng Anh gì cũng thành công tuốt. Ít nhất đã có 3 "cao nhơn" nhào vô rồi.
 
Upvote 0
Mình cũng qtam cái này, trước thấy bác nào viết đc công thức excel được thì phải.
Chỉ dùng hàm if cũng làm được như yêu cầu của file mẫu, nhập công thức vào ô F4 rồi kéo cho cả bảng:
Mã:
=+IF(SUM($E4:E4)<$B4,IF(SUM(F$3:F3)+$B4<=300,IF($B3=F3,$B4,IF(SUM(F$3:F3)=0,$B4,0)),0),0)
 
Upvote 0
Web KT

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

Back
Top Bottom