Chào gia đình GPE, em có 1 file này mong nhà ta viết code để báo cáo từ ngày đến ngày mà kết quả tính tổng theo tên phụ liệu.Vì dùng hàm thì thấy nó chậm quá.
Thế bạn đã bấm vào mũi tên xổ xuống như hướng dẫn chưa? Muốn chọn từ ngày nào đến ngày nào, cứ vào đó mà chọnEm cám ơn Thầy, nhưng sao trong mục ngày của Thầy chỉ tới 6/1/2012 mà file là tới 7/2/2012 lựn mà Thầy. Nhưng cũng chưa đúng ý em Thầy ơi. Tức là em muốn như đầu đề là từ ngày đến ngày cơ(có thể là 10 ngày ,01 tháng hoặc 03 tháng). Em mong Thầy và GPE giúp em.
Đoán không lầm thì bạn đang dùng Excel 2003Em đã bấm vào nút xổ xuống rồi, nhưng chỉ cho chọn có một ngày thôi,hoặc hết tất cả. Ý của em là muốn chọn ngày như là từ 03/01/2012 đến 06/01/2012 cơ. Mong Thầy chỉ giáo.
Bài nào đâu? Bạn cho lại đường link đi!Xin lỗi Thầy, đúng là em đang xài Excel 2003, và không có điều kiện nâng cấp lên 2007-2010, em có lên diễn đàn và có doawnload bài này của Thầy(http://www.giaiphapexcel.com/forum/member.php?61139-ndu96081631).Trong bài này Thầy có thể chỉnh code lại để không xem theo tên máy nữa và cộng chung SL sản xuất theo tên máy thôi. Em thấy Thầy là cao thủ nhất trong GPE. Mong tin Thầy
Thế thì theo code trong đó sửa lại 1 tí:file gốc của Thầy đây ạ!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Dk As Range
On Error Resume Next
If Not Intersect(Range("C2:C3"), Target) Is Nothing And Target.Count = 1 Then
Application.ScreenUpdating = False
Set Dk = Range("C2:C3")
Range("A6:D10000").ClearContents
With Sheet2.Range(Sheet2.[A4], Sheet2.[E65536].End(xlUp))
.Parent.Range("V:Y").Clear
.AutoFilter 1, ">=" & CDbl(Dk(1)), xlAnd, "<=" & CDbl(Dk(2))
.Offset(, 1).SpecialCells(12).Copy
.Parent.Range("V1").PasteSpecial 3
.AutoFilter
With .Parent.Range("V1").CurrentRegion
Range("A6").Consolidate "'" & .Parent.Name & "'!" & .Offset(1).Address(, , 2), 9, 0, 1
.Resize(, 1).AdvancedFilter 1, , , True
.Offset(1, 1).Resize(, 1).Copy: Range("B6").PasteSpecial 3
.Parent.ShowAllData
.Clear
End With
End With
Target.Select
Application.ScreenUpdating = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim CritArr, sArray, Arr(), Dic As Object, tmp As String
Dim fDate As Long, eDate As Long, lR As Long, n As Long
Dim imVal As Double, exVal As Double
On Error Resume Next
If Not Intersect(Range("C2:C3"), Target) Is Nothing And Target.Count = 1 Then
fDate = CLng(Range("C2").Value)
eDate = CLng(Range("C3").Value)
sArray = Sheet2.Range("A5:E10000").Value
ReDim Arr(1 To UBound(sArray, 1), 1 To 4)
Set Dic = CreateObject("Scripting.Dictionary")
Range("A6:D10000").ClearContents
For lR = 1 To UBound(sArray, 1)
If Trim(CStr(sArray(lR, 2))) <> "" Then
If CLng(sArray(lR, 1)) >= fDate And CLng(sArray(lR, 1)) <= eDate Then
tmp = Trim(CStr(sArray(lR, 2)))
imVal = CDbl(sArray(lR, 4))
exVal = CDbl(sArray(lR, 5))
If Not Dic.Exists(tmp) Then
n = n + 1
Dic.Add tmp, n
Arr(n, 1) = tmp
Arr(n, 2) = CStr(sArray(lR, 3))
If imVal > 0 Then Arr(n, 3) = imVal
If exVal > 0 Then Arr(n, 4) = exVal
Else
If imVal > 0 Then Arr(Dic.Item(tmp), 3) = Arr(Dic.Item(tmp), 3) + imVal
If exVal > 0 Then Arr(Dic.Item(tmp), 4) = Arr(Dic.Item(tmp), 4) + exVal
End If
End If
End If
Next
If n Then Range("A6:D6").Resize(n).Value = Arr
End If
End Sub
Các khái niệm về Intersect và Target,Private tôi chưa từng biết về cách dùng của chúng, xin thày Ndu và mọi người chỉ giúp hộ. Tối hôm nay tôi sẽ gắng học cái này.
Cảm ơn thày Ndu nhiều lắm, đặc biệt là khái niệm Dictionary, qua 2 hôm nghiên cứu dưới sự chỉ dẫn của thày và mọi người đến nay tôi đã có thể hiểu, bắt đầu tự vận dụng được rồi.
Trong các sự kiện hay gặp như Worksheet_change hay Worksheet_selectionchange... thì target có ý chỉ ô, vùng đang được chọn. VD nếu trong sheet, ô A1 đang được chọn thì target lúc này chỉ ô A1. Target ~ [A1] ~ Range("A1")
Intersect là một phương thức, dùng để xác định giao giữa 2 hay nhiều vùng cho trước, kết quả trả về là true or false.
Giả sử ô B25 đang được chọn. target ~ [B25]
Intersect(Range("B20:C30"), Target)" => True
Intersect(Range("B20:C30"), [B19]) => False
Cái thằng Interset không phải trả về kết quả TRUE, FALSE đâu nha ---> Chính xác nó là RangeTrích tạm bài của anh hoangdanh để bạn hiểu rõ
\
Intersect là một phương thức, dùng để xác định giao giữa 2 hay nhiều vùng cho trước, kết quả trả về là true or false.
Giả sử ô B25 đang được chọn. target ~ [B25]
Intersect(Range("B20:C30"), Target)" => True
Intersect(Range("B20:C30"), [B19]) => False
Hì hì, kyo sơ xuất quá, trích dẫn mà không đọc rõ, với lại cũng xài có chữ Is Nothing quen rồi nên cũng nhầm nữa. Cám ơn chú đã nhắc nhởCái thằng Interset không phải trả về kết quả TRUE, FALSE đâu nha ---> Chính xác nó là Range
Ví dụ ta có: Intersect(Range("A110"), Range("C5:F20")) sẽ = Range("C5
10"), tức là phần chung giữa Range("A1
10") và Range("C5:F20")
Các khái niệm về Intersect và . . . tôi chưa từng biết về cách dùng của chúng, xin thày Ndu và mọi người chỉ giúp hộ. Tối hôm nay tôi sẽ gắng học cái này.