ngocthanh1978
Thành viên mới
- Tham gia
- 7/10/08
- Bài viết
- 3
- Được thích
- 0
Bạn xem bài này nheMong 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ị.
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
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à ######Mình làm bằng VBA bạn kiểm tra và tham khảo nhé.
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
Private Sub Calendar1_Click()
ActiveCell = Calendar1.Value
End Sub
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
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
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)Cho em hỏi thêm là Calendar1 anh bỏ ở đâu ?
Được chứ... chẳng hạn thay: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
Private Sub Calendar1_Click()
ActiveCell = Calendar1.Value
End Sub
Private Sub Calendar1_Click()
ActiveCell = Calendar1.Value
Calendar1.Visible = False
End Sub
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à ######
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
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
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)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ờ.
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 nhauGửi bạn cách dùng công thức, còn nhiều cách làm nữa...
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)
Bạn tham khảo về Pivot ở trang: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.