Giúp sửa công thức tính đơn giá của từng thời điểm! (1 người xem)

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

hoanglocphat

Thành viên thường trực
Tham gia
27/1/13
Bài viết
266
Được thích
30
Nhờ các bạn giúp sửa giúp công thức đơn giá (Sheet Xuất)ở từng thời điểm như sau:
Tại sheet Xuất, mình muốn lấy đơn giá ở Sheet GiaBan
Giả sử mặt hàng xăng (mã A001):
Nếu xuất từ ngày 01/04/13 đến 09/04/13 thì giá là 1.000
Nếu xuất từ ngày 10/04/13 đến 19/04/13 thì giá là 1.200
Nếu xuất từ ngày 20/04/13 đến khi ngày nào có giá mới thì giá là 1.100
Vì xăng có thay đổi giá ở từng thời điểm nên công thức đúng

Dầu (mã A002), chỉ có thay đổi giá ở ngày 10/04, Nếu xuất từ ngày 20/04/13 trở đi thì nó cho kết quả là 0, mình muốn nó lấy đơn giá của ngày 10/04/2012 là 1.600

Nhớt(mã A003) Chỉ có 1 giá của ngày 01/04/2013, nếu xuất từ ngày 10/04/2013 trở đi thì nó cho kết quả là 0, mình muốn nó lấy đơn giá của ngày 01/04/2012 là 1.800

Nhờ các bạn sửa công thức, cảm ơn!
Nếu các bạn vừa giúp công thức vừa giúp VBA thì càng tốt
 

File đính kèm

Có công thức này, giải quyết được yêu cầu của bạn nhưng nó còn dài quá, bạn xài tạm nhé!
Mã:
=MAX(VLOOKUP(B2,GiaBan!$A$2:$F$4,MATCH(A2,GiaBan!$D$1:$F$1,1)+3,0),LOOKUP(9^99,OFFSET(GiaBan!$D$1:$F$1,MATCH(B2,GiaBan!$A$2:$A$4,0),0)))
 
hình như vậy mới đúng (từ cthức của anh nghĩaphuc)

=IF(VLOOKUP(B2,GiaBan!$A$2:$F$4,MATCH(Xuat!A2,GiaBan!$D$1:$F$1,1)+3,0)=0,LOOKUP(9^99,OFFSET(GiaBan!$D$1:$F$1,MATCH(B2,GiaBan!$A$2:$A$4,0),0)),VLOOKUP(B2,GiaBan!$A$2:$F$4,MATCH(Xuat!A2,GiaBan!$D$1:$F$1,1)+3,0))
 
hình như vậy mới đúng (từ cthức của anh nghĩaphuc)

=IF(VLOOKUP(B2,GiaBan!$A$2:$F$4,MATCH(Xuat!A2,GiaBan!$D$1:$F$1,1)+3,0)=0,LOOKUP(9^99,OFFSET(GiaBan!$D$1:$F$1,MATCH(B2,GiaBan!$A$2:$A$4,0),0)),VLOOKUP(B2,GiaBan!$A$2:$F$4,MATCH(Xuat!A2,GiaBan!$D$1:$F$1,1)+3,0))
Vậy thì tôi dùng hàm MAX là hợp lý rồi chứ gì nữa, chẳng lẽ người ta lại nhập giá âm vào sheet Gia ban?!
Về ý nghĩa thì công thức của bạn và của tôi giống nhau chứ có khác gì đâu? Công thức của tôi ngắn hơn được một đoạn!
 
Vậy thì tôi dùng hàm MAX là hợp lý rồi chứ gì nữa, chẳng lẽ người ta lại nhập giá âm vào sheet Gia ban?!
Về ý nghĩa thì công thức của bạn và của tôi giống nhau chứ có khác gì đâu? Công thức của tôi ngắn hơn được một đoạn!

