Công thức theo dõi nguyên liệu

Liên hệ QC

Hoangquyenbong

Thành viên hoạt động
Tham gia
13/7/18
Bài viết
199
Được thích
38
Dear cả nhà,
Em có 1 file excel ví dụ minh họa đính kèm, mong muốn được cả nhà giúp em viết hàm excel hoặc sử dụng VBA ( vì em mới tiếp xúc VBA) nên ko biết viết câu lệnh.
Cụ thể thì file em muốn lập 1 fiel để theo dõi lượng nguyên phụ liệu tồn theo thứ tự thời gian, quá trình nhập xuất có bị âm thời điểm ko.
em xin cảm ơn cả nhà và mong nhận được sự giúp đỡ của các cao nhân.
 

File đính kèm

  • Thuy.xlsx
    15.3 KB · Đọc: 23
Dear cả nhà,
Em có 1 file excel ví dụ minh họa đính kèm, mong muốn được cả nhà giúp em viết hàm excel hoặc sử dụng VBA ( vì em mới tiếp xúc VBA) nên ko biết viết câu lệnh.
Cụ thể thì file em muốn lập 1 fiel để theo dõi lượng nguyên phụ liệu tồn theo thứ tự thời gian, quá trình nhập xuất có bị âm thời điểm ko.
em xin cảm ơn cả nhà và mong nhận được sự giúp đỡ của các cao nhân.
Giải phap công thức.
Nên điều chỉnh các tên sheet cho ngắn gọn hơn, như:
  • NNL: "Nhập Nguyên vật liệu"
  • XSP: "Xuất sản phẩm"
  • DM: "Định mức sử dụng NVL cho 1 sản phẩm"
Thử:
Mã:
D4=SUMIFS(NNL!$C$2:$C$1000,NNL!$A$2:$A$1000,$C4,NNL!$B$2:$B$1000,LOOKUP("zzz",$D$2:D$2))
E4=SUMPRODUCT(SUMIFS(DM!$C$2:$C$1000,DM!$A$2:$A$1000,XSP!$A$2:$A$1000,DM!$B$2:$B$1000,LOOKUP("zzz",$D$2:D$2))*XSP!$C$2:$C$1000*(XSP!$B$2:$B$1000=$C4))
F4=N(F3)+D4-E4
Enter, fill xuống. Xong, chọn Vùng công thức vừa thực hiện chép qua các cột phía sau tương thích.

Thân
 

File đính kèm

  • TD_TonNVL.xlsb
    18.2 KB · Đọc: 28
Giải phap công thức.
Nên điều chỉnh các tên sheet cho ngắn gọn hơn, như:
  • NNL: "Nhập Nguyên vật liệu"
  • XSP: "Xuất sản phẩm"
  • DM: "Định mức sử dụng NVL cho 1 sản phẩm"
Thử:
Mã:
D4=SUMIFS(NNL!$C$2:$C$1000,NNL!$A$2:$A$1000,$C4,NNL!$B$2:$B$1000,LOOKUP("zzz",$D$2:D$2))
E4=SUMPRODUCT(SUMIFS(DM!$C$2:$C$1000,DM!$A$2:$A$1000,XSP!$A$2:$A$1000,DM!$B$2:$B$1000,LOOKUP("zzz",$D$2:D$2))*XSP!$C$2:$C$1000*(XSP!$B$2:$B$1000=$C4))
F4=N(F3)+D4-E4
Enter, fill xuống. Xong, chọn Vùng công thức vừa thực hiện chép qua các cột phía sau tương thích.

Thân
Mình cảm ơn bạn nhiều,
Bạn làm đúng như mình mong muốn, vì là file của mình rất nhiều mã nguyên liệu cần theo dõi, thế nên không biết file excel có chạy nổi công thức không nữa.
một lần nữa xin cảm ơn bạn nhé.
 
