Xem báo cáo từ ngày đến ngày.

Liên hệ QC

ngocthanh1978

Thành viên mới
Tham gia
7/10/08
Bài viết
3
Được thích
0
Mong các anh chị giúp em làm sao để báo cáo được theo từng mã sản phẩm và theo từ ngày đến ngày.
Rất cám ơn các anh chị.
 

File đính kèm

Mong các anh chị giúp em làm sao để báo cáo được theo từng mã sản phẩm và theo từ ngày đến ngày.
Rất cám ơn các anh chị.
Bạn xem bài này nhe
http://www.giaiphapexcel.com/forum/showthread.php?t=23523
Hoặc bạn dùng code của anh Ndu... như sau:
Mã:
Sub Loc()
  Dim Sh As Worksheet
  Set Sh = Sheets("baocao")
  Sh.Range("A8:E1000").ClearContents
  With Sheets("dulieu").Range("A4").CurrentRegion
    .AutoFilter 3, Sheet2.[c2]
    .AutoFilter 2, ">=" & CDbl(Sh.[c3]), xlAnd, "<=" & CDbl(Sh.[c4])
    .Offset(1, 0).Resize(, 5).SpecialCells(12).Copy
    Sh.Range("A8").PasteSpecial 3
    .AutoFilter
  End With
End Sub

Tham khảo file nhe

Thân
 

File đính kèm

Lần chỉnh sửa cuối:
Mình làm bằng VBA bạn kiểm tra và tham khảo nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Mình làm bằng VBA bạn kiểm tra và tham khảo nhé.
Em không hiểu tại sao máy em khi chạy code của anh nếu như cột B của sheet dữ liệu bị ép lại ngày nó biến thành ###### thì khi chạy code nó cho ra kết quả dạng text cột B của sheet báo cáo là ######
attachment.php

Em xin mạng phép sửa lại như sau:
Mã:
Sub baocao()
Dim ma As String
Dim tn, dn As Long
Sheet2.Rows("8:100").ClearContents
i = 5: j = 8
ma = Sheet2.[c2]
tn = Sheet2.[c3]
dn = Sheet2.[c4]
Do While Sheet1.Cells(i, 1) <> ""
If Day(Sheet1.Cells(i, 2)) <= dn And Day(Sheet1.Cells(i, 2)) >= tn And UCase(Sheet1.Cells(i, 3)) Like ma Then
Sheet2.Cells(j, 1) = Sheet1.Cells(i, 1).[COLOR=blue]Value[/COLOR]
Sheet2.Cells(j, 2) = Sheet1.Cells(i, 2).[COLOR=blue]Value[/COLOR]
Sheet2.Cells(j, 3) = Sheet1.Cells(i, 4).[COLOR=blue]Value[/COLOR]
Sheet2.Cells(j, 4) = Sheet1.Cells(i, 5).[COLOR=blue]Value[/COLOR]
j = j + 1
End If
i = i + 1
Loop
End Sub
 
Lần chỉnh sửa cuối:
Bạn nên tận dụng hết tính năng sẵn có của EX. Trường hợp của ban không nhất thiết phải dùng mã VBA, bạn hãy dung Pivottable sẽ đạt KQ như ý và linh hoạt hơn rất nhiều.
 

File đính kèm

Bài này không dể ăn đâu nha! Phải dùng:
- AutoFilter hoặc Advanced Filter lọc đúng điều kiện ra vùng tạm
- Tiếp theo dùng Consolidate tổng hợp theo ngày (vì nếu cùng ngày phải cộng sản lượng lại với nhau)
Code khá dài nhưng bảo đảm rất nhanh vì không dùng tí vòng lập nào!
PHP:
Private Sub Calendar1_Click()
  ActiveCell = Calendar1.Value
End Sub
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Calendar1
    If Not Intersect([C3:C4], Target) Is Nothing And Target.Count = 1 Then
      .Visible = True
      .Top = Target.Top: .Left = Target(, 2).Left
    ElseIf Application.CutCopyMode = False Then
      .Visible = False
    End If
  End With
