http://www.giaiphapexcel.com/forum/showthread.php?45597-Nhập-xuất-tồn-kho-(2-kho)Em có 1 ví dụ nhỏ thế này, nhờ AC thiết lập cho em code để nó lọc dư liệu sau khi thoả mãn 3 điều kiện.
Cám ơn AC nhiều!
http://www.giaiphapexcel.com/forum/showthread.php?45597-Nhập-xuất-tồn-kho-(2-kho)
Em xem qua bài này cũng tương tự và edit lại.
Anh ơi, anh sửa lại dùm em nhé! Em không hiểu phân Array lắm!
Dim endR As Long, iR As Long, iC As Long, s As Long
Dim fDate As Date, eDate As Date
Dim Arr(), ArrKq()
Dim sMaHH As String
Sub TaoBaoCao()
With Sheets("Sheet2")
.Range("A6:D100").ClearContents
fDate = .[B2]: eDate = .[D2]
sMaHH = .[B3]
End With
With Sheets("Sheet1")
endR = .Cells(65000, 1).End(xlUp).Row
Arr = .Range("A3:F" & endR).Value
End With
s = 0
ReDim ArrKq(1 To endR, 1 To 4)
For iR = 1 To UBound(Arr)
If Arr(iR, 2) = sMaHH Then
If CVDate(Arr(iR, 1)) <= eDate Then
If CVDate(Arr(iR, 1)) >= fDate Then
s = s + 1
For iC = 1 To 4
ArrKq(s, iC) = Arr(iR, iC + 2)
Next iC
End If
End If
End If
Next iR
If s > 0 Then
With Sheets("Sheet2")
.[A6].Resize(s, 4).Value = ArrKq
End With
End If
Erase ArrKq, Arr
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$3" Then
TaoBaoCao
End If
End Sub
Bạn có thể làm theo cách đơn giản sau:Anh ơi, anh sửa lại dùm em nhé! Em không hiểu phân Array lắm!
Nếu không nuốt nổi "thằng" mảng thì xơi tạm "em" này thử xem:Anh ơi, anh sửa lại dùm em nhé! Em không hiểu phân Array lắm!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Vung As Range, dK As Range
Set Vung = Sheets("sheet1").[a2].CurrentRegion
Set dK = Union([B2], [D2])
If Target.Address = "$B$3" Then
If Target.Value <> "" And Application.WorksheetFunction.CountA(dK) < 2 Then
MsgBox "Không nhap ngày vào thì loc bang gì ha TROI ???"
Else
[A5].CurrentRegion.Clear
With Vung
.AutoFilter Field:=1, Criteria1:=">=" & [B2].Value, Operator:=xlAnd, Criteria2:="<=" & [D2].Value
.AutoFilter Field:=2, Criteria1:=[b3].Value
.SpecialCells(12).Copy [A5]
.AutoFilter
End With
End If
End If
End Sub
Cái dòngNếu không nuốt nổi "thằng" mảng thì xơi tạm "em" này thử xem:
Right Click sheet2 ==> View Code ==> chép cái này vào
ThânMã:Private Sub Worksheet_Change(ByVal Target As Range) Dim Vung As Range, dK As Range Set Vung = Sheets("sheet1").[a2].CurrentRegion Set dK = Union([B2], [D2]) If Target.Address = "$B$3" Then If Target.Value <> "" And Application.WorksheetFunction.CountA(dK) < 2 Then MsgBox "Không nhap ngày vào thì loc bang gì ha TROI ???" Else [A5].CurrentRegion.Clear With Vung .AutoFilter Field:=1, Criteria1:=">=" & [B2].Value, Operator:=xlAnd, Criteria2:="<=" & [D2].Value .AutoFilter Field:=2, Criteria1:=[b3].Value .SpecialCells(12).Copy [A5] .AutoFilter End With End If End If End Sub
AutoFilter Field:=1, Criteria1:=">=" & [B2].Value, Operator:=xlAnd, Criteria2:="<=" & [D2].Value
.AutoFilter 1, ">=" & Clng([B2].Value), 1, "<=" & Clng([D2].Value)
---Nếu không nuốt nổi "thằng" mảng thì xơi tạm "em" này thử xem:
Right Click sheet2 ==> View Code ==> chép cái này vào
ThânMã:Private Sub Worksheet_Change(ByVal Target As Range) Dim Vung As Range, dK As Range Set Vung = Sheets("sheet1").[a2].CurrentRegion Set dK = Union([B2], [D2]) If Target.Address = "$B$3" Then If Target.Value <> "" And Application.WorksheetFunction.CountA(dK) < 2 Then MsgBox "Không nhap ngày vào thì loc bang gì ha TROI ???" Else [A5].CurrentRegion.Clear With Vung .AutoFilter Field:=1, Criteria1:=">=" & [B2].Value, Operator:=xlAnd, Criteria2:="<=" & [D2].Value .AutoFilter Field:=2, Criteria1:=[b3].Value .SpecialCells(12).Copy [A5] .AutoFilter End With End If End If End Sub
Anh sửa thành vầy xem:---
Theo hướng dẩn của anh, em đã "xơi" tạm "em" này nhưng mà không hiểu lỗi chổ nào nhờ anh xem và hướng dẩn giúp. Cám ơn
*Test code của anh concogia nên chưa xem bài NDU
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$B$3" Then
Range("A5:F10000").Clear
With Sheets("sheet1").Range("A2").CurrentRegion
.AutoFilter 1, ">=" & CLng(Range("B2").Value), 1, "<=" & CLng(Range("D2").Value)
.AutoFilter 2, Range("B3").Value
.SpecialCells(12).Copy Range("A5")
.AutoFilter
End With
End If
End Sub
Vấn đề nằm ở chổ: Trên máy anh code chạy được còn máy người khác thì thua ---> AutoFilter với điều kiện ngày tháng phải hết sức cần thận, không đơn giản anh viết Criteria1:=">=" & [B2].Value là máy nó hiểu đâuHihi, bạn nhập ngày giống như dữ liệu bên sheet1 là ...."xơi tuốt tuồn tuột"
Thân
Có thể nói cụ thể được không hả chú ? vàCái dòngsẽ không bao giờ chạy được trong đa số trường hợpMã:AutoFilter Field:=1, Criteria1:=">=" & [B2].Value, Operator:=xlAnd, Criteria2:="<=" & [D2].Value
.AutoFilter 1, ">=" & Clng([B2].Value), 1, "<=" & Clng([D2].Value)
---Hihi, bạn nhập ngày giống như dữ liệu bên sheet1 là ...."xơi tuốt tuồn tuột"
Thân
Có thể nói cụ thể được không hả chú ? và
Có chăng phải sửa thành vầy:
Clng: chổ này là sao hả chú?Mã:.AutoFilter 1, ">=" & Clng([B2].Value), 1, "<=" & Clng([D2].Value)
Cám ơn
Anh sửa thành vầy xem:
------------------------PHP:Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address = "$B$3" Then Range("A5:F10000").Clear With Sheets("sheet1").Range("A2").CurrentRegion .AutoFilter 1, ">=" & CLng(Range("B2").Value), 1, "<=" & CLng(Range("D2").Value) .AutoFilter 2, Range("B3").Value .SpecialCells(12).Copy Range("A5") .AutoFilter End With End If End Sub
Vấn đề nằm ở chổ: Trên máy anh code chạy được còn máy người khác thì thua ---> AutoFilter với điều kiện ngày tháng phải hết sức cần thận, không đơn giản anh viết Criteria1:=">=" & [B2].Value là máy nó hiểu đâu
(cái vụ này đã đề cập trên diễn đàn lâu rồi mà)
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$B$3" Then
Range("A5:D10000").Clear
With S1.Range([A2], [A65535].End(3))
.AutoFilter 1, ">=" & CLng(Range("B2").Value), 1, "<=" & CLng(Range("D2").Value)
.AutoFilter 2, Range("B3").Value
.Offset(1, 2).Resize(, 4).SpecialCells(12).Copy Range("A6")
.AutoFilter
End With
End If
End Sub
Sai chổ này:Em làm thế này sao vẫn chưa được? Anh xem thêm dùm em chút nha!
PHP:Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address = "$B$3" Then Range("A5:D10000").Clear With S1.Range([A2], [A65535].End(3)) .AutoFilter 1, ">=" & CLng(Range("B2").Value), 1, "<=" & CLng(Range("D2").Value) .AutoFilter 2, Range("B3").Value .Offset(1, 2).Resize(, 4).SpecialCells(12).Copy Range("A6") .AutoFilter End With End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$B$3" Then
Range("A5:D10000").Clear
With S1.Range(S1.[A2], S1.[A65535].End(3)).Resize(, 6)
.AutoFilter 1, ">=" & CLng(Range("B2").Value), 1, "<=" & CLng(Range("D2").Value)
.AutoFilter 2, Range("B3").Value
.Offset(, 2).Resize(, 4).SpecialCells(12).Copy Range("A6")
.AutoFilter
End With
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Target.Address = "$B$3" Then
Range("A6:E65535").Clear
With S1.Range(S1.[A2], S1.[A65535].End(3)).Resize(, 6)
.AutoFilter 1, ">=" & CLng(Range("B2").Value), 1, "<=" & CLng(Range("D2").Value)
.AutoFilter 2, Range("B3").Value
.Offset(1, 2).Resize(, 4).SpecialCells(12).Copy Range("B6")
.AutoFilter
End With
With S2.Range("A5").CurrentRegion
If .Rows.Count > 1 Then
.Resize(, 1).SpecialCells(4).Value = Evaluate("row(R:R)")
End If
End With
End If
End Sub
Clng([B2].Value)để biến giá tri cell B2 thành biến Long thôi mà anh
Nói chung anh cứ nhớ thuộc lòng như vầy: Khi dùng code AutoFilter với điều kiện ngày tháng thì anh BUỘC PHẢI biến điều kiện thành biến Long trước (dùng CLng như em đã làm ở trên) ---> Chắc bắp máy nào cũng chạy
Ẹc... Ẹc...
Clng([B2].Value)để biến giá tri cell B2 thành biến Long thôi mà anh
Nói chung anh cứ nhớ thuộc lòng như vầy: Khi dùng code AutoFilter với điều kiện ngày tháng thì anh BUỘC PHẢI biến điều kiện thành biến Long trước (dùng CLng như em đã làm ở trên) ---> Chắc bắp máy nào cũng chạy
Ẹc... Ẹc...
[B]Value2[/B] Returns or sets the cell value. Read/write [B]Variant[/B]. [B]Syntax[/B]
[B][I]expression[/I].Value2[/B]
[I]expression[/I] A variable that represents a [B]Range[/B] object.
[B]Remarks[/B]
The only difference between this property and the [B]Value[/B] property is that the [B]Value2[/B] property [COLOR=red]doesn’t use the [B]Currency[/B] and [B]Date[/B] data types[/COLOR]
Cái thằng Value2 này em xài từ ngày mới vào diễn đàn, vậy mà bây giờ sư phụ nhắc lại thì mới thấy rằng mình.. đã quên tuốtCó thể dùng Value2 thay vì Value, cũng xơi tuốt tuột
NHDK đã viết:Anh ơi, anh nói rõ hơn chút nữa "CLng" nhé! Em không hiểu rõ chỗ này!?
ndu đã viết:Clng([B2].Value)để biến giá tri cell B2 thành biến Long thôi mà anh
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Target.Address = "$C$4" Then
Range("A7:E65000").ClearContents
With S1.Range(S1.[A1], S1.[A65535].End(3)).Resize(, 7)
.AutoFilter 2, ">=" & CLng(Range("C2").Value), 1, "<=" & CLng(Range("C3").Value)
.AutoFilter 3, Range("C4").Value
'2 dong sau co the viet thanh mot?
.Resize(, 1).Offset(1, 0).SpecialCells(12).Copy Range("A7")
.Offset(1, 3).Resize(, 4).SpecialCells(12).Copy Range("B7")
.AutoFilter
End With
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Target.Address = "$C$4" Then
[COLOR=red]If S1.Range(S1.[c1], S1.[c65535].End(3)).Find(Target) = 0 Then _
MsgBox "hong co ma nay cha noi oi!": Exit Sub[/COLOR]
Range("A7:E65000").ClearContents
With S1.Range(S1.[A1], S1.[A65535].End(3)).Resize(, 7)
.AutoFilter 2, ">=" & CLng(Range("C2").Value), 1, "<=" & CLng(Range("C3").Value)
.AutoFilter 3, Range("C4").Value
.Resize(, 1).Offset(1, 0).SpecialCells(12).Copy Range("A7")
.Offset(1, 3).Resize(, 4).SpecialCells(12).Copy Range("B7")
.AutoFilter
End With
End If
End Sub
Câu bẫy lỗi thêm vào như sau:
Mã:Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False On Error Resume Next If Target.Address = "$C$4" Then [COLOR=red]If S1.Range(S1.[c1], S1.[c65535].End(3)).Find(Target) = 0 Then _ MsgBox "hong co ma nay cha noi oi!": Exit Sub[/COLOR] Range("A7:E65000").ClearContents With S1.Range(S1.[A1], S1.[A65535].End(3)).Resize(, 7) .AutoFilter 2, ">=" & CLng(Range("C2").Value), 1, "<=" & CLng(Range("C3").Value) .AutoFilter 3, Range("C4").Value .Resize(, 1).Offset(1, 0).SpecialCells(12).Copy Range("A7") .Offset(1, 3).Resize(, 4).SpecialCells(12).Copy Range("B7") .AutoFilter End With End If End Sub
.Resize(, 1).Offset(1, 0).SpecialCells(12).Copy Range("A7")
.Offset(1, 3).Resize(, 4).SpecialCells(12).Copy Range("B7")
Được thì vẫn được, dùng Union, nhưng không đáng công.Sư phụ ơi, 2 dòng này có thế viết gộp lại:
được không ah?PHP:.Resize(, 1).Offset(1, 0).SpecialCells(12).Copy Range("A7") .Offset(1, 3).Resize(, 4).SpecialCells(12).Copy Range("B7")
Union(.Resize(, 1).Offset(1, 0).SpecialCells(12), .Offset(1, 3).Resize(, 4).SpecialCells(12)).Copy Range("A7")
Hổng biết đặt thằng SpecialCells(12) ra ngoài làm "thừa số chung" được không ta???Được thì vẫn được, dùng Union, nhưng không đáng công.
PHP:Union(.Resize(, 1).Offset(1, 0).SpecialCells(12), .Offset(1, 3).Resize(, 4).SpecialCells(12)).Copy Range("A7")
thử phát biết liền:Hổng biết đặt thằng SpecialCells(12) ra ngoài làm "thừa số chung" được không ta???
Union(.Resize(, 1).Offset(1, 0), .Offset(1, 3).Resize(, 4)).SpecialCells(12).Copy Range("A7")
Thấy tác giả topic này tiếp thu tốt và chắc chắn là VBA cũng năm khá. Vậy sao kg hướng theo array, thú thật dùng for và array có khi còn dễ hiểu hơn.thử phát biết liền:
Kết quả: OKPHP:Union(.Resize(, 1).Offset(1, 0), .Offset(1, 3).Resize(, 4)).SpecialCells(12).Copy Range("A7")
Chỉ là tham khảo thôi mà ---> Ít ra với AutoFilter thì ta còn làm bằng tay được (chỉ viết lại cho ra vẽ tự động thôi)Thấy tác giả topic này tiếp thu tốt và chắc chắn là VBA cũng năm khá. Vậy sao kg hướng theo array, thú thật dùng for và array có khi còn dễ hiểu hơn.
Vậy mà 2 Thầy PTM và NDU cùng nhau làm theo hướng AutoFilter.
Vậy nhờ 2 Thầy PTM và NDU giúp em vấn đề em đang bí với. Chắc chắn là PTM và NDU sẽ có hướng.
Link sau. ConvertExToFox
http://www.giaiphapexcel.com/forum/showthread.php?44987-%C4%90%C6%B0a-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-excel-v%C3%A0o-fox!
Cám ơn nhé.
Hậu tạ 2 Thầy 1 cây Con mèo.
NDU chuyên nghiên cứu mà, nghiên cứu giúp mình với, chớ mình có biết gì về con cáo đâu, chỉ biết con cầy thôi. Vì có dùng PM bằng Fox mà phần nhập liệu mất công quá nên muốn tham gia để có thể nhập = Ex, thời gian dư để làm vài ve.Chỉ là tham khảo thôi mà ---> Ít ra với AutoFilter thì ta còn làm bằng tay được (chỉ viết lại cho ra vẽ tự động thôi)
Còn cái thăng ConvertExToFox thì... tiếc quá, có biết gì về "con cáo" đâu mà giúp (mất cha nó con mèo rồi)
Thấy tác giả topic này tiếp thu tốt và chắc chắn là VBA cũng năm khá. Vậy sao kg hướng theo array, thú thật dùng for và array có khi còn dễ hiểu hơn.
Vậy mà 2 Thầy PTM và NDU cùng nhau làm theo hướng AutoFilter.
Vậy nhờ 2 Thầy PTM và NDU giúp em vấn đề em đang bí với. Chắc chắn là PTM và NDU sẽ có hướng.
Link sau. ConvertExToFox
http://www.giaiphapexcel.com/forum/showthread.php?44987-Đưa-dữ-liệu-từ-excel-vào-fox!
Cám ơn nhé.
Hậu tạ 2 Thầy 1 cây Con mèo.
Mảng cũng như set range, range sao thì mảng vậy.Thực ra về mảng em vẫn kém lắm! Em biết mảng rất hay với dữ liệu nhiều! Em đang tìm hiểu. Nhở các AC chỉ thêm nữa.
Dim MyRng as range
Set MyRng=Range("A1:B10")
'Gồm 10 dòng và 2 cột'
For iR =1 to 10
For iC=1 to 2
'iF MyRng(iR,iC) ="..." then ...'
Next iC
Next iR
Cố gắng, dùng cơ bản vòng lặp sẽ dễ triển khai hơn, nó giống như hiểu sao làm vậy, duyệt qua từng dòng, nếu dòng nào có cột nào thỏa yêu cầu thì lấy.Dim MyArr
MyArr=Range("A1:B10")
'Gồm 10 dòng và 2 cột'
For iR =1 to 10
For iC=1 to 2
'iF MyArr(iR,iC) ="..." then ...'
Next iC
Next iR