Nhờ chỉnh giúp marco để tăng tốc độ cho file

Liên hệ QC

auvfei

Thành viên mới
Tham gia
29/6/10
Bài viết
28
Được thích
1
Chào các bác,

e có 1 file dùng để chia đơn hàng (như att file). Hiện e đã mày mò làm đc 1 nút bấm với marco để thao tác thuận tiện hơn, tuy nhiên marco của e có nhiều vòng lặp for và điều kiện if nên tốc độ xử lý khá chậm. Vậy e nhờ các bác hỗ trợ giúp để có thể tăng tốc marco giúp với ạ.

p/s: logic chia đơn hàng của e như sau:
- mỗi pallet code sẽ bào gồm 24 ctn được đanh số bắt đầu từ 1
- nếu số lượng ctns của mã/lot 1 không đủ để xếp lên 1 pallet code thì sẽ nhặt thêm ctn của mã/lot khác (kế tiếp theo trong sheet Stock) để đủ 24 ctns. Lúc này thông tin của các mã/lot sẽ được thể hiện tại các dòng khác nhau trong sheet Chia cont nhưng phần thông tin pallet code sẽ đánh số giống nhau nhằm nhận biết các mã/lot nằm trên cùng 1 pallet code.

Em cảm ơn,
 

File đính kèm

  • Chia cont.xlsm
    40.7 KB · Đọc: 23
Chào các bác,

e có 1 file dùng để chia đơn hàng (như att file). Hiện e đã mày mò làm đc 1 nút bấm với marco để thao tác thuận tiện hơn, tuy nhiên marco của e có nhiều vòng lặp for và điều kiện if nên tốc độ xử lý khá chậm. Vậy e nhờ các bác hỗ trợ giúp để có thể tăng tốc marco giúp với ạ.

p/s: logic chia đơn hàng của e như sau:
- mỗi pallet code sẽ bào gồm 24 ctn được đanh số bắt đầu từ 1
- nếu số lượng ctns của mã/lot 1 không đủ để xếp lên 1 pallet code thì sẽ nhặt thêm ctn của mã/lot khác (kế tiếp theo trong sheet Stock) để đủ 24 ctns. Lúc này thông tin của các mã/lot sẽ được thể hiện tại các dòng khác nhau trong sheet Chia cont nhưng phần thông tin pallet code sẽ đánh số giống nhau nhằm nhận biết các mã/lot nằm trên cùng 1 pallet code.

Em cảm ơn,
 
Lần chỉnh sửa cuối:
Upvote 0
cần kiểm tra:
PHP:
UBound(arr) * 100
a
so với số lượng dòng của bảng tính để xử lý, nhiều hơn có tách ra hay không chẳng hạn.
 
Upvote 0
Chào các bác,

e có 1 file dùng để chia đơn hàng (như att file). Hiện e đã mày mò làm đc 1 nút bấm với marco để thao tác thuận tiện hơn, tuy nhiên marco của e có nhiều vòng lặp for và điều kiện if nên tốc độ xử lý khá chậm. Vậy e nhờ các bác hỗ trợ giúp để có thể tăng tốc marco giúp với ạ.

p/s: logic chia đơn hàng của e như sau:
- mỗi pallet code sẽ bào gồm 24 ctn được đanh số bắt đầu từ 1
- nếu số lượng ctns của mã/lot 1 không đủ để xếp lên 1 pallet code thì sẽ nhặt thêm ctn của mã/lot khác (kế tiếp theo trong sheet Stock) để đủ 24 ctns. Lúc này thông tin của các mã/lot sẽ được thể hiện tại các dòng khác nhau trong sheet Chia cont nhưng phần thông tin pallet code sẽ đánh số giống nhau nhằm nhận biết các mã/lot nằm trên cùng 1 pallet code.

