Hỏi cách tính N-X-T theo nhiều điều kiện?

Liên hệ QC
Xin chờ thông tin từ bạn!

Thực ra là cái này việc này là mới thôi bạn à, trước đây làm kiểu khác bởi người làm trước sắp về hưu nên theo cách cũ thủ công, cổ điển. Nay người ta gần về hưu rồi thì phát sinh công việc này và mình đã phải thiết kế lại mẫu biểu, tuy nhiên trong quá trình làm các hàm mình vướng chỗ nào lại nghĩ ra cách để mò và hỏi tương tự giống với vướng mắc mình đang gặp phải rồi mình mới áp dụng vào biểu chính. Thực ra bây giờ vẫn chưa có biểu với số liệu chính thức nên không có dữ liệu cũ để gửi lên đây mà chỉ có dữ liệu nháp nên nhiều khi test độ chính xác của công thức cũng mất thời gian chứ bên mình cũng không ngại đưa số liệu thật lên đây đâu. Trong thời gian tới nếu như hàm và công thức đã thiết kế khó đáp ứng được yêu cầu của công việc nhất định mình cần nhờ đến sự giúp đỡ của các bạn. Mình cảm ơn thành ý của bạn và các bạn trong diễn đàn, đã nhiều lần việc mình rất cần để xử lý may mà có các bạn giúp đỡ chứ không mình bế tắc không thể tiếp tục được. Thân!
 
Phần yêu cầu của bài N-X-T theo nhiều điều kiện trong bài này mình đã test xong, mình gửi lên diễn đàn cho bạn nào cần tìm để áp dụng cho công việc tương tự.
 

File đính kèm

  • Nhap - Xuat - Ton.xlsx
    31.3 KB · Đọc: 13
Trong file ban đầu, bạn nói chỉ có 3 kho và vài mặt hàng. Đến bài #15, con số là 30 kho và 20 mặt hàng.
Với con số này thì Excel khong quản lý nổi đâu. Nên chuyển dữ liệu phát sinh vào Access và thiết kế bảng kho, bảng mặt hàng hoàn chỉnh. Lúc cần báo cáo thì dùng query lấy ra.
 
Trong file ban đầu, bạn nói chỉ có 3 kho và vài mặt hàng. Đến bài #15, con số là 30 kho và 20 mặt hàng.
Với con số này thì Excel khong quản lý nổi đâu. Nên chuyển dữ liệu phát sinh vào Access và thiết kế bảng kho, bảng mặt hàng hoàn chỉnh. Lúc cần báo cáo thì dùng query lấy ra.

Trước đây mình cũng có làm ứng dụng nhỏ bằng Access 2003 nhưng đến phần làm báo cáo thì không làm được, bỏ cũng lâu rồi nên mình ngại đụng đến Access quá không biết bây giờ Access 2013 có tùy biến hơn Access 2003 nhiều không. Mình vẫn đang trong quá trình test để xem liệu có sử dụng được không đã, công thức Excel nhiều quá chắc sẽ nặng lắm.
 
(1) Xài MS Access thì cần biết VBA; Nếu không thì nên chuyển sang xài Excel;

(2) Mình đã thử làm trong Excel với 2.200 dòng, 35 kho & chục mặt hàng thì mất cỡ 1.5'' cho mỗi lần chạy macro;

(3) Mình vẫn khuyên bạn chủ đề tài thảo luận, là:

CSDL nên & chỉ nên có các trường sau:

[STT], [Ngày], [N/X], [Mã SF], [Ca], [(Mã) Kho], [So Luong]

Với CSDL như vậy thì không thể làm khó trogn Excel với iêu cầu 2000 dòng & số kho cũng như số mặt hàng bạn đã nêu

Rất mừng & sẵn lòng giúp tiếp, nếu bạn từ bỏ Form của bạn & xây dựng CSDL như trên!
 
Phần yêu cầu của bài N-X-T theo nhiều điều kiện trong bài này mình đã test xong, mình gửi lên diễn đàn cho bạn nào cần tìm để áp dụng cho công việc tương tự.
File vướng nguyên tắc cơ bản của việc ghi sổ, nhập liệu vào cơ sở dữ liệu:
Dữ liệu phải ghi nhận theo trình tự thời gian
Sử dụng kết quả theo công thức trong file rất dể bị mất việc
 
(Trang) CSDL nên & chỉ nên có các trường sau:
[STT], [Ngày], [N/X], [Mã SF], [Ca], [(Mã) Kho], [So Luong]
Nếu bạn nhập đủ dữ liệu hơn 2 ngàn dòng & chạy macro này trên trang 'BCao':
PHP:
Sub GPEThongKeNXT()
 Dim Sh As Worksheet, Arr(), Cls As Range, dArr()
 Dim Rws As Long, J As Long, W As Long
 Dim TDKy As Double, Tmr As Double, Nhap As Double, Xuat As Double
 Set Sh = ThisWorkbook.Worksheets("CSDL")
 Rws = Sh.[b2].CurrentRegion.Rows.Count
 Arr() = Sh.[b2].Resize(Rws, 6).Value:              Tmr = Timer()
 Sheets("BCao").Select:                             Randomize
