Thủ như thế này xemTôi có code này, làm mãi không được. Tôi đưa lên đây để nhờ các AC xem và sửa dùm cho đúng!
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$1" Then
Application.ScreenUpdating = False
With S1.Range(S1.[A1], S1.[a10000].End(3)).Resize(, 2)
.AutoFilter 1, S2.[E1] & "*"
.Offset(1, 0).Resize(, 2).SpecialCells(12).Copy S2.[A4]
.AutoFilter
End With
End If
End Sub
Sai cả 1 "rổ" luônTôi có code này, làm mãi không được. Tôi đưa lên đây để nhờ các AC xem và sửa dùm cho đúng!
With S1.Range(S1.[A1], [COLOR=red][B]S1.[10000][/B][/COLOR].End(3)).Resize(, 2)
.AutoFilter 1, Left(S1.[A2:A10000], 2) = S2.[E1]
.AutoFilter 1, Target.Value & "*"
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ExitSub
If Target.Address = "$E$1" Then
Range("A3:B10000").Clear
With S1.Range(S1.[A1], S1.[A10000].End(xlUp)).Resize(, 2)
.AutoFilter 1, Target.Value & "*"
.SpecialCells(12).Copy S2.[A3]
.AutoFilter
End With
End If
ExitSub:
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then
Range("A3:B10000").Clear
S1.Range("A1").CurrentRegion.AdvancedFilter 2, [E1:E2], [A3]
End If
End Sub
Chỉ bạn dùng Advanced Filter cho bài này, code sẽ gọn hơn
Đầu tiên bố trí lại dữ liệu, chọn Validaiton xuống cell E2, còn cell E1 gõ chữ "Mã hàng"
View attachment 60451
Code rút gọn thành vầy:
-----------------------------PHP:Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$E$2" Then Range("A3:B10000").Clear S1.Range("A1").CurrentRegion.AdvancedFilter 2, [E1:E2], [A3] End If End Sub
Nói thêm: Với dữ liệu cở vài chục ngàn dòng, nếu bạn dùng AutoFilter để lọc, sau đó dùng SpecialCells thì chắc chắn có lúc code bị lỗi (SpecialCells bị quá tải)... Dùng Advanced Filter lại không gặp hiện tượng này vì nó copy trực tiếp luôn
Rất tuyệt vời em cảm ơn bác, bác có thể nâng cấp tiếp được không, em thấy có 2 vấn đề:
Ở code lọc này chỉ lọc các chữ cái tính từ trái sang phải, nhưng có thể lọc cho dù chữ cái đó ở bất kỳ vị trí nào trong mã không anh. ví dụ có 2 mã Hung, Hang cùng có chữ n khi em đánh chữ n thì nó lấy cả 2 vì cùng có chữ n ở vị trí bất kỳ. Tiếp đến nếu mã mà là số thì cái này không chạy
Chân thành cảm ơn anh
Mọi người giúp viết dùm code lọc dữ liệu này với xin cảm ơn
Cột TT tự động tính.
Bạn xem file này xem đúng ý bạn không nhé.
Bạn thêm vào cuối codeCode của bạn làm gần đúng ý mình, nếu trường hợp như file mình bạn xem cái đường viền ở giữa cột BC, cột KL, MN mình muốn không tô viền thì làm bằng cách nào
Public Sub LOC_GPE()
Application.ScreenUpdating = False
Dim sArr(), dArr(), tArr(), I As Long, J As Long, K As Long, DK As String
With Sheets("DATA")
sArr = .Range(.[B7], .[B65536].End(xlUp)).Resize(, 61).Value2
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 15)
With Sheets("LOC")
tArr = .[A5:O5].Value2
DK = .[J1].Value2
For I = 1 To UBound(sArr, 1)
If sArr(I, 50) = DK Then
K = K + 1: dArr(K, 1) = K
For J = 2 To 15
dArr(K, J) = sArr(I, tArr(1, J))
Next J
End If
Next I
With .[A7].Resize(1000, 15)
.ClearContents
.Borders.LineStyle = xlNone
End With
If K Then
With .[A7].Resize(K, 15)
.Value = dArr
.Borders.LineStyle = xlContinuous
End With
With Union(.[B7].Resize(K, 2), .[K7].Resize(K, 2))
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With
With .[M7].Resize(K, 2)
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With
End If
End With
Application.ScreenUpdating = True
End Sub
Sửa lại code trên chút xíu sẽ được
Mã:Public Sub LOC_GPE() Application.ScreenUpdating = False Dim sArr(), dArr(), tArr(), I As Long, J As Long, K As Long, DK As String With Sheets("DATA") sArr = .Range(.[B7], .[B65536].End(xlUp)).Resize(, 61).Value2 End With ReDim dArr(1 To UBound(sArr, 1), 1 To 15) With Sheets("LOC") tArr = .[A5:O5].Value2 DK = .[J1].Value2 For I = 1 To UBound(sArr, 1) If sArr(I, 50) = DK Then K = K + 1: dArr(K, 1) = K For J = 2 To 15 dArr(K, J) = sArr(I, tArr(1, J)) Next J End If Next I With .[A7].Resize(1000, 15) .ClearContents .Borders.LineStyle = xlNone End With If K Then With .[A7].Resize(K, 15) .Value = dArr .Borders.LineStyle = xlContinuous End With With Union(.[B7].Resize(K, 2), .[K7].Resize(K, 2)) .Borders(xlDiagonalDown).LineStyle = xlNone .Borders(xlDiagonalUp).LineStyle = xlNone .Borders(xlInsideVertical).LineStyle = xlNone .Borders(xlInsideHorizontal).LineStyle = xlNone End With With .[M7].Resize(K, 2) .Borders(xlInsideVertical).LineStyle = xlNone .Borders(xlInsideHorizontal).LineStyle = xlNone End With End If End With Application.ScreenUpdating = True End Sub
Vậy thì lấy code này:CODE này chưa đúng lắm bạn xem giúp khung viền giống như trong file mình gửi kèm cảm ơn
Public Sub LOC_GPE()
Application.ScreenUpdating = False
Dim sArr(), dArr(), tArr(), I As Long, J As Long, K As Long, DK As String
With Sheets("DATA")
sArr = .Range(.[B7], .[B65536].End(xlUp)).Resize(, 61).Value2
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 15)
With Sheets("LOC")
tArr = .[A5:O5].Value2
DK = .[J1].Value2
For I = 1 To UBound(sArr, 1)
If sArr(I, 50) = DK Then
K = K + 1: dArr(K, 1) = K
For J = 2 To 15
dArr(K, J) = sArr(I, tArr(1, J))
Next J
End If
Next I
.[A7].Resize(1000, 15).ClearContents
.[A7].Resize(1000, 15).Borders.LineStyle = xlNone
If K Then
With .[A7].Resize(K, 15)
.Value = dArr
.Borders.LineStyle = xlContinuous
.Borders(xlInsideHorizontal).Weight = xlHairline
End With
.[B7].Resize(K, 2).Borders(xlInsideVertical).LineStyle = xlNone
.[K7].Resize(K, 2).Borders(xlInsideVertical).LineStyle = xlNone
.[M7].Resize(K, 2).Borders(xlInsideVertical).LineStyle = xlNone
End If
End With
Application.ScreenUpdating = True
End Sub