End Sub
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Dk As Range
  On Error Resume Next
  If Not Intersect(Range("C2:C4"), Target) Is Nothing And Target.Count = 1 Then
    Application.ScreenUpdating = False
    Set Dk = Range("C2:C4")
    Range("A8:D10000").ClearContents
    With Sheet2.Range(Sheet2.[A4], Sheet2.[E65536].End(xlUp))
      .Parent.Range("V:Y").Clear
      .AutoFilter 2, IIf(Dk(2) = "", "<>", ">=" & CDbl(Dk(2))), xlAnd, IIf(Dk(3) = "", "<>", "<=" & CDbl(Dk(3)))
      .AutoFilter 3, IIf(Dk(1) = "", "<>", Dk(1))
      Union(.Offset(0, 0).Resize(, 2), .Offset(0, 3).Resize(, 2)).SpecialCells(12).Copy
      .Parent.Range("V4").PasteSpecial
      .AutoFilter
      With .Parent.Range("V4").CurrentRegion
        [B8].Consolidate "'" & .Parent.Name & "'!" & .Offset(1, 1).Address(, , 2), 9, 0, 1
        .Offset(, 1).Resize(, 1).AdvancedFilter 1, , , True
        .Offset(1).Resize(, 1).SpecialCells(12).Copy: Range("A8").PasteSpecial 3
        .Parent.ShowAllData
        .Clear
      End With
    End With
    With Range("A7").CurrentRegion
      .Sort .Cells(2, 2), 1, Header:=xlGuess
      .Resize(, 1).NumberFormat = "General"
    End With
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
Tôi giả lập dử liệu 500 dòng cho tiện kiểm tra
 

File đính kèm

Wow anh đúng là bậc thầy VBA.
Cho em hỏi thêm là Calendar1 anh bỏ ở đâu ?
Mình có thể thêm vào lệnh là sau khi click chọn ngày thì Calendar1 tự biến mất không ?
Cảm ơn anh
 
Cho em hỏi thêm là Calendar1 anh bỏ ở đâu ?
Chưa hiểu lắm ---> Bỏ ở đâu nghĩa là sao? ---> Tôi vẽ nó ra rồi dùng code cho nó ẩn hoặc hiện theo điều kiện (chọn vào C3 hoặc C4 nó mới hiện)
Mình có thể thêm vào lệnh là sau khi click chọn ngày thì Calendar1 tự biến mất không ?
Cảm ơn anh
Được chứ... chẳng hạn thay:
PHP:
Private Sub Calendar1_Click()
  ActiveCell = Calendar1.Value
End Sub
Thành:
PHP:
Private Sub Calendar1_Click()
  ActiveCell = Calendar1.Value
  Calendar1.Visible = False
End Sub
Tuy nhiên tôi thấy không cần thiết ---> Giả sử mình chọn sai ngày thì còn phải "đứng đó" mà chọn lại ngày khác chứ... Bạn nghĩ thử xem! ---> Đàng nào nếu ta không chọn vào C3:C4 thì Calendar ấy cũng đâu có hiện ra!
 
Em không hiểu tại sao máy em khi chạy code của anh nếu như cột B của sheet dữ liệu bị ép lại ngày nó biến thành ###### thì khi chạy code nó cho ra kết quả dạng text cột B của sheet báo cáo là ######
attachment.php

Em xin mạng phép sửa lại như sau:
Mã:
Sub baocao()
Dim ma As String
Dim tn, dn As Long
Sheet2.Rows("8:100").ClearContents
i = 5: j = 8
ma = Sheet2.[c2]
tn = Sheet2.[c3]
dn = Sheet2.[c4]
Do While Sheet1.Cells(i, 1) <> ""
If Day(Sheet1.Cells(i, 2)) <= dn And Day(Sheet1.Cells(i, 2)) >= tn And UCase(Sheet1.Cells(i, 3)) Like ma Then
Sheet2.Cells(j, 1) = Sheet1.Cells(i, 1).[COLOR=blue]Value[/COLOR]
Sheet2.Cells(j, 2) = Sheet1.Cells(i, 2).[COLOR=blue]Value[/COLOR]
Sheet2.Cells(j, 3) = Sheet1.Cells(i, 4).[COLOR=blue]Value[/COLOR]
Sheet2.Cells(j, 4) = Sheet1.Cells(i, 5).[COLOR=blue]Value[/COLOR]
j = j + 1
End If
i = i + 1
Loop
End Sub

Cái này bạn nên sửa lại code một tí
Sub baocao()
Dim ma As String
Dim tn, dn As Long
Sheet2.Rows("8:100").ClearContents
i = 5: j = 8
ma = Sheet2.[c2]
tn = Sheet2.[c3]
dn = Sheet2.[c4]
Do While Sheet1.Cells(i, 1) <> ""
If Day(Sheet1.Cells(i, 2)) <= dn And Day(Sheet1.Cells(i, 2)) >= tn And UCase(Sheet1.Cells(i, 3)) Like ma Then
Sheet2.Cells(j, 1) = Sheet1.Cells(i, 1).Text
Sheet2.Cells(j, 2) = Format(Sheet1.Cells(i, 2), "dd/mm/yyyy")
Sheet2.Cells(j, 3) = Sheet1.Cells(i, 4).Text
Sheet2.Cells(j, 4) = Sheet1.Cells(i, 5).Text
j = j + 1
End If
i = i + 1
Loop
End Sub
 
Ah.... Tôi mới phát hiện ra 1 vấn đề chưa ổn:
- Cùng ngày và cùng tên máy ---> Cái này chắc phải cộng chung lại rồi
Nhưng nếu:
- Cùng ngày nhưng khác tên máy ---> Liệu có cần cộng chúng lại không?
-------------
Bài toán đã trở nên phức tạp hơn rồi đấy (nếu như vẫn nhất định dùng AutoFilter và Consolidate) ---> Các bạn suy nghĩ thử xem
Tôi nghĩ dùng Pivot Table thì việc xử lý sẽ trở nên đơn giản hơn, tổng hợp kiểu gì cũng được tuốt
(Món này tôi không quen tay cho lắm)
 
Topic này rất hay và hữu dụng phải không thầy ndu96081631 (Xin phép gọi anh bằng thầy vì em đã học từ anh rất nhiều).
Gửi anh yeudoi theo em thấy em chỉnh lại là Value cũng được mà . Anh chỉnh ngày như vậy là nó chuyển về dạng text rồi. Trước đây em cũng thường làm như vậy. Nhưng cũng có lần thầy ndu96081631 nhắc nhở là không nên dùng dạng text như thế :-=.
Hỏng biết có đúng hong :-=
 
Lần chỉnh sửa cuối:
Có cách nào dùng công thức dễ hiểu hơn không, vì em chưa dùng Pivot Table bao giờ.
 
Có cách nào dùng công thức dễ hiểu hơn không, vì em chưa dùng Pivot Table bao giờ.
Bạn ơi! Chưa từng xài không có nghĩa là cả đời nhất định không xài (có xài mới có biết)
Trong khi dùng Pivot table bạn chả mất gì, khỏi công thức, khỏi code, khỏi suy nghĩ
Tôi khẳng định với bạn rằng: Yêu cầu của bạn chỉ có Pivot table là ít phức tạp nhất
(nếu bạn dùng công thức, tôi e bạn... phát hoảng luôn)
 
Gửi bạn cách dùng công thức, còn nhiều cách làm nữa...
Cách này cũng không ngon lành gì ---> Cùng ngày, cùng tên máy nó chẳng cộng chung lại với nhau
Nếu nhất định bám sát với công thức, e rằng bạn phải cải tiến lại!
(hiện tại nó chưa chính xác đâu nha --> Số lượng sao lại là s01, s02... )
 
Lần chỉnh sửa cuối:
Cám ơn anh ndu em đã sửa lại file đính kẻm
 
Bạn ơi! Chưa từng xài không có nghĩa là cả đời nhất định không xài (có xài mới có biết)
Trong khi dùng Pivot table bạn chả mất gì, khỏi công thức, khỏi code, khỏi suy nghĩ
Tôi khẳng định với bạn rằng: Yêu cầu của bạn chỉ có Pivot table là ít phức tạp nhất
(nếu bạn dùng công thức, tôi e bạn... phát hoảng luôn)

Em cám ơn, chắc em cũng phải nghiên cứu Pivot table nó như thế nào đã, có khó học lắm không vậy.
 
Web KT

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

Back
Top Bottom