1 dArr() = Range([b5], [b5].End(xlDown)).Resize(, 4).Value
 Range([b5], [b5].End(xlDown)).Offset(, 1).Resize(, 3).ClearContents
 For W = 1 To UBound(dArr())
    For J = 1 To UBound(Arr())
2       If Arr(J, 1) < [e1].Value And Arr(J, 3) = dArr(W, 1) And Arr(J, 5) = [h1].Value Then
            If Arr(J, 2) = "N" Then
                dArr(W, 2) = dArr(W, 2) + Arr(J, 6)
            ElseIf Arr(J, 2) = "X" Then
                dArr(W, 2) = dArr(W, 2) - Arr(J, 6)
            End If
        End If
3       If Arr(J, 1) >= [e1].Value And Arr(J, 3) = dArr(W, 1) And Arr(J, 5) = [h1].Value _
            And Arr(J, 1) <= [e2].Value Then
            If Arr(J, 2) = "N" Then
                dArr(W, 3) = dArr(W, 3) + Arr(J, 6)
            ElseIf Arr(J, 2) = "X" Then
                dArr(W, 4) = dArr(W, 4) + Arr(J, 6)
            End If
        End If
    Next J
 Next W
 Range([b5], [b5].End(xlDown)).Resize(, 4).Value = dArr()
 [c4].Resize(, 3).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
 [A1].Value = Timer() - Tmr
End Sub

với các chú chỉ đẫn theo 3 dòng lệnh có đánh số như sau

Dòng đánh số 1: Vùng Range([b5], [b5].End(xlDown)) là vùng chứa danh sách các mã mặt hàng bạn đang có;

Dòng đánh số 2: [H1] trên trang 'BCao' đang chứa mã kho cần hiễn thị số liệu;

Dòng đang có số 3: [e1] là ô ghi ngày bắt đầu & dưới nó là ngày kết thúc số liệu báo cáo (ví dụ: [E1]:=01/04/2017; [E2]:= 30/06/2017).

Chúc vui!
 
Cái này nếu tôi đưa vào CSDL LH thì chỉ dùng Query bình thường đủ rồi. Lúc cần báo cáo thì cho query xuất ra csv và import vào Excel.
Tính tôi thích làm thủ công, lười viết code VBA lắm.
 
Mình thì ngược lại, viết Code vì chả có việc gì làm nữa cả:
Mã:
Option Explicit
Sub TKeTheoSanFam()
 Range([b5], [b5].End(xlDown)).Resize(, 4).ClearContents
 Worksheets("CSDL").[aA2].CurrentRegion.Copy Destination:=[B4]
 GPE [h2], 5, 3
End Sub
Mã:
Sub TKeTheoKho()
 Range([b5], [b5].End(xlDown)).Resize(, 4).ClearContents
 Sheets("CSDL").[aC2].CurrentRegion.Copy Destination:=[B4]
 GPE [h1], 3, 5
End Sub
PHP:
Sub GPE(Rng As Range, Col As Byte, Cot As Byte)
 Dim Sh As Worksheet, Arr(), dArr()
 Dim Rws As Long, J As Long, W As Long, Tmr As Double
 
 Sheets("BCao").Select:                     Tmr = Timer()
 Set Sh = ThisWorkbook.Worksheets("CSDL")
 Rws = Sh.[b2].CurrentRegion.Rows.Count
 Arr() = Sh.[b2].Resize(Rws, 6).Value
 dArr() = Range([b5], [b5].End(xlDown)).Resize(, 4).Value
 For W = 1 To UBound(dArr())
    For J = 1 To UBound(Arr())
2       If Arr(J, 1) < [e1].Value And Arr(J, Col) = dArr(W, 1) And Arr(J, Cot) = Rng.Value Then
            If Arr(J, 2) = "N" Then
                dArr(W, 2) = dArr(W, 2) + Arr(J, 6)
            ElseIf Arr(J, 2) = "X" Then
                dArr(W, 2) = dArr(W, 2) - Arr(J, 6)
            End If
        End If
3       If Arr(J, 1) >= [e1].Value And Arr(J, Col) = dArr(W, 1) And Arr(J, Cot) = Rng.Value _
            And Arr(J, 1) <= [e2].Value Then
            If Arr(J, 2) = "N" Then
                dArr(W, 3) = dArr(W, 3) + Arr(J, 6)
            ElseIf Arr(J, 2) = "X" Then
                dArr(W, 4) = dArr(W, 4) + Arr(J, 6)
            End If
        End If
    Next J
 Next W
 Range([b5], [b5].End(xlDown)).Resize(, 4).Value = dArr()
 Randomize:                                         [A1].Value = Timer() - Tmr
 [c4].Resize(, 3).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
End Sub

Xin các bạn xem file theo đường dẫn của bài kế tiếp
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom