Báo cáo từ ngày đến ngày!!! (6 người xem)

Liên hệ QC

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

lyhuynh

Thành viên chính thức
Tham gia
18/1/11
Bài viết
94
Được thích
2
Anh chị coi dùm em coi đặt công thức thế nào (cho các ô có dấu hỏi) theo điều kiện là từ ngày đến ngày, đây là file vi dụ để em áp dụng cho file báo cáo của em. Em xin cám ơn.
 

File đính kèm

Bạn xem trong file đính kèm nhé.
 

File đính kèm

nếu như dữ liệu nhập trùng nhau trong một ngày cùng một mặt hàng, cùng một xưởng tại sao không cộng tổng lại bạn. theo mình nghỉ thì tác giả muồn cộng dồn lại chứ ko phải liệt kê ra như thế đâu bạn ạ. thân...!
Cám ơn bạn hoamattroi, thật ra thì ý của mình là giống như bạn dream miêu ta vậy, mình gửi lại file các bạn coi giúp mình, thật ra thì không có cột ngày bên phần báo cáo.
 

File đính kèm

Mình xài AdvancedFilter & SUMIF()

Với sự trợ giúp bằng macro sự kiện
 

File đính kèm

(2)Lam macro khó không anh, (1) anh chỉ em sử dụng cái đó với,

(1) Vì là macro sự kiện, nên bạn nhập ngày cần thiết vô lần lượt các ô [k3] & [[M3]

Sau khi {ENTER} thì sẽ có ngay kết quả các ngày bạn cần số liệu;


(2) Câu này khó trả lời cho bạn; Thôi thì thế này đi:

Sau đây là nội dung macro:


PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [M3]) Is Nothing Then
1   Dim Rws As Long, Rng As Range, WF As Object, Cls As Range
 
   Set Rng = [A7].CurrentRegion:         Rws = Rng.Rows.Count
   [k8].Resize(Rws, 7).ClearContents
4   [A7].Resize(Rws, 8).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
      "AA1:AB2"), CopyToRange:=Range("AA7:AF7"), Unique:=False
   Set Rng = [aa7].CurrentRegion:           Rws = Rng.Rows.Count
   ActiveWorkbook.Names("Criteria").Delete
   ActiveWorkbook.Names("Extract").Delete
8   [aa7].Resize(Rws, 2).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
      ("BA1:BB2"), CopyToRange:=Range("K7:L7"), Unique:=True
   Rws = [AA65500].End(xlUp).Row
   If Rws = [k65500].End(xlUp).Row Then
11      [k8].Resize(Rws, 6).Value = [aa8].Resize(Rws, 6).Value
   Else
      Set WF = Application.WorksheetFunction
      For Each Rng In Range([k8], [k8].End(xlDown))
         For Each Cls In Range([Ac7], [AB7].End(xlToRight))
16            Cells(Rng.Row, Rng.Column + Cls.Column - 27).Value = WF.SumIf([aa7].CurrentRegion, Rng.Value, Cls)
         Next Cls
      Next Rng
   End If
 End If
End Sub

Bạn có hiểu & dịch ra tiếng Việt các dòng lệnh này không?

Mình dịch các dòng lệnh có đánh sẵn số nha:

Dg1: Khai báo các biến cần xài;

Dg4: Áp dụng fương thức Lọc Mở rọng với CSDL của bạn; Kết quả nhặt ra các số liệu trong khoảng giữa các ngày bạn cần;

Dg8: Lọc lần nữa từ danh sách vừa lọc để lấy danh sách mặt hàng duy nhất;

Dg11: Chép vùng vừa lọc đến báo cáo, nếu số dòng kết quả lọc đầu trùng với kết quả lần lọc sau;

Dg16: Dùng hàm SUMIF() trong excel để tính số liệu cho các sản fẩm của các xưởng

(Có dễ hay khó thì bạn tự nhận xét theo trình độ của mình, vậy nha!)

Thân ái!
 
Cám ơn bạn hoamattroi, thật ra thì ý của mình là giống như bạn dream miêu ta vậy, mình gửi lại file các bạn coi giúp mình, thật ra thì không có cột ngày bên phần báo cáo.
Không thích Macro thì bảng phụ vậy, thực ra ngay trên bảng của tôi bạn cũng có thể tổng hợp được bằng cách lọc duy nhất phần mã sản phẩm, sau đó SUMIF tính tổng là ok. Test thử file này :
 

File đính kèm

Không thích Macro thì bảng phụ vậy, thực ra ngay trên bảng của tôi bạn cũng có thể tổng hợp được bằng cách lọc duy nhất phần mã sản phẩm, sau đó SUMIF tính tổng là ok. Test thử file này :
bạn giải thích giúp mình tí nhé. Minh không hiểu công thức của bạn chổ này
ĐK bạn đặt name là DK
Mã:
 =IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5);ROW(Sheet1!$A$7:$A$27)-6;"")