kết quả ở F2 & F5 sai anh ạ, nếu làm vậy thì nó lấy giá cao nhất, và mất đi ý nghĩa tìm theo ngày.
ưu ti6n thứ nhất vẫn phải tìm theo ngày, nếu ngày đó ko có giá mới lấy ngày trước đó
tks anh
 
File của bạn đây (bằng công thức)
=INDEX(GiaBan!$D$2:$N$4;MATCH(B2;GiaBan!$A$2:$A$4;0);MATCH(A2;GiaBan!$D$1:$N$1;1))
Cách của bạn fải ghi thêm giá, dù giá kg đổi -> như vậy nhìn rối mắt, vì mình muốn biết có những mặt hàng nào thường xuyên thay đổi giá!

Có thể do mình chưa diễn đạt hết nên cách của bạn nghiaphuc chưa fù hợp
Cách của bạn nhapmon đúng ý của mình!
Xin cảm ơn các bạn!
 
Cách của bạn fải ghi thêm giá, dù giá kg đổi -> như vậy nhìn rối mắt, vì mình muốn biết có những mặt hàng nào thường xuyên thay đổi giá!

Có thể do mình chưa diễn đạt hết nên cách của bạn nghiaphuc chưa fù hợp
Cách của bạn nhapmon đúng ý của mình!
Xin cảm ơn các bạn!
Trước hết, xin thừa nhận công thức trên của tôi là sai.
Bây giờ tôi lại đang nghĩ đến môt tình huống thế này: Mặt hàng Nhớt không thay đổi giá vào ngày 10/04/2013 nhưng lại thay đổi giá vào ngày 20/04/2013 (hoặc một ngày nào đó sau ngày 10/04/2013). Khi đó, nếu ngày trên sheet Xuat nằm trong khoảng từ ngày 01/04/2013 đến trước ngày thay đổi giá đó thì công thức của bạn nhapmon cũng cho kết quả sai. Khi đó, có vẻ như cách làm của bạn hanhpptc lại phù hợp hơn.
 
Trước hết, xin thừa nhận công thức trên của tôi là sai.
Bây giờ tôi lại đang nghĩ đến môt tình huống thế này: Mặt hàng Nhớt không thay đổi giá vào ngày 10/04/2013 nhưng lại thay đổi giá vào ngày 20/04/2013 (hoặc một ngày nào đó sau ngày 10/04/2013). Khi đó, nếu ngày trên sheet Xuat nằm trong khoảng từ ngày 01/04/2013 đến trước ngày thay đổi giá đó thì công thức của bạn nhapmon cũng cho kết quả sai. Khi đó, có vẻ như cách làm của bạn hanhpptc lại phù hợp hơn.

Mấy trò này là thế mạnh của LOOKUP đây:
Mã:
=LOOKUP(2,1/(VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0)>0)/(GiaBan!$D$1:$F$1<=$A2),VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0))
 
Bạn thử công thức này đúng chưa :
=INDEX(GiaBan!$A$1:$Z$100;MATCH(B2;GiaBan!A:A;0);MATCH(9999999;OFFSET(GiaBan!$A$1:$Z$100;MATCH(B2;GiaBan!A:A;0)-1;0;1;MATCH(A2;GiaBan!$A$1:$Z$1;1))))
 
Nhờ các bạn giúp sửa giúp công thức đơn giá (Sheet Xuất)ở từng thời điểm .....

Nhờ các bạn sửa công thức, cảm ơn!
Nếu các bạn vừa giúp công thức vừa giúp VBA thì càng tốt
Yêu cầu của bạn đã có rất nhiều người giúp
Tuy nhiên yêu cầu lấy giá của bạn theo tôi chưa khả thi
Trước đây tôi cũng làm kiểu đó và lập bảng giá từng ngày trong năm nhưng vẫn phải cập nhật giá thủ công
Giờ đây tôi đã nhờ các ACE trên GPE giúp và đã tạo cho mình File QLBH lấy giá một cách tự động bất kỳ thời điểm nào. Cụ thể khi thay đổi giá trong Mua hay Ban thì giá đó tự động cập nhật vào Sheets KHo để rồi lần nhập xuất sau sẽ tự hiện ra giá mới đó. Và cũng căn cứ vào giá nhập, giá xuất máy tự động tính lãi cho từng mặt hàng, từng ngày.v.v...
Gửi các bạn File QLBH của tôi để các bạn tham khảo
 
Trước hết, xin thừa nhận công thức trên của tôi là sai.
Bây giờ tôi lại đang nghĩ đến môt tình huống thế này: Mặt hàng Nhớt không thay đổi giá vào ngày 10/04/2013 nhưng lại thay đổi giá vào ngày 20/04/2013 (hoặc một ngày nào đó sau ngày 10/04/2013). Khi đó, nếu ngày trên sheet Xuat nằm trong khoảng từ ngày 01/04/2013 đến trước ngày thay đổi giá đó thì công thức của bạn nhapmon cũng cho kết quả sai. Khi đó, có vẻ như cách làm của bạn hanhpptc lại phù hợp hơn.
Bạn phân tích đúng rồi
Mấy trò này là thế mạnh của LOOKUP đây:
Mã:
=LOOKUP(2,1/(VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0)>0)/(GiaBan!$D$1:$F$1<=$A2),VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0))
Công thức của anh, sao tôi làm nó vẫn chưa cho kết qủa đúng, kg biết khi tôi nhập công thức đúng không? vì dấu ngăn cách cthức thức của tôi là dấu chấm phẩy, nhờ anh xem lại
Tôi thấy công thức của bạn letin cho đúng kết qủa ở các trường hợp
Mình xin nói thêm cho rỏ như sau:
GIÁ BÁN SẼ LẤY GIÁ CÙNG NGÀY HOẶC GIÁ CÓ NGÀY NHỎ HƠN & GẦN NHẤT
Cảm ơn các bạn.
 

File đính kèm

Bạn phân tích đúng rồi

Công thức của anh, sao tôi làm nó vẫn chưa cho kết qủa đúng, kg biết khi tôi nhập công thức đúng không? vì dấu ngăn cách cthức thức của tôi là dấu chấm phẩy, nhờ anh xem lại
Tôi thấy công thức của bạn letin cho đúng kết qủa ở các trường hợp
Mình xin nói thêm cho rỏ như sau:
GIÁ BÁN SẼ LẤY GIÁ CÙNG NGÀY HOẶC GIÁ CÓ NGÀY NHỎ HƠN & GẦN NHẤT
Cảm ơn các bạn.

Làm vào file cho bạn luôn đây! Tôi nghĩ công thức này mới là ngắn nhất
Lưu ý: Tại dòng 6 và 7, bạn cho rằng giá xuất đúng là 1600 nhưng tôi kiểm tra thì phải là 1500 mới đúng nhé
 

File đính kèm

Nhờ các bạn giúp sửa giúp công thức đơn giá (Sheet Xuất)ở từng thời điểm như sau:
Tại sheet Xuất, mình muốn lấy đơn giá ở Sheet GiaBan
Giả sử mặt hàng xăng (mã A001):
Nếu xuất từ ngày 01/04/13 đến 09/04/13 thì giá là 1.000
Nếu xuất từ ngày 10/04/13 đến 19/04/13 thì giá là 1.200
Nếu xuất từ ngày 20/04/13 đến khi ngày nào có giá mới thì giá là 1.100
Vì xăng có thay đổi giá ở từng thời điểm nên công thức đúng

Dầu (mã A002), chỉ có thay đổi giá ở ngày 10/04, Nếu xuất từ ngày 20/04/13 trở đi thì nó cho kết quả là 0, mình muốn nó lấy đơn giá của ngày 10/04/2012 là 1.600

Nhớt(mã A003) Chỉ có 1 giá của ngày 01/04/2013, nếu xuất từ ngày 10/04/2013 trở đi thì nó cho kết quả là 0, mình muốn nó lấy đơn giá của ngày 01/04/2012 là 1.800

Nhờ các bạn sửa công thức, cảm ơn!
Nếu các bạn vừa giúp công thức vừa giúp VBA thì càng tốt

Một công thức linh hoạt hơn, sử dụng trong trường hợp có nhiều cột và hàng dữ liệu
F2=VLOOKUP(B2;GiaBan!A$1:F$4;MIN(MATCH(A2;GiaBan!A$1:F$1);COUNTA(OFFSET(GiaBan!A$1:F$1;MATCH(B2;GiaBan!A$2:A$4;0);0))))
 
Một công thức linh hoạt hơn, sử dụng trong trường hợp có nhiều cột và hàng dữ liệu
F2=VLOOKUP(B2;GiaBan!A$1:F$4;MIN(MATCH(A2;GiaBan!A$1:F$1);COUNTA(OFFSET(GiaBan!A$1:F$1;MATCH(B2;GiaBan!A$2:A$4;0);0))))

Hình như bạn chẳng xem kỹ yêu cầu của người ta thì phải
Giờ thế này nhé: Bạn tải file ở bài 13 về, mở lên rồi chèn công thức của bạn vào... So sánh với công thức hiện có, nếu kết quả y chang của người ta thì công thức của bạn chính xác. Bằng ngược lại nghĩa là.. TRẬT LẤT
 
Dài quá thì tôi dùng hàm COLUMN() chứ dại gì mà chơi 5\6\7\......\n cho mỏi tay
Ẹc... Ẹc...
Bạn giúp tôi chuyển công thức dùng hàm COLUMN() hay có thể viết code VBA, vì:
Thực tế Sheet "GiaBan" có thể phát sinh rất nhiều cột, do File sử dụng cho một năm, vì mỗi mặt hàng phát sinh tăng/giảm giá ở các thời điểm khác nhau => sẽ phát sinh rất nhiều cột
Mục đích tôi bố trí CSDL như vậy là để biết mỗi mặt hàng tăng hay giảm giá trong thời gian bao lâu (bao nhiệu ngày) và tăng hay giảm bao nhiêu % giữa giá củ và giá mới
Mong sự hỗ trợ của các bạn, xin cảm ơn.
 
Bạn giúp tôi chuyển công thức dùng hàm COLUMN() hay có thể viết code VBA, vì:
Thực tế Sheet "GiaBan" có thể phát sinh rất nhiều cột, do File sử dụng cho một năm, vì mỗi mặt hàng phát sinh tăng/giảm giá ở các thời điểm khác nhau => sẽ phát sinh rất nhiều cột
Mục đích tôi bố trí CSDL như vậy là để biết mỗi mặt hàng tăng hay giảm giá trong thời gian bao lâu (bao nhiệu ngày) và tăng hay giảm bao nhiêu % giữa giá củ và giá mới
Mong sự hỗ trợ của các bạn, xin cảm ơn.

Dự phòng dữ liệu tại sheet GiaBan từ cột A đến cột Z luôn
Vậy ta dùng hàm COLUMN như sau:
Mã:
=LOOKUP(2,1/(VLOOKUP($B2,GiaBan![COLOR=#ff0000]$A$1:$Z$4[/COLOR],[COLOR=#ff0000]COLUMN($D:$Z)[/COLOR],0)>0)/(GiaBan![COLOR=#ff0000]$D$1:$Z$1[/COLOR]<=$A2),VLOOKUP($B2,GiaBan![COLOR=#ff0000]$A$1:$Z$4[/COLOR],[COLOR=#ff0000]COLUMN($D:$Z)[/COLOR],0))
Do hàm này là hàm mảng nên công thức trên phải kết thúc bằng Ctrl + Shift + Enter nhé
(chổ màu đỏ là những chổ thay đổi)
 
Các bạn giúp mình luôn VBA . Cảm ơn.
 
Các bạn giúp mình luôn VBA . Cảm ơn.

VBA nghĩa là hàm tự tạo chăng?
Tôi nghĩ dù là VBA hay gì đi chăng thì giải thuật cũng là thế thôi
Tuy nhiên, tôi cho rằng vấn đề không nằm ở chổ giải quyết bằng công thức hay VBA mà phải chăng bạn nên xem lại cách bố trí dữ liệu tại sheet GiaBan?
Nếu là tôi thì tôi sẽ bố trí thế này:

Capture.JPG























Bảng này chỉ ghi lại những thông tin khi có phát sinh giá mới.
Phần TÊN HH, ĐVT theo MÃ nên ghi vào 1 bảng khác
----------------
Với 1 bảng được bố trí như trên thì việc truy xuất sẽ dễ dàng vô cùng
 
VBA nghĩa là hàm tự tạo chăng?
Tôi nghĩ dù là VBA hay gì đi chăng thì giải thuật cũng là thế thôi
Tuy nhiên, tôi cho rằng vấn đề không nằm ở chổ giải quyết bằng công thức hay VBA mà phải chăng bạn nên xem lại cách bố trí dữ liệu tại sheet GiaBan?
Nếu là tôi thì tôi sẽ bố trí thế này:

View attachment 103299























Bảng này chỉ ghi lại những thông tin khi có phát sinh giá mới.
Phần TÊN HH, ĐVT theo MÃ nên ghi vào 1 bảng khác
----------------
Với 1 bảng được bố trí như trên thì việc truy xuất sẽ dễ dàng vô cùng

1/Vì file thực tế sử dụng cho 1 năm, và còn khá nhiều sheet tính toán khác, nên tôi muốn viết VBA giảm bớt dung lương file, nhờ anh viết giúp code cho nút "Cập nhật giá" (Theo tôi hàm tự tạo không làm giảm dung lượng nhiều)
2/ Tôi đã sửa sheet GiaBan theo như ý kiến trên của anh (xem file đính kèm)

Mong anh và các thành viên giúp đỡ. Xin cảm ơn.
 

File đính kèm

1/Vì file thực tế sử dụng cho 1 năm, và còn khá nhiều sheet tính toán khác, nên tôi muốn viết VBA giảm bớt dung lương file, nhờ anh viết giúp code cho nút "Cập nhật giá" (Theo tôi hàm tự tạo không làm giảm dung lượng nhiều)
2/ Tôi đã sửa sheet GiaBan theo như ý kiến trên của anh (xem file đính kèm)

Mong anh và các thành viên giúp đỡ. Xin cảm ơn.

Dữ liệu thế là chuẩn rồi
Bạn tự suy nghĩ trước đi trong khi chờ đợi các "đồng chí" khác xuất chiêu
(bài này cũng không phải thuộc dạng khó đâu)
 
Mấy trò này là thế mạnh của LOOKUP đây:
Mã:
=LOOKUP(2,1/(VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0)>0)/(GiaBan!$D$1:$F$1<=$A2),VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0))
Bạn giải thích giúp mình đoạn 1/(VLOOKUP($B2,GiaBan!$A$1:$F$4,{4,5,6},0)>0)/(GiaBan!$D$1:$F$1<=$A2). Đoạn này sẽ tạo ra mảng dữ liệu như nào vậy?
 
Làm vào file cho bạn luôn đây! Tôi nghĩ công thức này mới là ngắn nhất
Lưu ý: Tại dòng 6 và 7, bạn cho rằng giá xuất đúng là 1600 nhưng tôi kiểm tra thì phải là 1500 mới đúng nhé

Công thức sau còn ngắn và dễ hiểu hơn
GiaXuat!F2=VLOOKUP(B2;GiaBan!A$1:F$4;LOOKUP(MATCH(A2;GiaBan!A$1:F$1);IF(OFFSET(GiaBan!A$1:F$1;MATCH(B2;GiaBan!A$2:A$4););COLUMN(GiaBan!A:F))))
 
Bạn thử file này với dữ liệu xem thế nào.
Chúc vui
 

File đính kèm

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

Back
Top Bottom