Em cảm ơn,
Chạy thử code
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, Pallet_No&, CTN&, tmp&
  Const nPal& = 24
  Pallet_No = 1

  Sheets("Chia cont").Range("A3:E1000").ClearContents
  With Sheets("Stock")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then Exit Sub
    sArr = .Range("B2:E" & i).Value
  End With

  ReDim Res(1 To 1000, 1 To 5)
  sRow = UBound(sArr)
  For i = 1 To sRow
    CTN = sArr(i, 4)
    Do
      k = k + 1
      Res(k, 1) = Pallet_No
      Res(k, 2) = sArr(i, 1)
      Res(k, 3) = sArr(i, 2)
      If CTN > nPal - tmp Then Res(k, 5) = nPal - tmp Else Res(k, 5) = CTN
      tmp = tmp + Res(k, 5)
      If tmp = nPal Then
        tmp = 0
        Pallet_No = Pallet_No + 1
      End If
      CTN = CTN - Res(k, 5)
    Loop Until CTN = 0
  Next i

  With Sheets("Chia cont")
    If k Then .Range("A3").Resize(k, 5) = Res
  End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy thử code
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, Pallet_No&, CTN&, tmp&
  Const nPal& = 24
  Pallet_No = 1

  Sheets("Chia cont").Range("A3:E1000").ClearContents
  With Sheets("Stock")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then Exit Sub
    sArr = .Range("B2:E" & i).Value
  End With

  ReDim Res(1 To 1000, 1 To 5)
  sRow = UBound(sArr)
  For i = 1 To sRow
    CTN = sArr(i, 4)
    Do
      k = k + 1
      Res(k, 1) = Pallet_No
      Res(k, 2) = sArr(i, 1)
      Res(k, 3) = sArr(i, 2)
      If CTN > nPal - tmp Then Res(k, 5) = nPal - tmp Else Res(k, 5) = CTN
      tmp = tmp + Res(k, 5)
      If tmp = nPal Then
        tmp = 0
        Pallet_No = Pallet_No + 1
      End If
      CTN = CTN - Res(k, 5)
    Loop Until CTN = 0
  Next i

  With Sheets("Chia cont")
    If k Then .Range("A3").Resize(k, 5) = Res
  End With
End Sub

Em cảm ơn bác. Tuy nhiên e thất sự chưa hiểu về mảng nên đoạn code như "bức vách" đối với e, Vậy bác có thể giúp e giải thích thêm về cách làm của bác được không ạ?
 
Upvote 0
Chạy thử code
Mã:
Sub ABC()
  Dim sArr(), Res()
  Dim sRow&, i&, k&, Pallet_No&, CTN&, tmp&
  Const nPal& = 24
  Pallet_No = 1

  Sheets("Chia cont").Range("A3:E1000").ClearContents
  With Sheets("Stock")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 2 Then Exit Sub
    sArr = .Range("B2:E" & i).Value
  End With

  ReDim Res(1 To 1000, 1 To 5)
  sRow = UBound(sArr)
  For i = 1 To sRow
    CTN = sArr(i, 4)
    Do
      k = k + 1
      Res(k, 1) = Pallet_No
      Res(k, 2) = sArr(i, 1)
      Res(k, 3) = sArr(i, 2)
      If CTN > nPal - tmp Then Res(k, 5) = nPal - tmp Else Res(k, 5) = CTN
      tmp = tmp + Res(k, 5)
      If tmp = nPal Then
        tmp = 0
        Pallet_No = Pallet_No + 1
      End If
      CTN = CTN - Res(k, 5)
    Loop Until CTN = 0
  Next i

  With Sheets("Chia cont")
    If k Then .Range("A3").Resize(k, 5) = Res
  End With
End Sub

Code chạy tốt bác ạ, e xin phép được áp dụng nó vào công việc của mình.
Hiên tại e chưa hiểu câu lệnh này "If k Then ..." làm phiền bác giải thích giúp e được ko?
 
