Bài toán chia khối lượng

botrangkuns

Thành viên mới
Tham gia ngày
5 Tháng năm 2016
Bài viết
10
Được thích
0
Điểm
163
Tuổi
34
Kính gửi các anh chị!
Em đang gặp 1 bài toán như sau:
Có 2 bảng số liệu là: Vật tư theo hợp đồng và vật tư về công trường. Nhiệm vụ:
VD: Đối với chủng loại vật liệu A, ta phải điền từ bảng vật liệu vật tư về công trường vào bảng vật tư theo hợp đồng theo thứ tự từ trên xuống dưới.
Trước hết lấy hàng đầu tiên của về công trường gán vào khối lượng của HĐ cùng chủng loại (ở đây là A), nếu nhỏ hơn thì xuống dòng tiếp tục lấy hàng thứ 2 của bảng về công trường đổ vào khối lượng hàng 1 của HĐ rồi cộng với khối lượng hàng 1 đã đổ vào, nếu tổng vẫn nhỏ hơn thì lấy tiếp đến hàng thứ 3…. Cứ như vậy cho đến khi đầy hàng 1 của HĐ, xuống dòng.
Khi đầy hàng 1, thì phần dư này của cùng chủng loại sẽ được đổ xuống hàng 2 của HĐ, nếu nhỏ hơn tiếp tục lấy hàng dưới của bảng về công trường đổ tiếp vào hàng 2, nếu tổng vẫn nhỏ hơn hàng 2 của HĐ thì lấy đến hàng tiếp theo…… cho đến khi đầy hàng 2 của HĐ, xuống dòng
…….
Khi đã điền hết 1 chủng loại của HĐ rồi, mà chủng loại của về công trường đó vẫn còn dư, thì sẽ được dồn vào hàng cuối cùng của chủng loại đó

…….
Vòng lặp tiếp tục cho chủng loại vật tư tiếp theo

Em chưa tìm được thuật toán phù hợp, rất mong các anh/chị chỉ dùm
Em cảm ơn các anh/chị nhiều.
(Đọc có vẻ hơi khó hiểu, mong các anh/chị xem file đính kèm ở dòng kết quả)
 

File đính kèm

snow25

Thành viên tích cực
Tham gia ngày
24 Tháng bảy 2018
Bài viết
1,583
Được thích
1,275
Điểm
210
Kính gửi các anh chị!
Em đang gặp 1 bài toán như sau:
Có 2 bảng số liệu là: Vật tư theo hợp đồng và vật tư về công trường. Nhiệm vụ:
VD: Đối với chủng loại vật liệu A, ta phải điền từ bảng vật liệu vật tư về công trường vào bảng vật tư theo hợp đồng theo thứ tự từ trên xuống dưới.
Trước hết lấy hàng đầu tiên của về công trường gán vào khối lượng của HĐ cùng chủng loại (ở đây là A), nếu nhỏ hơn thì xuống dòng tiếp tục lấy hàng thứ 2 của bảng về công trường đổ vào khối lượng hàng 1 của HĐ rồi cộng với khối lượng hàng 1 đã đổ vào, nếu tổng vẫn nhỏ hơn thì lấy tiếp đến hàng thứ 3…. Cứ như vậy cho đến khi đầy hàng 1 của HĐ, xuống dòng.
Khi đầy hàng 1, thì phần dư này của cùng chủng loại sẽ được đổ xuống hàng 2 của HĐ, nếu nhỏ hơn tiếp tục lấy hàng dưới của bảng về công trường đổ tiếp vào hàng 2, nếu tổng vẫn nhỏ hơn hàng 2 của HĐ thì lấy đến hàng tiếp theo…… cho đến khi đầy hàng 2 của HĐ, xuống dòng
…….
Khi đã điền hết 1 chủng loại của HĐ rồi, mà chủng loại của về công trường đó vẫn còn dư, thì sẽ được dồn vào hàng cuối cùng của chủng loại đó

…….
Vòng lặp tiếp tục cho chủng loại vật tư tiếp theo

Em chưa tìm được thuật toán phù hợp, rất mong các anh/chị chỉ dùm
Em cảm ơn các anh/chị nhiều.
(Đọc có vẻ hơi khó hiểu, mong các anh/chị xem file đính kèm ở dòng kết quả)
Bạn xem code nhé.Mà có khác kết quả với bạn.
Mã:
Sub chiakhoiluong()
    Dim arr, arr1, arr2, i As Long, a As Long, b As Long, k As Long
    With Sheet1
        arr = .Range("a4:C19").Value
        arr1 = .Range("E4:G18").Value
        ReDim arr2(1 To UBound(arr1, 1) * 5, 1 To 4)
        For i = 1 To UBound(arr1, 1)
           If arr1(i, 2) > 0 Then
            For k = 1 To UBound(arr, 1)
                If arr1(i, 1) = arr(k, 2) Then
                If arr(k, 3) > 0 Then
                   If arr1(i, 2) <= arr(k, 3) Then
                      a = a + 1
                      arr2(a, 1) = arr(k, 1)
                      arr2(a, 2) = arr(k, 2)
                      arr2(a, 3) = arr1(i, 2)
                      arr2(a, 4) = arr1(i, 3)
                      arr(k, 3) = arr(k, 3) - arr1(i, 2)
                      arr1(i, 2) = 0
                      Exit For
                    Else
                      a = a + 1
                      arr2(a, 1) = arr(k, 1)
                      arr2(a, 2) = arr(k, 2)
                      arr2(a, 3) = arr(k, 3)
                      arr2(a, 4) = arr1(i, 3)
                      arr1(i, 2) = arr1(i, 2) - arr(k, 3)
                      arr(k, 3) = 0
                    End If
                End If
               End If
           Next k
        End If
     Next i
     .Range("n4").Resize(a, 4).Value = arr2
  End With
End Sub
 

File đính kèm

botrangkuns

Thành viên mới
Tham gia ngày
5 Tháng năm 2016
Bài viết
10
Được thích
0
Điểm
163
Tuổi
34
Trước hết cảm ơn bác nhiều, em đã sửa lại vào đúng bài toán của em, tuy nhiên còn có một yêu cầu nữa chưa được thực hiện bác ạ!

Đối với chủng loại vật tư nhập về công trường, nếu trong trường hợp nhiều hơn số lượng hợp đồng thì sẽ được tự động dồn xuống các dòng ngay sau đó
Tức là sau khi hoàn tất thì số lượng trong file kết quả phải bằng với khối lượng trong file vật tư nhập về
Vậy nhờ các anh/chị hỗ trợ dùm em xử lý nốt phần này với ạ
(Phần em bôi mầu đỏ trong file là chưa thực hiện được)
Thank các anh/chị nhiều

Chi tiết trong file đính kèm
 

File đính kèm

Lần chỉnh sửa cuối:
Top