ở bảng phụ tại ô J9 bạn đặt công thức là
Mã:
=IF(ROW(1:1)>COUNT(DK);"";INDEX($A$7:$H$27;SMALL(DK;ROW(1:1));COLUMN(A1)))
như vậy theo lý luận: nếu ROW (1:1) lớn hơn COUNT(DK) thì bằng "", mà kết quả cho ra 1=1 mà ct vẩn cho ra kết quả 2 là sử dụng hàm INDEX, tư tự kéo ct xuống ROW(2:2) > COUNT(DK) thì kết quả phải bằng "" chứ???
Minh mới học excel mong các bạn chỉ giúp cho. cám ơn các bạn nhiều...!
 
như vậy theo lý luận: nếu ROW (1:1) lớn hơn COUNT(DK) thì bằng "", mà kết quả cho ra 1=1 mà ct vẩn cho ra kết quả 2 là sử dụng hàm INDEX, tư tự kéo ct xuống ROW(2:2) > COUNT(DK) thì kết quả phải bằng "" chứ???
Tại ô bất kỳ bạn gõ thử =COUNT(DK) xem ra bao nhiêu?
 
bạn giải thích giúp mình tí nhé. Minh không hiểu công thức của bạn chổ này
Nếu ROW (1:1) lớn hơn COUNT(DK) thì bằng "", mà kết quả cho ra 1=1 mà ct vẩn cho ra kết quả 2 là sử dụng hàm INDEX, tư tự kéo ct xuống ROW(2:2) > COUNT(DK) thì kết quả phải bằng "" chứ???
Minh mới học excel mong các bạn chỉ giúp cho. cám ơn các bạn nhiều...!
Count(DK) tại thời điểm từ ngày 02/12/2011 đến ngày 11/12/2011 bằng 21 tương đương với 21 dòng thỏa mãn DK.
Row(1:1) = 1 nhỏ hơn COUNT(DK) = 21 vậy hàm IF sẽ trả về kết quả là vế sau : "INDEX($A$7:$H$27;SMALL(DK;ROW(1:1));COLUMN(A1))"
T
ương tự Row(2:2) = 2 < 21 vẫn trả về kết quả là vế sau của hàm IF
...........................
Ô J9 trả về giá trị rỗng ("") khi ở vị trí từ Row(22:22) = 22 >21
Bạn có thể thấy kết quả hiển thị trên bảng phụ
Với điều kiện ngày khác cũng giải thích tượng tự.
Thân!
 
Count(DK) tại thời điểm từ ngày 02/12/2011 đến ngày 11/12/2011 bằng 21 tương đương với 21 dòng thỏa mãn DK.
Row(1:1) = 1 nhỏ hơn COUNT(DK) = 21 vậy hàm IF sẽ trả về kết quả là vế sau : "INDEX($A$7:$H$27;SMALL(DK;ROW(1:1));COLUMN(A1))"
T
ương tự Row(2:2) = 2 < 21 vẫn trả về kết quả là vế sau của hàm IF
từ đoạn
Mã:
 =IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5);ROW(Sheet1!$A$7:$A$27)-6;"")
Vậy là sao nhỉ? rỏ ràng là đk là hàm if mà. Nếu ngày 02/12/2011 đến ngày 11/12/2011 thảo mãn thì " = ROW(Sheet1!$A$7:$A$27)-6" mà nếu tách công thức này ra =ROW(Sheet1!$A$7:$A$27) cho kết quả =7 có trừ đi 6, như vậy COUNT(DK) = 1 mà chứ đâu phải =21 nhỉ ???. Mình thực sự không hiểu chổ này.
mong bạn chỉ giúp
 
từ đoạn
Mã:
 =IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5);ROW(Sheet1!$A$7:$A$27)-6;"")
Vậy là sao nhỉ? rỏ ràng là đk là hàm if mà. Nếu ngày 02/12/2011 đến ngày 11/12/2011 thảo mãn thì " = ROW(Sheet1!$A$7:$A$27)-6" mà nếu tách công thức này ra =ROW(Sheet1!$A$7:$A$27) cho kết quả =7 có trừ đi 6, như vậy COUNT(DK) = 1 mà chứ đâu phải =21 nhỉ ???. Mình thực sự không hiểu chổ này.
mong bạn chỉ giúp
Bạn nhầm lẫn giữa ROWS và ROW:
ROWS trả về 1 con số, nhưng ROW(A7:A27) trả về 1 mảng. Bạn có thể bôi đen dùng F9 để xem các phần tử của mảng này.
 
từ đoạn
Mã:
 =IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5);ROW(Sheet1!$A$7:$A$27)-6;"")
Vậy là sao nhỉ? rỏ ràng là đk là hàm if mà. Nếu ngày 02/12/2011 đến ngày 11/12/2011 thảo mãn thì " = ROW(Sheet1!$A$7:$A$27)-6" mà nếu tách công thức này ra =ROW(Sheet1!$A$7:$A$27) cho kết quả =7 có trừ đi 6, như vậy COUNT(DK) = 1 mà chứ đâu phải =21 nhỉ ???. Mình thực sự không hiểu chổ này.
mong bạn chỉ giúp

