Tìm giải pháp trừ lùi nguyên liệu xuất nhập khẩu (1 người xem)

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

luongcongdua

Thành viên mới
Tham gia
3/10/25
Bài viết
4
Được thích
0
1. Khi nhập liệu cột J và K , Lấy dữ liệu từ bảng A và cho ra kết quả số tờ khai nhập bảng B (cột L),
Dữ liệu được dò từ bảng A (dò trên xuống dưới).
Nếu số lượng của mã hàng trong tờ khai nhập đó không đủ sẽ trừ hết tờ khai đó rồi chuyển sang tờ khai khác.
2. Số lượng tồn cuối(cột F) sẽ bằng số lượng tồn đầu(cột E) trừ số lượng xuất(cột K)
xin cảm ơn ạ!
 

File đính kèm

cái này có lẽ đưa sang box lập trình có khi còn có người mò đến á.
 
tạm thời mình đặt công thức cho cột F và cột G, một cột cho office thường và 1 cột cho office 365 bạn kiểm tra xem mình viết đúng chưa. còn cột L để mình nghĩ đã, à mà bạn có dùng office 365 không?
 

File đính kèm

Gửi bạn Code tham khảo từ Chat GPT:

Cách dùng:​

  1. Dán code này vào Module chuẩn (Alt + F11 → Insert → Module)
  2. Mở sheet có cả bảng Nhập & Xuất
  3. Chạy macro PhanBo_FIFO_CungSheet_Final_V2
  4. Nếu bạn muốn dữ liệu bắt đầu ở dòng khác (vd dòng 5, dòng 10), chỉ cần sửa: StartRow = 5
Mã:
Sub PhanBo_FIFO_CungSheet_Final_V2()
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' --- Cấu hình ---
    Dim StartRow As Long
    StartRow = 4  ' <<< DÒNG BẮT ĐẦU DỮ LIỆU (tùy chỉnh ở đây) >>>
    
    Dim bResetF As Boolean
    bResetF = True  ' True = reset cột F = cột E trước khi chạy

    ' --- Biến chính ---
    Dim ws As Worksheet
    Dim lastRowNhap As Long, lastRowXuat As Long
    Dim rN As Long, rX As Long
    Dim maHang As String
    Dim needQty As Double
    Dim remainQty As Double
    Dim takeQty As Double
    Dim phieuID As String
    Dim resultText As String

    Set ws = ActiveSheet

    ' --- xác định dòng cuối ---
    lastRowNhap = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row   ' cột D = Mã hàng nhập
    lastRowXuat = ws.Cells(ws.Rows.Count, "J").End(xlUp).Row   ' cột J = Mã hàng xuất

    ' --- (Tuỳ chọn) Reset cột F bằng cột E ---
    If bResetF Then
        For rN = StartRow To lastRowNhap
            If IsNumeric(ws.Cells(rN, "E").Value) Then
                ws.Cells(rN, "F").Value = CDbl(ws.Cells(rN, "E").Value)
            Else
                ws.Cells(rN, "F").Value = 0
            End If
        Next rN
    Else
        For rN = StartRow To lastRowNhap
            If Not IsNumeric(ws.Cells(rN, "F").Value) Then ws.Cells(rN, "F").Value = 0
        Next rN
    End If

    ' --- Xóa nội dung cũ ở cột L ---
    If lastRowXuat >= StartRow Then ws.Range("L" & StartRow & ":L" & lastRowXuat).ClearContents

    ' --- Phân bổ FIFO ---
    For rX = StartRow To lastRowXuat
        maHang = Trim(CStr(ws.Cells(rX, "J").Value))
        If maHang = "" Then
            ws.Cells(rX, "L").Value = ""
            GoTo NextXRow
        End If

        If IsNumeric(ws.Cells(rX, "K").Value) Then
            needQty = CDbl(ws.Cells(rX, "K").Value)
        Else
            needQty = 0
        End If

        resultText = ""

        If needQty > 0 Then
            For rN = StartRow To lastRowNhap
                If needQty <= 0 Then Exit For

                If Trim(CStr(ws.Cells(rN, "D").Value)) = maHang Then
                    If IsNumeric(ws.Cells(rN, "F").Value) Then
                        remainQty = CDbl(ws.Cells(rN, "F").Value)
                    Else
                        remainQty = 0
                    End If

                    If remainQty > 0 Then
                        If remainQty >= needQty Then
                            takeQty = needQty
                            remainQty = remainQty - takeQty
                            needQty = 0
                        Else
                            takeQty = remainQty
                            needQty = needQty - remainQty
                            remainQty = 0
                        End If

                        ws.Cells(rN, "F").Value = remainQty
                        phieuID = Trim(CStr(ws.Cells(rN, "B").Value))
                        If phieuID = "" Then phieuID = "?"

                        If resultText = "" Then
                            resultText = phieuID & "=" & FormatNumber(takeQty, 0, vbFalse, vbFalse, vbFalse)
                        Else
                            resultText = resultText & ", " & phieuID & "=" & FormatNumber(takeQty, 0, vbFalse, vbFalse, vbFalse)
                        End If
                    End If
                End If
            Next rN
        End If

        ' --- Ghi kết quả ---
        If resultText = "" Then
            If needQty > 0 Then
                ws.Cells(rX, "L").Value = "Không có mã hàng/Thiếu " & needQty
            Else
                ws.Cells(rX, "L").Value = ""
            End If
        Else
            If needQty > 0 Then
                ws.Cells(rX, "L").Value = resultText & " (Thiếu " & needQty & ")"
            Else
                ws.Cells(rX, "L").Value = resultText
            End If
        End If

