Lấy đơn giá cuối cùng trong Data (1 người xem)

Liên hệ QC

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

phung_biasg

Thành viên mới
Tham gia
17/4/07
Bài viết
25
Được thích
81
- Tôi theo dõi hàng tồn kho trong 1 nhà hàng, cuối tháng tôi phải tổng hợp giá trị hàng tồn kho. Lâu nay tôi lấy tổng thành tiền chia cho tổng số lượng nhập để ra đơn giá bình quân của từng món hàng. Nhưng bây giờ tôi thấy cách đó không chính xác do đơn giá thay đổi theo thời gian, ta phải lấy đơn giá có thời gian sau hết thì giá trị tồn mới chính xác.
- Tôi gởi kèm file, trong đó có sheet mua chứa các hàng hoá đã mua và sheet danh mục hàng hoá.
- Nhờ các bạn giúp tôi lập công thức trong cột đơn giá để mỗi hàng hoá bên sheet danh muc sẽ có đơn giá của thời gian mua cuối cùng.
ví dụ : món hàng vận chuyển bia sẽ có đơn giá của ngày cuối cùng 31/10/2010 là 2.000 đồng, hoặc là ớt xiêm sẽ có đơn giá ngày mua cuối cùng là ngày 31/10/2010 là 30.000 đồng.
- Nhờ mọi người giúp đỡ và xin cám ơn !
 

File đính kèm

- Tôi theo dõi hàng tồn kho trong 1 nhà hàng, cuối tháng tôi phải tổng hợp giá trị hàng tồn kho. Lâu nay tôi lấy tổng thành tiền chia cho tổng số lượng nhập để ra đơn giá bình quân của từng món hàng. Nhưng bây giờ tôi thấy cách đó không chính xác do đơn giá thay đổi theo thời gian, ta phải lấy đơn giá có thời gian sau hết thì giá trị tồn mới chính xác.
- Tôi gởi kèm file, trong đó có sheet mua chứa các hàng hoá đã mua và sheet danh mục hàng hoá.
- Nhờ các bạn giúp tôi lập công thức trong cột đơn giá để mỗi hàng hoá bên sheet danh muc sẽ có đơn giá của thời gian mua cuối cùng.
ví dụ : món hàng vận chuyển bia sẽ có đơn giá của ngày cuối cùng 31/10/2010 là 2.000 đồng, hoặc là ớt xiêm sẽ có đơn giá ngày mua cuối cùng là ngày 31/10/2010 là 30.000 đồng.
- Nhờ mọi người giúp đỡ và xin cám ơn !
DÙNG CT SAU
sheet " DMMH"
PHP:
L4=VLOOKUP(F4,mua!L:M,2,0)
sheet mua
PHP:
L6=IF(COUNTIF(E6:$E$64283,E6)<>1,"",E6)
 
M6=IF(COUNTIF(E6:$E$64283,E6)<>1,"",H6)
SẼ CHO KQ NHƯ Ý
 
- Tôi theo dõi hàng tồn kho trong 1 nhà hàng, cuối tháng tôi phải tổng hợp giá trị hàng tồn kho. Lâu nay tôi lấy tổng thành tiền chia cho tổng số lượng nhập để ra đơn giá bình quân của từng món hàng. Nhưng bây giờ tôi thấy cách đó không chính xác do đơn giá thay đổi theo thời gian, ta phải lấy đơn giá có thời gian sau hết thì giá trị tồn mới chính xác.
- Tôi gởi kèm file, trong đó có sheet mua chứa các hàng hoá đã mua và sheet danh mục hàng hoá.
- Nhờ các bạn giúp tôi lập công thức trong cột đơn giá để mỗi hàng hoá bên sheet danh muc sẽ có đơn giá của thời gian mua cuối cùng.
ví dụ : món hàng vận chuyển bia sẽ có đơn giá của ngày cuối cùng 31/10/2010 là 2.000 đồng, hoặc là ớt xiêm sẽ có đơn giá ngày mua cuối cùng là ngày 31/10/2010 là 30.000 đồng.
- Nhờ mọi người giúp đỡ và xin cám ơn !
Yêu cầu này thì nên dùng VBA tạo 1 sub update dongia hay UDF chớ dùng ct thì sợ chạy không nổi.
Chép code sau vào chạy thử, tôi có lấy thêm cột ngày lấy giá.
PHP:
Dim Dic As Object, sTmp As String
Dim endR As Long, i As Long, k As Long
Dim ArrTen, ArrDG, ArrNgay, ArrKQ, Arr
Sub TaoBaoCao()
Set Dic = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
With Sheets("DMHH")
  endR = .Cells(65000, 6).End(xlUp).Row 'Cot Ten NL
  Arr = .Range("F5:F" & endR) 'Ten NL
End With
For i = 1 To UBound(Arr)
  If Arr(i, 1) = "" Then Arr(i, 1) = i
  If Not Dic.Exists(Arr(i, 1)) Then
    Dic.Add Arr(i, 1), i
  End If
Next i
With Sheets("Mua")
  endR = .Cells(65000, 5).End(xlUp).Row 'Cot Ten NL
  ArrTen = .Range("E6:E" & endR) 'Ten NL
  ArrDG = .Range("H6:H" & endR) 'Don gia
  ArrNgay = .Range("B6:B" & endR) 'Ngay
End With
ReDim ArrKQ(1 To UBound(Arr), 1 To 2)
For i = UBound(ArrTen) To 1 Step -1
  sTmp = ArrTen(i, 1)
  If Dic.Exists(sTmp) Then
    k = Dic.Item(sTmp)
    If Len(ArrKQ(k, 1)) = 0 Then
      ArrKQ(k, 1) = ArrDG(i, 1)
      ArrKQ(k, 2) = ArrNgay(i, 1)
    End If
  End If
Next i
With Sheets("DMHH")
  .Range("L5").Resize(UBound(Arr), 2) = ArrKQ
End With
Erase ArrTen, ArrDG, ArrNgay, ArrKQ, Arr
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
- Tôi theo dõi hàng tồn kho trong 1 nhà hàng, cuối tháng tôi phải tổng hợp giá trị hàng tồn kho. Lâu nay tôi lấy tổng thành tiền chia cho tổng số lượng nhập để ra đơn giá bình quân của từng món hàng. Nhưng bây giờ tôi thấy cách đó không chính xác do đơn giá thay đổi theo thời gian, ta phải lấy đơn giá có thời gian sau hết thì giá trị tồn mới chính xác.
- Tôi gởi kèm file, trong đó có sheet mua chứa các hàng hoá đã mua và sheet danh mục hàng hoá.
- Nhờ các bạn giúp tôi lập công thức trong cột đơn giá để mỗi hàng hoá bên sheet danh muc sẽ có đơn giá của thời gian mua cuối cùng.
ví dụ : món hàng vận chuyển bia sẽ có đơn giá của ngày cuối cùng 31/10/2010 là 2.000 đồng, hoặc là ớt xiêm sẽ có đơn giá ngày mua cuối cùng là ngày 31/10/2010 là 30.000 đồng.
- Nhờ mọi người giúp đỡ và xin cám ơn !

Bài này dùng Pivot cũng tổng hợp được theo yêu cầu của bạn,
Nếu dùng công thức thì dùng tạm cái này (bắt đầu từ ô L5):
PHP:
=IF(COUNTIF(mua!$E$6:$E$2500,F5)<1,0,OFFSET(mua!$H$5,MATCH(MAX(IF(mua!$E$6:$E$2500=DMHH!F5,mua!$B$6:$B$2500))&DMHH!F5,mua!$B$6:$B$2500&mua!$E$6:$E$2500,0),))
Nhớ kết thúc công thức với Ctrl+Shift+Enter
 
Xin cám ơn các bạn