Dear cả nhà,
Em có 1 file excel ví dụ minh họa đính kèm, mong muốn được cả nhà giúp em viết hàm excel hoặc sử dụng VBA ( vì em mới tiếp xúc VBA) nên ko biết viết câu lệnh.
Cụ thể thì file em muốn lập 1 fiel để theo dõi lượng nguyên phụ liệu tồn theo thứ tự thời gian, quá trình nhập xuất có bị âm thời điểm ko.
em xin cảm ơn cả nhà và mong nhận được sự giúp đỡ của các cao nhân.
Dùng VBA thử
Mã:
Sub NhapXuatTon()
  Dim aNhap(), aXuat(), aDinhMuc(), TieuDe(), Res(), S
  Dim SP$, NL$, iKey$, SoLuong As Double
  Dim eRow&, eCol&, sRow&, sCol&, i&, ik&, j&, jk&, n&
  Dim fDate&, eDate&, iDate&
 
  fDate = 100000: eDate = 0
  With Sheets("Nhap_NVL")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aNhap = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("A2:A" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("A2:A" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("Xuat_SP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aXuat = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("B2:B" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("B2:B" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("DinhMuc")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aDinhMuc = .Range("A2:C" & eRow).Value
  End With

  sCol = -1
  With CreateObject("scripting.dictionary")
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      NL = aDinhMuc(i, 2)
      If Len(NL) Then
        If .exists(NL) = False Then
          sCol = sCol + 3
          .Add NL, sCol
          ReDim Preserve TieuDe(1 To 1, 2 To sCol)
          TieuDe(1, sCol) = NL
        End If
      End If
      SP = "#" & aDinhMuc(i, 1) & "#"
      If Len(SP) > 2 Then
        iKey = SP & NL
        If .exists(iKey) = False Then
          .Item(SP) = .Item(SP) & "|" & NL
          .Item(iKey) = aDinhMuc(i, 3)
        End If
      End If
    Next i
    sCol = sCol + 2
    ReDim Res(fDate To eDate, 1 To sCol)
    ReDim Res(1 To eDate - fDate + 1, 1 To sCol)
    sRow = UBound(aNhap)
    For i = 1 To sRow
      ik = aNhap(i, 1)
      jk = .Item(aNhap(i, 2))
      Res(ik, jk) = Res(ik, jk) + aNhap(i, 3)
    Next i
    sRow = UBound(aXuat)
    For i = 1 To sRow
      ik = aXuat(i, 2)
      SP = "#" & aXuat(i, 1) & "#"
      S = .Item(SP)
      If InStr(1, S, "|") Then
        SoLuong = aXuat(i, 3)
        S = Split(S, "|")
        n = UBound(S)
        For j = 1 To n
          NL = S(j)
          jk = .Item(NL) + 1 'Thu tu cot NL, cot xuat
          iKey = SP & NL
          Res(ik, jk) = Res(ik, jk) + .Item(SP & NL) * SoLuong
          a = .Item(SP & NL)
        Next j
      End If
    Next i
  End With

  For i = fDate To eDate
    Res(i, 1) = CDate(i)
    For j = 2 To sCol Step 3
      Res(i, j + 2) = Res(i, j + 2) + Res(i, j) - Res(i, j + 1)
      If i > fDate Then Res(i, j + 2) = Res(i, j + 2) + Res(i - 1, j + 2)
    Next j
  Next i
  For i = fDate To eDate
    For j = 2 To sCol Step 3
      If Res(i, j) = Empty And Res(i, j + 1) = Empty Then Res(i, j + 2) = Empty
    Next j
  Next i
  Application.ScreenUpdating = False
  With Sheets("NXT_NL")
    eRow = .Range("C" & Rows.Count).End(xlUp).Row
    If eRow > 3 Then .Range("C4:AAA" & eRow).Clear
    eCol = .Range("XCC2").End(xlToLeft).Column + 2
    If eCol > 6 Then .Range("G2", Cells(3, eCol)).Clear
    .Range("D2:F3").Copy
    .Range("G2").Resize(2, sCol - 4).Select
    .Paste
    Application.CutCopyMode = False
    .Range("D2").Resize(, sCol - 2) = TieuDe
    sRow = eDate - fDate + 1
    .Range("C4").Resize(sRow, sCol) = Res
    .Range("C4").Resize(sRow, sCol).Borders.LineStyle = 1
    .Range("D4").Resize(sRow, sCol - 1).NumberFormat = "#,##0_);[Red](#,##0)"
  End With
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Thuy.xlsb
    25 KB · Đọc: 14
Cách dùng VBA nữa & đơn giản về học thuật để tham khảo:
B1: Đổi tên các trang tính tương ứng thành 'Nhap', 'Xuat', 'DMuc' & 'KQua'
B2: Đưa lên chổ trống của trang 'KQua' 1 biểu tượng vui nào đó (Shapes)
B3: & gắn vô biểu tượng 1 macro sau:
PHP:
Dim Arr0()
Sub ThongKeNXTTheoMatHang()
Dim Sh As Worksheet, Rng As Range, sRng As Range, WF As Object, Mang As Variant
Dim J As Long, Col As Integer, W As Integer, Dg As Long

1 Set WF = Application.WorksheetFunction:                Sheets("KQUa").Select
Set Rng = Range([A8], [A65500].End(xlUp))
3 With Sheets("Nhap")                'Nhâp   '
    For J = 2 To .[A2].End(xlDown).Row
5        Set sRng = Rng.Find(.Cells(J, "A").Value, , xlValues, xlWhole)  'Tìm Ngày       '
        If Not sRng Is Nothing Then
7            Col = WF.VLookup(.Cells(J, "B").Value, Sheets("DMuc").Range("NVL"), 2, False)
            Set sRng = Rng.Find(.Cells(J, "A").Value, , xlValues, xlWhole)
9            If Not sRng Is Nothing Then
                Cells(sRng.Row, Col).Value = .Cells(J, "C").Value
11            End If
        End If
13    Next J
End With
15 With Sheets("Xuat")                                        'Xuât       '
    For J = 2 To .[A2].End(xlDown).Row
17        .[r2].Value = .Cells(J, "A").Value:                 .[s2].Value = .Cells(J, "B").Value
        .[T2].Value = .Cells(J, "C").Value
19
    Next J
End With
End Sub
Mã:
Function Xuat(MaHg As String, Ngay As Date, SoLg As Double, DMuc As Range)
  Dim Arr(), dArr()
  Dim J As Long, W As Integer
'Tao Ra Bang Du Liêu Nhu Tai Trang "Nhap"  '
  With Sheets("DMuc")
      Arr() = DMuc.Value
        ReDim dArr(1 To UBound(Arr()), 1 To 5)
        For J = 1 To UBound(Arr())
            If Arr(J, 1) = MaHg Then
                W = W + 1:                                                 dArr(W, 1) = Format(Ngay, "MM/DD/yyyy")
                dArr(W, 2) = Arr(J, 2)                                  'Mã NVL '
                dArr(W, 4) = Arr(J, 3)                                   'Dinh Múc   '
                dArr(W, 5) = SoLg:                                      dArr(W, 3) = SoLg * Arr(J, 3)
            End If
        Next J
  End With
  Xuat = dArr()
End Function

Xin nói trước:
Macro này mới xong phần chuyển dữ liệu từ trang 'Nhap' sang trang kết quả. Điều này là nhờ các câu lệnh từ đầu macro cho đến dòng số 13
Sau đó là các dòng lệnh để biến dữ liệu từ 2 trang 'Xuat' & trang 'DMuc' thành 1 bảng (Tạm gọi là BX) giống như dữ liệu tại trang 'Nhap'
Việc còn lại chưa làm là chuyển dữ liệu từ BX này (có cấu trúc như trang 'Nhap') sang trang 'KQua'

Thêm nữa, câu lện mang số 7 là dùng để tra tìm ra cột cần nhập dữ liệu theo từng mặt hàng; Dữ liệu cột được tra từ bảng có trong trang 'DMuc' & nó đước gán tên là 'NVL' & có nội dung sau:

Cột
VC012
CHI5
CUC8
KHOA11
DAY14
NHAN17
VC0320
THE23
VC0226
THUNG29
VC532
GAM35
 

File đính kèm

  • VatTu.rar
    16.8 KB · Đọc: 10
Lần chỉnh sửa cuối:
Dùng VBA thử
Mã:
Sub NhapXuatTon()
  Dim aNhap(), aXuat(), aDinhMuc(), TieuDe(), Res(), S
  Dim SP$, NL$, iKey$, SoLuong As Double
  Dim eRow&, eCol&, sRow&, sCol&, i&, ik&, j&, jk&, n&
  Dim fDate&, eDate&, iDate&

  fDate = 100000: eDate = 0
  With Sheets("Nhap_NVL")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aNhap = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("A2:A" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("A2:A" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("Xuat_SP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aXuat = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("B2:B" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("B2:B" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("DinhMuc")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aDinhMuc = .Range("A2:C" & eRow).Value
  End With

  sCol = -1
  With CreateObject("scripting.dictionary")
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      NL = aDinhMuc(i, 2)
      If Len(NL) Then
        If .exists(NL) = False Then
          sCol = sCol + 3
          .Add NL, sCol
          ReDim Preserve TieuDe(1 To 1, 2 To sCol)
          TieuDe(1, sCol) = NL
        End If
      End If
      SP = "#" & aDinhMuc(i, 1) & "#"
      If Len(SP) > 2 Then
        iKey = SP & NL
        If .exists(iKey) = False Then
          .Item(SP) = .Item(SP) & "|" & NL
          .Item(iKey) = aDinhMuc(i, 3)
        End If
      End If
    Next i
    sCol = sCol + 2
    ReDim Res(fDate To eDate, 1 To sCol)
    ReDim Res(1 To eDate - fDate + 1, 1 To sCol)
    sRow = UBound(aNhap)
    For i = 1 To sRow
      ik = aNhap(i, 1)
      jk = .Item(aNhap(i, 2))
      Res(ik, jk) = Res(ik, jk) + aNhap(i, 3)
    Next i
    sRow = UBound(aXuat)
    For i = 1 To sRow
      ik = aXuat(i, 2)
      SP = "#" & aXuat(i, 1) & "#"
      S = .Item(SP)
      If InStr(1, S, "|") Then
        SoLuong = aXuat(i, 3)
        S = Split(S, "|")
        n = UBound(S)
        For j = 1 To n
          NL = S(j)
          jk = .Item(NL) + 1 'Thu tu cot NL, cot xuat
          iKey = SP & NL
          Res(ik, jk) = Res(ik, jk) + .Item(SP & NL) * SoLuong
          a = .Item(SP & NL)
        Next j
      End If
    Next i
  End With

  For i = fDate To eDate
    Res(i, 1) = CDate(i)
    For j = 2 To sCol Step 3
      Res(i, j + 2) = Res(i, j + 2) + Res(i, j) - Res(i, j + 1)
      If i > fDate Then Res(i, j + 2) = Res(i, j + 2) + Res(i - 1, j + 2)
    Next j
  Next i
  For i = fDate To eDate
    For j = 2 To sCol Step 3
      If Res(i, j) = Empty And Res(i, j + 1) = Empty Then Res(i, j + 2) = Empty
    Next j
  Next i
  Application.ScreenUpdating = False
  With Sheets("NXT_NL")
    eRow = .Range("C" & Rows.Count).End(xlUp).Row
    If eRow > 3 Then .Range("C4:AAA" & eRow).Clear
    eCol = .Range("XCC2").End(xlToLeft).Column + 2
    If eCol > 6 Then .Range("G2", Cells(3, eCol)).Clear
    .Range("D2:F3").Copy
    .Range("G2").Resize(2, sCol - 4).Select
    .Paste
    Application.CutCopyMode = False
    .Range("D2").Resize(, sCol - 2) = TieuDe
    sRow = eDate - fDate + 1
    .Range("C4").Resize(sRow, sCol) = Res
    .Range("C4").Resize(sRow, sCol).Borders.LineStyle = 1
    .Range("D4").Resize(sRow, sCol - 1).NumberFormat = "#,##0_);[Red](#,##0)"
  End With
  Application.ScreenUpdating = True
End Sub
Dạ em xin chân thành cảm ơn ạ. em đang thử file excel mà nó đơ quá luôn ạ
Bài đã được tự động gộp:

Dùng VBA thử
Mã:
Sub NhapXuatTon()
  Dim aNhap(), aXuat(), aDinhMuc(), TieuDe(), Res(), S
  Dim SP$, NL$, iKey$, SoLuong As Double
  Dim eRow&, eCol&, sRow&, sCol&, i&, ik&, j&, jk&, n&
  Dim fDate&, eDate&, iDate&

  fDate = 100000: eDate = 0
  With Sheets("Nhap_NVL")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aNhap = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("A2:A" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("A2:A" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("Xuat_SP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aXuat = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("B2:B" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("B2:B" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("DinhMuc")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aDinhMuc = .Range("A2:C" & eRow).Value
  End With

  sCol = -1
  With CreateObject("scripting.dictionary")
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      NL = aDinhMuc(i, 2)
      If Len(NL) Then
        If .exists(NL) = False Then
          sCol = sCol + 3
          .Add NL, sCol
          ReDim Preserve TieuDe(1 To 1, 2 To sCol)
          TieuDe(1, sCol) = NL
        End If
      End If
      SP = "#" & aDinhMuc(i, 1) & "#"
      If Len(SP) > 2 Then
        iKey = SP & NL
        If .exists(iKey) = False Then
          .Item(SP) = .Item(SP) & "|" & NL
          .Item(iKey) = aDinhMuc(i, 3)
        End If
      End If
    Next i
    sCol = sCol + 2
    ReDim Res(fDate To eDate, 1 To sCol)
    ReDim Res(1 To eDate - fDate + 1, 1 To sCol)
    sRow = UBound(aNhap)
    For i = 1 To sRow
      ik = aNhap(i, 1)
      jk = .Item(aNhap(i, 2))
      Res(ik, jk) = Res(ik, jk) + aNhap(i, 3)
    Next i
    sRow = UBound(aXuat)
    For i = 1 To sRow
      ik = aXuat(i, 2)
      SP = "#" & aXuat(i, 1) & "#"
      S = .Item(SP)
      If InStr(1, S, "|") Then
        SoLuong = aXuat(i, 3)
        S = Split(S, "|")
        n = UBound(S)
        For j = 1 To n
          NL = S(j)
          jk = .Item(NL) + 1 'Thu tu cot NL, cot xuat
          iKey = SP & NL
          Res(ik, jk) = Res(ik, jk) + .Item(SP & NL) * SoLuong
          a = .Item(SP & NL)
        Next j
      End If
    Next i
  End With

  For i = fDate To eDate
    Res(i, 1) = CDate(i)
    For j = 2 To sCol Step 3
      Res(i, j + 2) = Res(i, j + 2) + Res(i, j) - Res(i, j + 1)
      If i > fDate Then Res(i, j + 2) = Res(i, j + 2) + Res(i - 1, j + 2)
    Next j
  Next i
  For i = fDate To eDate
    For j = 2 To sCol Step 3
      If Res(i, j) = Empty And Res(i, j + 1) = Empty Then Res(i, j + 2) = Empty
    Next j
  Next i
  Application.ScreenUpdating = False
  With Sheets("NXT_NL")
    eRow = .Range("C" & Rows.Count).End(xlUp).Row
    If eRow > 3 Then .Range("C4:AAA" & eRow).Clear
    eCol = .Range("XCC2").End(xlToLeft).Column + 2
    If eCol > 6 Then .Range("G2", Cells(3, eCol)).Clear
    .Range("D2:F3").Copy
    .Range("G2").Resize(2, sCol - 4).Select
    .Paste
    Application.CutCopyMode = False
    .Range("D2").Resize(, sCol - 2) = TieuDe
    sRow = eDate - fDate + 1
    .Range("C4").Resize(sRow, sCol) = Res
    .Range("C4").Resize(sRow, sCol).Borders.LineStyle = 1
    .Range("D4").Resize(sRow, sCol - 1).NumberFormat = "#,##0_);[Red](#,##0)"
  End With
  Application.ScreenUpdating = True
End Sub
Dùng VBA thử
Mã:
Sub NhapXuatTon()
  Dim aNhap(), aXuat(), aDinhMuc(), TieuDe(), Res(), S
  Dim SP$, NL$, iKey$, SoLuong As Double
  Dim eRow&, eCol&, sRow&, sCol&, i&, ik&, j&, jk&, n&
  Dim fDate&, eDate&, iDate&

  fDate = 100000: eDate = 0
  With Sheets("Nhap_NVL")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aNhap = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("A2:A" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("A2:A" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("Xuat_SP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aXuat = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("B2:B" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("B2:B" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("DinhMuc")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aDinhMuc = .Range("A2:C" & eRow).Value
  End With

  sCol = -1
  With CreateObject("scripting.dictionary")
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      NL = aDinhMuc(i, 2)
      If Len(NL) Then
        If .exists(NL) = False Then
          sCol = sCol + 3
          .Add NL, sCol
          ReDim Preserve TieuDe(1 To 1, 2 To sCol)
          TieuDe(1, sCol) = NL
        End If
      End If
      SP = "#" & aDinhMuc(i, 1) & "#"
      If Len(SP) > 2 Then
        iKey = SP & NL
        If .exists(iKey) = False Then
          .Item(SP) = .Item(SP) & "|" & NL
          .Item(iKey) = aDinhMuc(i, 3)
        End If
      End If
    Next i
    sCol = sCol + 2
    ReDim Res(fDate To eDate, 1 To sCol)
    ReDim Res(1 To eDate - fDate + 1, 1 To sCol)
    sRow = UBound(aNhap)
    For i = 1 To sRow
      ik = aNhap(i, 1)
      jk = .Item(aNhap(i, 2))
      Res(ik, jk) = Res(ik, jk) + aNhap(i, 3)
    Next i
    sRow = UBound(aXuat)
    For i = 1 To sRow
      ik = aXuat(i, 2)
      SP = "#" & aXuat(i, 1) & "#"
      S = .Item(SP)
      If InStr(1, S, "|") Then
        SoLuong = aXuat(i, 3)
        S = Split(S, "|")
        n = UBound(S)
        For j = 1 To n
          NL = S(j)
          jk = .Item(NL) + 1 'Thu tu cot NL, cot xuat
          iKey = SP & NL
          Res(ik, jk) = Res(ik, jk) + .Item(SP & NL) * SoLuong
          a = .Item(SP & NL)
        Next j
      End If
    Next i
  End With

  For i = fDate To eDate
    Res(i, 1) = CDate(i)
    For j = 2 To sCol Step 3
      Res(i, j + 2) = Res(i, j + 2) + Res(i, j) - Res(i, j + 1)
      If i > fDate Then Res(i, j + 2) = Res(i, j + 2) + Res(i - 1, j + 2)
    Next j
  Next i
  For i = fDate To eDate
    For j = 2 To sCol Step 3
      If Res(i, j) = Empty And Res(i, j + 1) = Empty Then Res(i, j + 2) = Empty
    Next j
  Next i
  Application.ScreenUpdating = False
  With Sheets("NXT_NL")
    eRow = .Range("C" & Rows.Count).End(xlUp).Row
    If eRow > 3 Then .Range("C4:AAA" & eRow).Clear
    eCol = .Range("XCC2").End(xlToLeft).Column + 2
    If eCol > 6 Then .Range("G2", Cells(3, eCol)).Clear
    .Range("D2:F3").Copy
    .Range("G2").Resize(2, sCol - 4).Select
    .Paste
    Application.CutCopyMode = False
    .Range("D2").Resize(, sCol - 2) = TieuDe
    sRow = eDate - fDate + 1
    .Range("C4").Resize(sRow, sCol) = Res
    .Range("C4").Resize(sRow, sCol).Borders.LineStyle = 1
    .Range("D4").Resize(sRow, sCol - 1).NumberFormat = "#,##0_);[Red](#,##0)"
  End With
  Application.ScreenUpdating = True
End Sub
Tiền bối ơi xin giúp em, khi em mở file và chay VBA thì báo lỗi như ở sheet lỗi ạ
 

File đính kèm

  • Thuy.xlsb
    159.6 KB · Đọc: 12
Lần chỉnh sửa cuối:
Cách dùng VBA nữa & đơn giản về học thuật để tham khảo:
B1: Đổi tên các trang tính tương ứng thành 'Nhap', 'Xuat', 'DMuc' & 'KQua'
B2: Đưa lên chổ trống của trang 'KQua' 1 biểu tượng vui nào đó (Shapes)
B3: & gắn vô biểu tượng 1 macro sau:
PHP:
Dim Arr0()
Sub ThongKeNXTTheoMatHang()
Dim Sh As Worksheet, Rng As Range, sRng As Range, WF As Object, Mang As Variant
Dim J As Long, Col As Integer, W As Integer, Dg As Long

1 Set WF = Application.WorksheetFunction:                Sheets("KQUa").Select
Set Rng = Range([A8], [A65500].End(xlUp))
3 With Sheets("Nhap")                'Nhâp   '
    For J = 2 To .[A2].End(xlDown).Row
5        Set sRng = Rng.Find(.Cells(J, "A").Value, , xlValues, xlWhole)  'Tìm Ngày       '
        If Not sRng Is Nothing Then
7            Col = WF.VLookup(.Cells(J, "B").Value, Sheets("DMuc").Range("NVL"), 2, False)
            Set sRng = Rng.Find(.Cells(J, "A").Value, , xlValues, xlWhole)
9            If Not sRng Is Nothing Then
                Cells(sRng.Row, Col).Value = .Cells(J, "C").Value
11            End If
        End If
13    Next J
End With
15 With Sheets("Xuat")                                        'Xuât       '
    For J = 2 To .[A2].End(xlDown).Row
17        .[r2].Value = .Cells(J, "A").Value:                 .[s2].Value = .Cells(J, "B").Value
        .[T2].Value = .Cells(J, "C").Value
19
    Next J
End With
End Sub
Mã:
Function Xuat(MaHg As String, Ngay As Date, SoLg As Double, DMuc As Range)
  Dim Arr(), dArr()
  Dim J As Long, W As Integer
'Tao Ra Bang Du Liêu Nhu Tai Trang "Nhap"  '
  With Sheets("DMuc")
      Arr() = DMuc.Value
        ReDim dArr(1 To UBound(Arr()), 1 To 5)
        For J = 1 To UBound(Arr())
            If Arr(J, 1) = MaHg Then
                W = W + 1:                                                 dArr(W, 1) = Format(Ngay, "MM/DD/yyyy")
                dArr(W, 2) = Arr(J, 2)                                  'Mã NVL '
                dArr(W, 4) = Arr(J, 3)                                   'Dinh Múc   '
                dArr(W, 5) = SoLg:                                      dArr(W, 3) = SoLg * Arr(J, 3)
            End If
        Next J
  End With
  Xuat = dArr()
End Function

Xin nói trước:
Macro này mới xong phần chuyển dữ liệu từ trang 'Nhap' sang trang kết quả. Điều này là nhờ các câu lệnh từ đầu macro cho đến dòng số 13
Sau đó là các dòng lệnh để biến dữ liệu từ 2 trang 'Xuat' & trang 'DMuc' thành 1 bảng (Tạm gọi là BX) giống như dữ liệu tại trang 'Nhap'
Việc còn lại chưa làm là chuyển dữ liệu từ BX này (có cấu trúc như trang 'Nhap') sang trang 'KQua'

Thêm nữa, câu lện mang số 7 là dùng để tra tìm ra cột cần nhập dữ liệu theo từng mặt hàng; Dữ liệu cột được tra từ bảng có trong trang 'DMuc' & nó đước gán tên là 'NVL' & có nội dung sau:

Cột
VC012
CHI5
CUC8
KHOA11
DAY14
NHAN17
VC0320
THE23
VC0226
THUNG29
VC532
GAM35

Cách dùng VBA nữa & đơn giản về học thuật để tham khảo:
B1: Đổi tên các trang tính tương ứng thành 'Nhap', 'Xuat', 'DMuc' & 'KQua'
B2: Đưa lên chổ trống của trang 'KQua' 1 biểu tượng vui nào đó (Shapes)
B3: & gắn vô biểu tượng 1 macro sau:
PHP:
Dim Arr0()
Sub ThongKeNXTTheoMatHang()
Dim Sh As Worksheet, Rng As Range, sRng As Range, WF As Object, Mang As Variant
Dim J As Long, Col As Integer, W As Integer, Dg As Long

1 Set WF = Application.WorksheetFunction:                Sheets("KQUa").Select
Set Rng = Range([A8], [A65500].End(xlUp))
3 With Sheets("Nhap")                'Nhâp   '
    For J = 2 To .[A2].End(xlDown).Row
5        Set sRng = Rng.Find(.Cells(J, "A").Value, , xlValues, xlWhole)  'Tìm Ngày       '
        If Not sRng Is Nothing Then
7            Col = WF.VLookup(.Cells(J, "B").Value, Sheets("DMuc").Range("NVL"), 2, False)
            Set sRng = Rng.Find(.Cells(J, "A").Value, , xlValues, xlWhole)
9            If Not sRng Is Nothing Then
                Cells(sRng.Row, Col).Value = .Cells(J, "C").Value
11            End If
        End If
13    Next J
End With
15 With Sheets("Xuat")                                        'Xuât       '
    For J = 2 To .[A2].End(xlDown).Row
17        .[r2].Value = .Cells(J, "A").Value:                 .[s2].Value = .Cells(J, "B").Value
        .[T2].Value = .Cells(J, "C").Value
19
    Next J
End With
End Sub
Mã:
Function Xuat(MaHg As String, Ngay As Date, SoLg As Double, DMuc As Range)
  Dim Arr(), dArr()
  Dim J As Long, W As Integer
'Tao Ra Bang Du Liêu Nhu Tai Trang "Nhap"  '
  With Sheets("DMuc")
      Arr() = DMuc.Value
        ReDim dArr(1 To UBound(Arr()), 1 To 5)
        For J = 1 To UBound(Arr())
            If Arr(J, 1) = MaHg Then
                W = W + 1:                                                 dArr(W, 1) = Format(Ngay, "MM/DD/yyyy")
                dArr(W, 2) = Arr(J, 2)                                  'Mã NVL '
                dArr(W, 4) = Arr(J, 3)                                   'Dinh Múc   '
                dArr(W, 5) = SoLg:                                      dArr(W, 3) = SoLg * Arr(J, 3)
            End If
        Next J
  End With
  Xuat = dArr()
End Function

Xin nói trước:
Macro này mới xong phần chuyển dữ liệu từ trang 'Nhap' sang trang kết quả. Điều này là nhờ các câu lệnh từ đầu macro cho đến dòng số 13
Sau đó là các dòng lệnh để biến dữ liệu từ 2 trang 'Xuat' & trang 'DMuc' thành 1 bảng (Tạm gọi là BX) giống như dữ liệu tại trang 'Nhap'
Việc còn lại chưa làm là chuyển dữ liệu từ BX này (có cấu trúc như trang 'Nhap') sang trang 'KQua'

Thêm nữa, câu lện mang số 7 là dùng để tra tìm ra cột cần nhập dữ liệu theo từng mặt hàng; Dữ liệu cột được tra từ bảng có trong trang 'DMuc' & nó đước gán tên là 'NVL' & có nội dung sau:

Cột
VC012
CHI5
CUC8
KHOA11
DAY14
NHAN17
VC0320
THE23
VC0226
THUNG29
VC532
GAM35

Tiền bối có thể cho em xin file mẫu đầy đủ để em có thể copy-paste để chạy kết quả ko ạ. vì file của em rất nhiều dữ liệu, em đã chạy thử nhưng file đã báo lỗi và em không biết xử lí ạ. em cảm ơn.
 
Dạ em xin chân thành cảm ơn ạ. em đang thử file excel mà nó đơ quá luôn ạ
Bài đã được tự động gộp:



Tiền bối ơi xin giúp em, khi em mở file và chay VBA thì báo lỗi như ở sheet lỗi ạ
Bỏ 1 dòng lệnh quên xóa:confused:
Mã:
Sub NhapXuatTon()
  Dim aNhap(), aXuat(), aDinhMuc(), TieuDe(), Res(), S
  Dim SP$, NL$, iKey$, SoLuong As Double
  Dim eRow&, eCol&, sRow&, sCol&, i&, ik&, j&, jk&, n&
  Dim fDate&, eDate&, iDate&
 
  fDate = 100000: eDate = 0
  With Sheets("Nhap_NVL")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aNhap = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("A2:A" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("A2:A" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("Xuat_SP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aXuat = .Range("A2:C" & eRow).Value
    iDate = Application.Min(.Range("B2:B" & eRow))
    If fDate > iDate Then fDate = iDate
    iDate = Application.Max(.Range("B2:B" & eRow))
    If eDate < iDate Then eDate = iDate
  End With
  With Sheets("DinhMuc")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 2 Then eRow = 2
    aDinhMuc = .Range("A2:C" & eRow).Value
  End With

  sCol = -1
  With CreateObject("scripting.dictionary")
    sRow = UBound(aDinhMuc)
    For i = 1 To sRow
      NL = aDinhMuc(i, 2)
      If Len(NL) Then
        If .exists(NL) = False Then
          sCol = sCol + 3
          .Add NL, sCol
          ReDim Preserve TieuDe(1 To 1, 2 To sCol)
          TieuDe(1, sCol) = NL
        End If
      End If
      SP = "#" & aDinhMuc(i, 1) & "#"
      If Len(SP) > 2 Then
        iKey = SP & NL
        If .exists(iKey) = False Then
          .Item(SP) = .Item(SP) & "|" & NL
          .Item(iKey) = aDinhMuc(i, 3)
        End If
      End If
    Next i
    sCol = sCol + 2
    ReDim Res(fDate To eDate, 1 To sCol)
    'ReDim Res(1 To eDate - fDate + 1, 1 To sCol)
    sRow = UBound(aNhap)
    For i = 1 To sRow
      ik = aNhap(i, 1)
      jk = .Item(aNhap(i, 2))
      Res(ik, jk) = Res(ik, jk) + aNhap(i, 3)
    Next i
    sRow = UBound(aXuat)
    For i = 1 To sRow
      ik = aXuat(i, 2)
      SP = "#" & aXuat(i, 1) & "#"
      S = .Item(SP)
      If InStr(1, S, "|") Then
        SoLuong = aXuat(i, 3)
        S = Split(S, "|")
        n = UBound(S)
        For j = 1 To n
          NL = S(j)
          jk = .Item(NL) + 1 'Thu tu cot NL, cot xuat
          iKey = SP & NL
          Res(ik, jk) = Res(ik, jk) + .Item(SP & NL) * SoLuong
          a = .Item(SP & NL)
        Next j
      End If
    Next i
  End With

  For i = fDate To eDate
    Res(i, 1) = CDate(i)
    For j = 2 To sCol Step 3
      Res(i, j + 2) = Res(i, j + 2) + Res(i, j) - Res(i, j + 1)
      If i > fDate Then Res(i, j + 2) = Res(i, j + 2) + Res(i - 1, j + 2)
    Next j
  Next i
  For i = fDate To eDate
    For j = 2 To sCol Step 3
      If Res(i, j) = Empty And Res(i, j + 1) = Empty Then Res(i, j + 2) = Empty
    Next j
  Next i
  Application.ScreenUpdating = False
  With Sheets("NXT_NL")
    eRow = .Range("C" & Rows.Count).End(xlUp).Row
    If eRow > 3 Then .Range("C4:AAA" & eRow).Clear
    eCol = .Range("XCC2").End(xlToLeft).Column + 2
    If eCol > 6 Then .Range("G2", Cells(3, eCol)).Clear
    .Range("D2:F3").Copy
    .Range("G2").Resize(2, sCol - 4).Select
    .Paste
    Application.CutCopyMode = False
    .Range("D2").Resize(, sCol - 2) = TieuDe
    sRow = eDate - fDate + 1
    .Range("C4").Resize(sRow, sCol) = Res
    .Range("C4").Resize(sRow, sCol).Borders.LineStyle = 1
    .Range("D4").Resize(sRow, sCol - 1).NumberFormat = "#,##0_);[Red](#,##0)"
  End With
  Application.ScreenUpdating = True
End Sub
 
Web KT
Back
Top Bottom