NextXRow:
    Next rX

    MsgBox "Hoàn tất phân bổ FIFO từ dòng " & StartRow & "!", vbInformation

CleanExit:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub

ErrHandler:
    MsgBox "Lỗi: " & Err.Number & " - " & Err.Description, vbCritical
    Resume CleanExit
End Sub
 
Gửi bạn Code tham khảo từ Chat GPT:

Cách dùng:​

  1. Dán code này vào Module chuẩn (Alt + F11 → Insert → Module)
  2. Mở sheet có cả bảng Nhập & Xuất
  3. Chạy macro PhanBo_FIFO_CungSheet_Final_V2
  4. Nếu bạn muốn dữ liệu bắt đầu ở dòng khác (vd dòng 5, dòng 10), chỉ cần sửa: StartRow = 5
Mã:
Sub PhanBo_FIFO_CungSheet_Final_V2()
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' --- Cấu hình ---
    Dim StartRow As Long
    StartRow = 4  ' <<< DÒNG BẮT ĐẦU DỮ LIỆU (tùy chỉnh ở đây) >>>
   
    Dim bResetF As Boolean
    bResetF = True  ' True = reset cột F = cột E trước khi chạy

    ' --- Biến chính ---
    Dim ws As Worksheet
    Dim lastRowNhap As Long, lastRowXuat As Long
    Dim rN As Long, rX As Long
    Dim maHang As String
    Dim needQty As Double
    Dim remainQty As Double
    Dim takeQty As Double
    Dim phieuID As String
    Dim resultText As String

    Set ws = ActiveSheet

    ' --- xác định dòng cuối ---
    lastRowNhap = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row   ' cột D = Mã hàng nhập
    lastRowXuat = ws.Cells(ws.Rows.Count, "J").End(xlUp).Row   ' cột J = Mã hàng xuất

    ' --- (Tuỳ chọn) Reset cột F bằng cột E ---
    If bResetF Then
        For rN = StartRow To lastRowNhap
            If IsNumeric(ws.Cells(rN, "E").Value) Then
                ws.Cells(rN, "F").Value = CDbl(ws.Cells(rN, "E").Value)
            Else
                ws.Cells(rN, "F").Value = 0
            End If
        Next rN
    Else
        For rN = StartRow To lastRowNhap
            If Not IsNumeric(ws.Cells(rN, "F").Value) Then ws.Cells(rN, "F").Value = 0
        Next rN
    End If

    ' --- Xóa nội dung cũ ở cột L ---
    If lastRowXuat >= StartRow Then ws.Range("L" & StartRow & ":L" & lastRowXuat).ClearContents

    ' --- Phân bổ FIFO ---
    For rX = StartRow To lastRowXuat
        maHang = Trim(CStr(ws.Cells(rX, "J").Value))
        If maHang = "" Then
            ws.Cells(rX, "L").Value = ""
            GoTo NextXRow
        End If

        If IsNumeric(ws.Cells(rX, "K").Value) Then
            needQty = CDbl(ws.Cells(rX, "K").Value)
        Else
            needQty = 0
        End If

        resultText = ""

        If needQty > 0 Then
            For rN = StartRow To lastRowNhap
                If needQty <= 0 Then Exit For

                If Trim(CStr(ws.Cells(rN, "D").Value)) = maHang Then
                    If IsNumeric(ws.Cells(rN, "F").Value) Then
                        remainQty = CDbl(ws.Cells(rN, "F").Value)
                    Else
                        remainQty = 0
                    End If

                    If remainQty > 0 Then
                        If remainQty >= needQty Then
                            takeQty = needQty
                            remainQty = remainQty - takeQty
                            needQty = 0
                        Else
                            takeQty = remainQty
                            needQty = needQty - remainQty
                            remainQty = 0
                        End If

                        ws.Cells(rN, "F").Value = remainQty
                        phieuID = Trim(CStr(ws.Cells(rN, "B").Value))
                        If phieuID = "" Then phieuID = "?"

                        If resultText = "" Then
                            resultText = phieuID & "=" & FormatNumber(takeQty, 0, vbFalse, vbFalse, vbFalse)
                        Else
                            resultText = resultText & ", " & phieuID & "=" & FormatNumber(takeQty, 0, vbFalse, vbFalse, vbFalse)
                        End If
                    End If
                End If
            Next rN
        End If

        ' --- Ghi kết quả ---
        If resultText = "" Then
            If needQty > 0 Then
                ws.Cells(rX, "L").Value = "Không có mã hàng/Thiếu " & needQty
            Else
                ws.Cells(rX, "L").Value = ""
            End If
        Else
            If needQty > 0 Then
                ws.Cells(rX, "L").Value = resultText & " (Thiếu " & needQty & ")"
            Else
                ws.Cells(rX, "L").Value = resultText
            End If
        End If

NextXRow:
    Next rX

    MsgBox "Hoàn tất phân bổ FIFO từ dòng " & StartRow & "!", vbInformation

CleanExit:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub

ErrHandler:
    MsgBox "Lỗi: " & Err.Number & " - " & Err.Description, vbCritical
    Resume CleanExit
End Sub
đúng ý tôi cần.tôi đang test lại, xin cám ơn bạn
 
Gửi bạn Code tham khảo từ Chat GPT:

Cách dùng:​

  1. Dán code này vào Module chuẩn (Alt + F11 → Insert → Module)
  2. Mở sheet có cả bảng Nhập & Xuất
  3. Chạy macro PhanBo_FIFO_CungSheet_Final_V2
  4. Nếu bạn muốn dữ liệu bắt đầu ở dòng khác (vd dòng 5, dòng 10), chỉ cần sửa: StartRow = 5
Mã:
Sub PhanBo_FIFO_CungSheet_Final_V2()
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    ' --- Cấu hình ---
    Dim StartRow As Long
    StartRow = 4  ' <<< DÒNG BẮT ĐẦU DỮ LIỆU (tùy chỉnh ở đây) >>>
   
    Dim bResetF As Boolean
    bResetF = True  ' True = reset cột F = cột E trước khi chạy

    ' --- Biến chính ---
    Dim ws As Worksheet
    Dim lastRowNhap As Long, lastRowXuat As Long
    Dim rN As Long, rX As Long
    Dim maHang As String
    Dim needQty As Double
    Dim remainQty As Double
    Dim takeQty As Double
    Dim phieuID As String
    Dim resultText As String

    Set ws = ActiveSheet

    ' --- xác định dòng cuối ---
    lastRowNhap = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row   ' cột D = Mã hàng nhập
    lastRowXuat = ws.Cells(ws.Rows.Count, "J").End(xlUp).Row   ' cột J = Mã hàng xuất

    ' --- (Tuỳ chọn) Reset cột F bằng cột E ---
    If bResetF Then
        For rN = StartRow To lastRowNhap
            If IsNumeric(ws.Cells(rN, "E").Value) Then
                ws.Cells(rN, "F").Value = CDbl(ws.Cells(rN, "E").Value)
            Else
                ws.Cells(rN, "F").Value = 0
            End If
        Next rN
    Else
        For rN = StartRow To lastRowNhap
            If Not IsNumeric(ws.Cells(rN, "F").Value) Then ws.Cells(rN, "F").Value = 0
        Next rN
    End If

    ' --- Xóa nội dung cũ ở cột L ---
    If lastRowXuat >= StartRow Then ws.Range("L" & StartRow & ":L" & lastRowXuat).ClearContents

    ' --- Phân bổ FIFO ---
    For rX = StartRow To lastRowXuat
        maHang = Trim(CStr(ws.Cells(rX, "J").Value))
        If maHang = "" Then
            ws.Cells(rX, "L").Value = ""
            GoTo NextXRow
        End If

        If IsNumeric(ws.Cells(rX, "K").Value) Then
            needQty = CDbl(ws.Cells(rX, "K").Value)
        Else
            needQty = 0
        End If

        resultText = ""

        If needQty > 0 Then
            For rN = StartRow To lastRowNhap
                If needQty <= 0 Then Exit For

                If Trim(CStr(ws.Cells(rN, "D").Value)) = maHang Then
                    If IsNumeric(ws.Cells(rN, "F").Value) Then
                        remainQty = CDbl(ws.Cells(rN, "F").Value)
                    Else
                        remainQty = 0
                    End If

                    If remainQty > 0 Then
                        If remainQty >= needQty Then
                            takeQty = needQty
                            remainQty = remainQty - takeQty
                            needQty = 0
                        Else
                            takeQty = remainQty
                            needQty = needQty - remainQty
                            remainQty = 0
                        End If

                        ws.Cells(rN, "F").Value = remainQty
                        phieuID = Trim(CStr(ws.Cells(rN, "B").Value))
                        If phieuID = "" Then phieuID = "?"

                        If resultText = "" Then
                            resultText = phieuID & "=" & FormatNumber(takeQty, 0, vbFalse, vbFalse, vbFalse)
                        Else
                            resultText = resultText & ", " & phieuID & "=" & FormatNumber(takeQty, 0, vbFalse, vbFalse, vbFalse)
                        End If
                    End If
                End If
            Next rN
        End If

        ' --- Ghi kết quả ---
        If resultText = "" Then
            If needQty > 0 Then
                ws.Cells(rX, "L").Value = "Không có mã hàng/Thiếu " & needQty
            Else
                ws.Cells(rX, "L").Value = ""
            End If
        Else
            If needQty > 0 Then
                ws.Cells(rX, "L").Value = resultText & " (Thiếu " & needQty & ")"
            Else
                ws.Cells(rX, "L").Value = resultText
            End If
        End If