Tôi đã dùng cả 3 cách của các bạn hướng dẫn, nhưng nhận thấy cách của bạn ThuNghi chạy nhanh nhất. Xin cám ơn các bạn.
Riêng bạn Thu Nghi có thể giúp tôi thêm 1 chút xíu nữa nhé. Đó là giả sử sheet DMHH nằm trong file Book1.xls và sheet Mua nằm trong file LayGiaTriCuoi.xls , cả 2 file này nằm chung 1 thư mục và đều được mở ra, bạn có thể chỉnh lại VBA để chạy được không?
Tôi không thể gởi file lên vì bị giới hạn 1MB mà tôi đã gởi 910KB rồi nên không thể gởi file lên thêm.
Xin bạn cho biết PHP Code, tôi sẽ copy về sửa lại.
Rất cám ơn !
 
Tôi đã dùng cả 3 cách của các bạn hướng dẫn, nhưng nhận thấy cách của bạn ThuNghi chạy nhanh nhất. Xin cám ơn các bạn.
Riêng bạn Thu Nghi có thể giúp tôi thêm 1 chút xíu nữa nhé. Đó là giả sử sheet DMHH nằm trong file Book1.xls và sheet Mua nằm trong file LayGiaTriCuoi.xls , cả 2 file này nằm chung 1 thư mục và đều được mở ra, bạn có thể chỉnh lại VBA để chạy được không?
Tôi không thể gởi file lên vì bị giới hạn 1MB mà tôi đã gởi 910KB rồi nên không thể gởi file lên thêm.
Xin bạn cho biết PHP Code, tôi sẽ copy về sửa lại.
Rất cám ơn !
Chép code sau vào File DMHH, nó sẽ lấy đơn giá cuối từ file Data, sh Mua. Không cần thiết phải mở file Data. Code sẽ tự mở lấy data và đóng lại.
PHP:
Option Explicit
Dim wbName As String, shName As String, myPath As String, TgtWb As Workbook
Dim Dic As Object, sTmp As String
Dim endR As Long, i As Long, k As Long
Dim ArrTen, ArrDG, ArrNgay, ArrKQ, Arr
Sub TaoBaoCao()
With Application
  .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
Set Dic = CreateObject("Scripting.Dictionary")
LayData
With Sheets("DMHH")
  endR = .Cells(65000, 6).End(xlUp).Row 'Cot Ten NL
  Arr = .Range("F5:F" & endR) 'Ten NL
End With
For i = 1 To UBound(Arr)
  If Arr(i, 1) = "" Then Arr(i, 1) = i
  If Not Dic.Exists(Arr(i, 1)) Then
    Dic.Add Arr(i, 1), i
  End If
Next i
ReDim ArrKQ(1 To UBound(Arr), 1 To 2)
For i = UBound(ArrTen) To 1 Step -1
  sTmp = ArrTen(i, 1)
  If Dic.Exists(sTmp) Then
    k = Dic.Item(sTmp)
    If Len(ArrKQ(k, 1)) = 0 Then
      ArrKQ(k, 1) = ArrDG(i, 1)
      ArrKQ(k, 2) = ArrNgay(i, 1)
    End If
  End If
Next i
With Sheets("DMHH")
  .Range("L5").Resize(UBound(Arr), 2) = ArrKQ
End With
Erase ArrTen, ArrDG, ArrNgay, ArrKQ, Arr
Set Dic = Nothing
With Application
  .ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End Sub
Private Function SheetExists(shName) As Boolean
    Dim x As Object
    On Error Resume Next
    Set x = ActiveWorkbook.Sheets(shName)
    If Err = 0 Then SheetExists = True _
        Else SheetExists = False
End Function
Sub LayData()
myPath = ThisWorkbook.Path
wbName = "Data"
wbName = myPath & "\" & wbName & ".xls"
Workbooks.Open (wbName)
Set TgtWb = Workbooks.Open(wbName)
TgtWb.Activate
shName = "Mua"
If SheetExists(shName) = True Then
  With Sheets(shName)
    endR = .Cells(65000, 5).End(xlUp).Row 'Cot Ten NL
    ArrTen = .Range("E6:E" & endR) 'Ten NL
    ArrDG = .Range("H6:H" & endR) 'Don gia
    ArrNgay = .Range("B6:B" & endR) 'Ngay
  End With
End If
ActiveWindow.Close
End Sub
 

File đính kèm

Tôi đã làm được. Tuyệt vời . Xin cám ơn bạn rất nhiều !
 
Web KT

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

Back
Top Bottom