Name (DK) trả kết quả là một mảng gồm 21 phần tử, không chỉ trả về kết quả đơn như bạn miêu tả, nó là kết quả của của nhiều phép tính đơn gộp lại :
Trong name DK =IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5);ROW(Sheet1!$A$7:$A$27)-6;"") .
Công thức này hoạt động như sau :
Nó sẽ đi thực hiện trình tự các phép tính đơn :
1/ IF(Sheet1!$K$5<=Sheet1!$A$7)*(Sheet1!$A$7<=Sheet1!$M$5); Row($A$7)-6
Kết quả đầu tiên bằng 1
2/ IF(Sheet1!$K$5<=Sheet1!$A$8)*(Sheet1!$A$8<=Sheet1!$M$5); Row($A$8)-6
Kết quả thứ hai bằng 2
3/ IF(Sheet1!$K$5<=Sheet1!$A$9)*(Sheet1!$A$9<=Sheet1!$M$5); Row($A$9)-6
Kết quả thứ ba bằng 3
.........................................
21/ IF(Sheet1!$K$5<=Sheet1!$A$27)*(Sheet1!$A$27<=Sheet1!$M$5); Row($A$27)-6
Kết quả cuối cùng thỏa mãn điều kiện bằng 21
Cuối cùng được mảng kết quả sau :
DK ={1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21}
Vì vậy : Count(DK) = 21
Bạn có thể tham khảo cách hoạt động của công thức mảng bằng cách search trên diễn đàn vời từ khóa "Công thức mảng"
 
Lần chỉnh sửa cuối:
Name (DK) trả kết quả là một mảng gồm 21 phần tử, không chỉ trả về kết quả đơn như bạn miêu tả, nó là kết quả của của nhiều phép tính đơn gộp lại :
Trong name DK =IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5);ROW(Sheet1!$A$7:$A$27)-6;"") .
Công thức này hoạt động như sau :
Nó sẽ đi thực hiện trình tự các phép tính đơn :
1/ IF(Sheet1!$K$5<=Sheet1!$A$7)*(Sheet1!$A$7<=Sheet1!$M$5); Row($A$7)-6
Kết quả đầu tiên bằng 1
2/ IF(Sheet1!$K$5<=Sheet1!$A$8)*(Sheet1!$A$8<=Sheet1!$M$5); Row($A$8)-6
Kết quả thứ hai bằng 2
3/ IF(Sheet1!$K$5<=Sheet1!$A$9)*(Sheet1!$A$9<=Sheet1!$M$5); Row($A$9)-6
Kết quả thứ ba bằng 3
.........................................
21/ IF(Sheet1!$K$5<=Sheet1!$A$27)*(Sheet1!$A$27<=Sheet1!$M$5); Row($A$27)-6
Kết quả cuối cùng thỏa mãn điều kiện bằng 21
Cuối cùng được mảng kết quả sau :
DK ={1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21}
Vì vậy : Count(DK) = 21
Bạn có thể tham khảo cách hoạt động của công thức mảng bằng cách search trên diễn đàn vời từ khóa "Công thức mảng"
Bạn cho mình hỏi 1 ý nhỏ này nữa, tại sao không trừ số khác mà lại là -6 vậy, mới tham gia dien đàn chưa lâu mong anh chị chỉ giúp. E cám ơn
 
Bạn cho mình hỏi 1 ý nhỏ này nữa, tại sao không trừ số khác mà lại là -6 vậy, mới tham gia dien đàn chưa lâu mong anh chị chỉ giúp. E cám ơn
ROW(A7:A27) là mảng {7;8;9;..;27}
Trừ đi 6 để tạo mảng từ 1 đến 21
 
Bạn cho mình hỏi 1 ý nhỏ này nữa, tại sao không trừ số khác mà lại là -6 vậy, mới tham gia dien đàn chưa lâu mong anh chị chỉ giúp. E cám ơn

6
chính là khoảng cách từ dòng đầu tiên của bảng tính đến dòng dữ liệu chúng ta cần xét điều kiện, ở ví dụ này dòng dữ liệu chúng ta cần xét thỏa mãn điều kiện bắt đầu từ ô A7 trở đi...Trừ 6 để đánh dấu dòng bắt đầu xét điều kiện trở thành dòng đầu tiên trong mảng do name DK tạo ra.
Trong trường hợp bạn chèn thêm dòng phía trên ô A7 thì công thức trong name của tôi sẽ không cho kết quả đúng nữa, vì lúc này khoảng cách từ dòng đầu tiên của bảng tính đến dòng chứa dữ liệu xét điều kiện không phải bằng 6 nữa mà là một số khác.
Để khắc phục tình trạng này bạn có thể sửa name DK thành :
PHP:
=IF((Sheet1!$K$5<=Sheet1!$A$7:$A$27)*(Sheet1!$A$7:$A$27<=Sheet1!$M$5),ROW(Sheet1!$A$7:$A$27)-ROW(Sheet1!$A$7)+1,"")
Và công thức tại ô J9 thành :
PHP:
=IF(ROWS($1:1)>COUNT(DK),"",INDEX($A$7:$H$27,SMALL(DK,ROWS($1:1)),COLUMN(A1)))
Bạn có thể chèn dòng thoải mái mà không cần quan tâm ta phải trừ đi bao nhiêu nữa mà vẫn cho kết quả đúng.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom