Cần trợ giúp về công thức max có điều kiện

Liên hệ QC

tranvananh

Thành viên mới
Tham gia
11/4/08
Bài viết
16
Được thích
2
Em có 1 bảng kê chi tiết nhập xuất tồn theo ngày, dữ liệu cũ đang bị sai, em muốn tạo cột phụ, kết quả đúng là ngày nhập phải trước ngày xuất theo cùng 1 mã, sau đó sẽ sắp xếp theo ngày , để tồn cuối phải dương chứ không để tình trạng xuất âm. nhưng em không biết làm hàm công thức như thế nào để có thể chuyển ngày nhập hàng sai về nhập hàng trước ngày xuất được ạ,
mọi người giúp em với
 

File đính kèm

Em có 1 bảng kê chi tiết nhập xuất tồn theo ngày, dữ liệu cũ đang bị sai, em muốn tạo cột phụ, kết quả đúng là ngày nhập phải trước ngày xuất theo cùng 1 mã, sau đó sẽ sắp xếp theo ngày , để tồn cuối phải dương chứ không để tình trạng xuất âm. nhưng em không biết làm hàm công thức như thế nào để có thể chuyển ngày nhập hàng sai về nhập hàng trước ngày xuất được ạ,
mọi người giúp em với
Bài nầy phải dùng code VBA
Chỉnh ngày tháng có thể mâu thuẫn với các chứng từ liên quan và người kiểm tra dể phát hiện số ma, ví dụ ngày nhập với ngày hóa đơn mua vào, ngày xuất với hóa đơn bán ra. Dữ liệu gốc của bạn đã vướng sai sót không đáng có nầy
 
Bài nầy phải dùng code VBA
Chỉnh ngày tháng có thể mâu thuẫn với các chứng từ liên quan và người kiểm tra dể phát hiện số ma, ví dụ ngày nhập với ngày hóa đơn mua vào, ngày xuất với hóa đơn bán ra. Dữ liệu gốc của bạn đã vướng sai sót không đáng có nầy
Dạ e cảm ơn anh đã tư vấn.
dữ liệu gốc các bạn ấy kiểu lấy hóa đơn về sau, nhưng cứ thế nhập số lương theo ngày hóa đơn, lẽ ra sô lương ngày nhập phải nhập về kho trước khi xuất để đảm bảo hàng trong kho lúc nào cũng tồn dướng.
Bọn e chuẩn bị quyết toán thuế, e muốn dùng hàm công thức để chuyển những hóa đơn nhập sau ngày xuất bị có thể đẩy lên 1,2 ngày trước ngày xuất lượng nào đấy.
em không có học VBA. File này em cần xử lý gửi cơ quan thuế a à. Hiện tại e đang dùng mắt, thủ công.
Các anh chị nào giỏi về hàm hỗ trợ em, chứ 8600 hàng dữ liệu (row) e phải dò từng cái oải quá.
 
Chưa chắc là sai đâu, bạn cần kiểm tra kỹ lại chứ không khéo coi chừng sửa từ đúng thành sai đấy.

1637027878092.png
 
Bài nầy phải dùng code VBA
Chỉnh ngày tháng có thể mâu thuẫn với các chứng từ liên quan và người kiểm tra dể phát hiện số ma, ví dụ ngày nhập với ngày hóa đơn mua vào, ngày xuất với hóa đơn bán ra. Dữ liệu gốc của bạn đã vướng sai sót không đáng có nầy
Hôm qua băng thông kém quá, download cái file nửa tiêng không xong cho nên tôi bỏ qua. Khong rõ dữ kiệu thật trên file như thế nào.

Nhưng chung quy thì lpoại sửa đổi này hải có quy trình và văn bản rõ rệt chứ khơi khơi như thớt diễn là là loại báo cáo ma.
Dẫu có chỉnh sửa bằng VBA thì code phải đổi tên sheet ban đầu thành *_BD". Copy qua một sheet mới và chỉnh sửa trên sheet đó. Những chỗ chỉnh sửa thì phải ghi lại trên một sheet "*_LOG" cho biết lý do. Sheet "*_LOG" này mở đầu bằng 1 câu "chỉnh sửa ngày <ngày giờ>". Sau khi làm xong thì ẩn hai sheet "*_BD" và "*_LOG" đi.
Lưu ý làm làm việc xong thì đừng có chơi dại tải đâu cái macro "xoá sheets" về. Bể hết ráng chịu.

Chưa chắc là sai đâu, bạn cần kiểm tra kỹ lại chứ không khéo coi chừng sửa từ đúng thành sai đấy.
...
Nếu có nhiều Xuất Nhập thì khả năng chữa lợn lành thành què khá cao.
 
Dạ e cảm ơn anh đã tư vấn.
dữ liệu gốc các bạn ấy kiểu lấy hóa đơn về sau, nhưng cứ thế nhập số lương theo ngày hóa đơn, lẽ ra sô lương ngày nhập phải nhập về kho trước khi xuất để đảm bảo hàng trong kho lúc nào cũng tồn dướng.
Bọn e chuẩn bị quyết toán thuế, e muốn dùng hàm công thức để chuyển những hóa đơn nhập sau ngày xuất bị có thể đẩy lên 1,2 ngày trước ngày xuất lượng nào đấy.
em không có học VBA. File này em cần xử lý gửi cơ quan thuế a à. Hiện tại e đang dùng mắt, thủ công.
Các anh chị nào giỏi về hàm hỗ trợ em, chứ 8600 hàng dữ liệu (row) e phải dò từng cái oải quá.
Dữ liệu tồn âm khá nhiều
Chạy code sort theo ngày và điều chỉnh ngày tồn âm, gán kết quả 4 cột "M:P" là ngày, nhập, xuất, tồn
Chỉ cần copy cột "M" (ngày) dán thủ công vào cột C
Mã:
Sub NgayNhapKho()
  Dim sArr(), res(), dic As Object, maVT$
  Dim sRow&, i&, r&, tmp#
 
  Set dic = CreateObject("scripting.dictionary")
  With Sheets("tong hop nxt 18")
    sArr = .Range("B13:E" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty And sArr(i, 4) <> Empty Then dic.Add sArr(i, 1), sArr(i, 4)
  Next i
  With Sheets("bang ke nxt 18")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    .Range("C13:L" & i).Sort .[C13], 1, .[D13], , 1, .[E13], 1, xlNo
    sArr = .Range("C13:J" & i).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    If res(i, 1) = Empty Then
      res(i, 1) = sArr(i, 1)        'Ngay
      If sArr(i, 8) <> Empty Then
        maVT = sArr(i, 7)
        If sArr(i, 2) <> Empty Then
          res(i, 2) = sArr(i, 8)      'Nhap
        Else
          res(i, 3) = sArr(i, 8)      'Xuat
        End If
        tmp = dic.Item(maVT) + res(i, 2) - res(i, 3)
        If tmp >= 0 Then 'Ton duong
          dic.Item(maVT) = tmp
        Else 'Ton am
          For r = i + 1 To sRow
            If maVT = sArr(r, 7) And sArr(r, 2) <> Empty And sArr(r, 8) <> Empty Then
              res(r, 1) = sArr(i, 1) - 1              'Truoc 1 Ngay
              res(r, 2) = sArr(r, 8)                  'Nhap
              dic.Item(maVT) = dic.Item(maVT) + res(r, 2)
              tmp = tmp + sArr(r, 8)
              If tmp >= 0 Then
                dic.Item(maVT) = tmp
                Exit For
              End If
            End If
          Next r
        End If
      End If
    End If
  Next i
  With Sheets("bang ke nxt 18")
    .Range("M13").Resize(sRow, 3) = res
    .Range("C13").Resize(sRow, 13).Sort .[M13], 1, .[D13], , 1, .[E13], 1, xlNo
  End With
  Call TonCuoi
End Sub

Private Sub TonCuoi()
  Dim sArr(), res(), dic As Object, maVT$
  Dim sRow&, i&, tmp#
 
  Set dic = CreateObject("scripting.dictionary")
  With Sheets("tong hop nxt 18")
    sArr = .Range("B13:E" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty And sArr(i, 4) <> Empty Then dic.Add sArr(i, 1), sArr(i, 4)
  Next i
  With Sheets("bang ke nxt 18")
    sArr = .Range("I13:P" & .Range("I" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If sArr(i, 2) <> Empty Then
      maVT = sArr(i, 1)
      tmp = dic.Item(maVT) + sArr(i, 6) - sArr(i, 7)
      dic.Item(maVT) = tmp
      res(i, 1) = Round(tmp, 8)
    End If
  Next i
  Sheets("bang ke nxt 18").Range("P13").Resize(sRow) = res
End Sub
 
Dữ liệu tồn âm khá nhiều
Chạy code sort theo ngày và điều chỉnh ngày tồn âm, gán kết quả 4 cột "M:p" là ngày, nhập, xuất, tồn
Chỉ cần copy cột "M" (ngày) dán thủ công vào cột C
Mã:
Sub NgayNhapKho()
  Dim sArr(), res(), dic As Object, maVT$
  Dim sRow&, i&, r&, tmp#
 
  Set dic = CreateObject("scripting.dictionary")
  With Sheets("tong hop nxt 18")
    sArr = .Range("B13:E" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty And sArr(i, 4) <> Empty Then dic.Add sArr(i, 1), sArr(i, 4)
  Next i
  With Sheets("bang ke nxt 18")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    .Range("C13:L" & i).Sort .[C13], 1, .[D13], , 1, .[E13], 1, xlNo
    sArr = .Range("C13:J" & i).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    If res(i, 1) = Empty Then
      res(i, 1) = sArr(i, 1)        'Ngay
      If sArr(i, 8) <> Empty Then
        maVT = sArr(i, 7)
        If sArr(i, 2) <> Empty Then
          res(i, 2) = sArr(i, 8)      'Nhap
        Else
          res(i, 3) = sArr(i, 8)      'Xuat
        End If
        tmp = dic.Item(maVT) + res(i, 2) - res(i, 3)
        If tmp >= 0 Then 'Ton duong
          dic.Item(maVT) = tmp
        Else 'Ton am
          For r = i + 1 To sRow
            If maVT = sArr(r, 7) And sArr(r, 2) <> Empty And sArr(r, 8) <> Empty Then
              res(r, 1) = sArr(i, 1) - 1              'Truoc 1 Ngay
              res(r, 2) = sArr(r, 8)                  'Nhap
              dic.Item(maVT) = dic.Item(maVT) + res(r, 2)
              tmp = tmp + sArr(r, 8)
              If tmp >= 0 Then
                dic.Item(maVT) = tmp
                Exit For
              End If
            End If
          Next r
        End If
      End If
    End If
  Next i
  With Sheets("bang ke nxt 18")
    .Range("M13").Resize(sRow, 3) = res
    .Range("C13").Resize(sRow, 13).Sort .[M13], 1, .[D13], , 1, .[E13], 1, xlNo
  End With
  Call TonCuoi
End Sub

Private Sub TonCuoi()
  Dim sArr(), res(), dic As Object, maVT$
  Dim sRow&, i&, tmp#
 
  Set dic = CreateObject("scripting.dictionary")
  With Sheets("tong hop nxt 18")
    sArr = .Range("B13:E" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  For i = 1 To sRow
    If sArr(i, 1) <> Empty And sArr(i, 4) <> Empty Then dic.Add sArr(i, 1), sArr(i, 4)
  Next i
  With Sheets("bang ke nxt 18")
    sArr = .Range("I13:P" & .Range("I" & Rows.Count).End(xlUp).Row).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If sArr(i, 2) <> Empty Then
      maVT = sArr(i, 1)
      tmp = dic.Item(maVT) + sArr(i, 6) - sArr(i, 7)
      dic.Item(maVT) = tmp
      res(i, 1) = Round(tmp, 8)
    End If
  Next i
  Sheets("bang ke nxt 18").Range("P13").Resize(sRow) = res
End Sub
Em cảm ơn anh, cảm ơn nhiều lắm, e, rất rất cảm ơn anh.
Học VBA khó không hả anh? em nhìn code của anh, thật ngưỡng mộ.
Em cảm ơn rất nhiều ạ.
 
Em cảm ơn anh, cảm ơn nhiều lắm, e, rất rất cảm ơn anh.
Học VBA khó không hả anh? em nhìn code của anh, thật ngưỡng mộ.
Em cảm ơn rất nhiều ạ.
Có người nói khó cũng có nhiều người nói dể, nếu đam mê bỏ ăn bỏ ngủ học VBA sẽ nhanh
 
Có người nói khó cũng có nhiều người nói dể, nếu đam mê bỏ ăn bỏ ngủ học VBA sẽ nhanh
Không cần phải bỏ ăn bỏ ngủ.
VBA vốn từ BASIC. Hai ký tự đầu muốn nói Beginner's (người bắt đầu) và All-purpose (ứng dụng đại trà) (*1)
Vì vậy, bản chất ngữ pháp VBA tương đối khá dễ so với các ngôn ngữ khác.

Ở tuổi có kinh nghiệm đi làm rồi thì học cũng như một công việc. Nếu muốn thành công thì phải coi nó như một đồ án, có lập kế hoạch thực hiện, lập chỉ tiêu thời gian (timelines) và mức độ đạt (benchmarrks) để kiểm soát tiến dộ.

(*1) sỡ dĩ tôi nhắc đến "ứng dụng đại trà" là vì thời xưa, các ngôn ngữ thường được ra với mục đich riêng. Điển hình:
FORTRAN = Forlumla Translation -> chyên dùng để làm toán
COBOL = Common Business-Oriented Language -> chuyên dùng trong thương mại
APL = chuyên dùng để tính mảng. Vì tính cách mảng mà nó đợc dùng trong toán xác suất thống kê.
 
Web KT

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

Back
Top Bottom