NextXRow:
    Next rX

    MsgBox "Hoàn tất phân bổ FIFO từ dòng " & StartRow & "!", vbInformation

CleanExit:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub

ErrHandler:
    MsgBox "Lỗi: " & Err.Number & " - " & Err.Description, vbCritical
    Resume CleanExit
End Sub
có thể giúp tôi: 1. sau dấu = có thể lấy số lẻ sau dấu .2 chứ số không ạ. và những số 0. ... hiển thị ạ.
2 là. số tờ khai nhập thứ 2,3,4 ... khi tờ khai nhập 1 không đủ sẽ hiển thị lần lượt ở các ô kế bên được không ạ.
 

File đính kèm

có thể giúp tôi: 1. sau dấu = có thể lấy số lẻ sau dấu .2 chứ số không ạ. và những số 0. ... hiển thị ạ.
2 là. số tờ khai nhập thứ 2,3,4 ... khi tờ khai nhập 1 không đủ sẽ hiển thị lần lượt ở các ô kế bên được không ạ.
mình không hiểu cái số 1 lắm, nhưng cái số 2 thì dễ. chiều nay mình đang bận việc nên giờ mới có thời gian làm nốt. mình đang để giới hạn của bảng A là 50.000 dòng. bảng B là 10.000 dòng. nếu mở rộng dữ liệu bạn cần mở rộng 2 giới hạn này ra.
 

File đính kèm

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

Back
Top Bottom