Upvote 0
Code chạy tốt bác ạ, e xin phép được áp dụng nó vào công việc của mình.
Hiên tại e chưa hiểu câu lệnh này "If k Then ..." làm phiền bác giải thích giúp e được ko?
Ở trên có dòng
k = k + 1 dùng để đếm.
Theo như mình hiểu thì k tồn tại thì sẽ chạy dòng code paste dữ liệu xuống sheet. (k<>0) Nếu k bằng không thì kg có dữ liệu để paste xuống.
Cái này cũng là một dạng để phòng khi trong sheet kg có dữ liệu.
 
Upvote 0
Em cảm ơn bác. Tuy nhiên e thất sự chưa hiểu về mảng nên đoạn code như "bức vách" đối với e, Vậy bác có thể giúp e giải thích thêm về cách làm của bác được không ạ?
Mình cũng tự tìm hiểu thôi.
Thay vì bạn xem dữ liệu trên trang tính là từng dòng từng cột, bạn dùng for while gì đó quét qua vị trí từng ô, thì mảng nghĩa là ban đầu bạn định hình kích thước của nó (bằng cách xác định số dòng dữ liệu trong trang tính, số cột) sau đó nạp cả khối của dữ liệu này vào một thứ gọi là mảng (ở đây gọi là mảng 2 chiều - tạm hiểu số dòng và cột > 2).
Với mảng này bạn cũng quét qua vị trí đầu tới cuối của mảng, bạn xem thêm Ubound và Lbound, rồi cũng xử lý những If, then bình thường.
theo mình hiểu nó nhanh hơn vì dữ liệu khi bạn nạp vào mảng thì nó nằm đâu đó trên ram, khi truy xuất sẽ nhanh hơn là mỗi lần tính, bạn phải quay xuống sheet để xử lý, xử lý xong hết trên cái mảng kia thì bạn lại đưa nó xuống sheet lại.
Vì mảng cơ động hơn, có thể trans từ mảng này qua mảng kia.
Có gì thì các cao nhân sẽ trả lời thêm.
 
Upvote 0
Code chạy tốt bác ạ, e xin phép được áp dụng nó vào công việc của mình.
Hiên tại e chưa hiểu câu lệnh này "If k Then ..." làm phiền bác giải thích giúp e được ko?
"If k Then ..." viết tắt của lệnh đầy đủ hơn: "If k>0 Then ..." có dữ liệu kết quả mới gán kết quả
Trong code lệnh nầy 99,9% không cần "If..."
Bạn không rành về VBA và giải thuật nên khó giải thích cho bạn hiểu
 
Upvote 0
"If k Then ..." viết tắt của lệnh đầy đủ hơn: "If k>0 Then ..." có dữ liệu kết quả mới gán kết quả
Trong code lệnh nầy 99,9% không cần "If..."
Bạn không rành về VBA và giải thuật nên khó giải thích cho bạn hiểu

Mình cũng tự tìm hiểu thôi.
Thay vì bạn xem dữ liệu trên trang tính là từng dòng từng cột, bạn dùng for while gì đó quét qua vị trí từng ô, thì mảng nghĩa là ban đầu bạn định hình kích thước của nó (bằng cách xác định số dòng dữ liệu trong trang tính, số cột) sau đó nạp cả khối của dữ liệu này vào một thứ gọi là mảng (ở đây gọi là mảng 2 chiều - tạm hiểu số dòng và cột > 2).
Với mảng này bạn cũng quét qua vị trí đầu tới cuối của mảng, bạn xem thêm Ubound và Lbound, rồi cũng xử lý những If, then bình thường.
theo mình hiểu nó nhanh hơn vì dữ liệu khi bạn nạp vào mảng thì nó nằm đâu đó trên ram, khi truy xuất sẽ nhanh hơn là mỗi lần tính, bạn phải quay xuống sheet để xử lý, xử lý xong hết trên cái mảng kia thì bạn lại đưa nó xuống sheet lại.
Vì mảng cơ động hơn, có thể trans từ mảng này qua mảng kia.
Có gì thì các cao nhân sẽ trả lời thêm.

Cảm ơn 2 bác đã giải thích!
 
Upvote 0
Web KT
Back
Top Bottom