khongaicanobody
Thành viên mới

- Tham gia
- 23/1/10
- Bài viết
- 38
- Được thích
- 5
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, j As Integer
Dim Kq(1 To 1000) As String
Application.ScreenUpdating = False
If Target.Address = "$E$12" Then
For i = 1 To Range("A65536").End(xlUp).Row
If InStr(1, Cells(i, 1).Value, Target.Value) Then
j = j + 1
Kq(j) = Cells(i, 1).Value
End If
Next i
Range("H9:H65536").ClearContents
For i = 1 To j
Cells(9 + i, 8).Value = Kq(i)
Next i
End If
Application.ScreenUpdating = True
End Sub
Bạn dùng code sau:Kính gửi các anh chị.
Mình có một danh sách về tên người. Mình muốn gõ một số chữ thì được một danh sách của các dòng có chứa tên của chữ đó (Xem file đính kèm). như vậy phải làm sao?
Rất mong được các anh chị hỗ trợ.
Cám ơn mọi người
Code của bác Hai lúa "hàn lâm" quá, em đọc chả hiểu gì cả!!Bạn dùng code sau:
[GPECODE=sql]Sub Loc_HLMT()
Dim adoConn As Object, adoRS As Object
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select f1 from [Sheet1$A4:A1000] " _
& "where f1 like '%" & Sheet1.Range("E12").Value & "'"
End With
With Sheet1
.[H8:H65000].ClearContents
.[H10].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing
End Sub
[/GPECODE]
Trường hợp lọc tên Ngọc nhưng trong vùng lọc có tên Trần Ngọc Thiên Kim thì code của bạn sẽ liệt kê cả tên này ra trong khi ta chỉ muốn lọc những người tên là Ngọc, gõ ngọc thì code cũng không nhận dạng được để lọc??? Mình đề xuất code thế này :Thử đoạn code này xem có được không bạn!
PHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Integer, j As Integer Dim Kq(1 To 1000) As String Application.ScreenUpdating = False If Target.Address = "$E$12" Then For i = 1 To Range("A65536").End(xlUp).Row If InStr(1, Cells(i, 1).Value, Target.Value) Then j = j + 1 Kq(j) = Cells(i, 1).Value End If Next i Range("H9:H65536").ClearContents For i = 1 To j Cells(9 + i, 8).Value = Kq(i) Next i End If Application.ScreenUpdating = True End Sub
Sub LocDK_Ten()
Dim Rng As Range, j As Long
Dim FrsAdd As String, Ten As String
Dim LastCell As Range, rngS As Range
With Sheet1
.Range("H10:H100").ClearContents
Ten = "* " & .[E12].Value
Set LastCell = .Cells(.Rows.Count, 1).End(xlUp)
Set rngS = .Range(.[A4], LastCell)
Set Rng = rngS.Find(What:=Ten, after:=LastCell, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
If Rng Is Nothing Then
MsgBox "Khong có gia tri tim kiem trong vung"
Else
FrsAdd = Rng.Address
j = 9
Do
j = j + 1
.Cells(j, 8) = Rng
Set Rng = rngS.FindNext(after:=Rng)
Loop Until FrsAdd = Rng.Address
End If
End With
End Sub
Sub LOC()
Dim data(), kq(1 To 1000, 1 To 1)
Dim i As Long, k As Long, dk As String
dk = UCase([a1])
data = Range([A4], [A65536].End(3)).Value
For i = 1 To UBound(data)
If data(i, 1) <> "" Then
If UCase(tachten(data(i, 1))) = dk Then
k = k + 1
kq(k, 1) = (data(i, 1))
End If
End If
Next
[C4:C1000].ClearContents
If k Then [C4].Resize(k) = kq
End Sub
Function tachten(ten As Variant)
With CreateObject("vbscript.regexp")
.Pattern = ".*\s"
tachten = .Replace(ten, "")
End With
End Function
xin Quang Hải giải thích 2 địa chỉ [IV2] và [IV3] . xin cám ơn !Góp vui code này. Mặc dù thấy ngắn thế nhưng hiệu quả lắm nha.
Code này cũng được xếp vô dạng tuyệt chiêu nghen
PHP:Sub LOC() [IV2] = [A3]: [IV3] = "*" & [A1] [A3:A1000].AdvancedFilter 2, [IV2:IV3], [C3] End Sub
xin Quang Hải giải thích 2 địa chỉ [IV2] và [IV3] . xin cám ơn !
cám ơn thày Hai lúa, té ra nó là cột cuối , em chả bao giờ thử đến đây, đúng là "Mũi cà mau" ivê , cứ tưởng số la mã nên thấy nó lạ hoắc .Đó là vùng phụ để làm điều kiện lọc ý mà.
Code của anh Quang Hải như sau :Anh quanghai1969 ơi, khi em muốn chuyển ô gõ chữ A1 sang 1 sheet khác, chẳng hạn như là sheet2 thì code phải làm thế nào?
Cám ơn anh.
dk = UCase([a1])
dk = UCase(sheet2.[a1])
Em sửa lại thế này thấy lọc được theo ý trên:Trường hợp lọc tên Ngọc nhưng trong vùng lọc có tên Trần Ngọc Thiên Kim thì code của bạn sẽ liệt kê cả tên này ra trong khi ta chỉ muốn lọc những người tên là Ngọc, gõ ngọc thì code cũng không nhận dạng được để lọc???
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, j As Integer
Dim Kq(1 To 1000) As String
Application.ScreenUpdating = False
If Target.Address = "$E$12" Then
For i = 1 To Range("A65536").End(xlUp).Row
If Cells(i, 1).Value <> "" Then
If LCase(Right(Cells(i, 1).Value, Len(Target.Value))) = LCase(Target.Value) And _
Mid(Cells(i, 1).Value, Len(Cells(i, 1).Value) - Len(Target.Value), 1) = Chr(32) Then
j = j + 1
Kq(j) = Cells(i, 1).Value
End If
End If
Next i
Range("H9:H65536").ClearContents
For i = 1 To j
Cells(9 + i, 8).Value = Kq(i)
Next i
End If
Application.ScreenUpdating = True
End Sub
Sub LOC()
Dim data(), kq(1 To 1000, 1 To 1)
Dim i As Long, k As Long, dk As String
dk = UCase([a1])
data = Range([A4], [A65536].End(3)).Value
For i = 1 To UBound(data)
If data(i, 1) <> "" Then
If UCase(data(i, 1)) Like "*" & dk Then
k = k + 1
kq(k, 1) = (data(i, 1))
End If
End If
Next
[C4:C1000].ClearContents
If k Then [C4].Resize(k) = kq
End Sub
Code tách tên này của anh Hải sẽ sai nếu có dấu cách phía sau họ tênThử dùng hàm hỗ trợ thử xem. Đây là lần đầu tiền dùng hàm ghép với Sub, mong được anh chị góp ý
PHP:Function tachten(ten As Variant) With CreateObject("vbscript.regexp") .Pattern = ".*\s" tachten = .Replace(ten, "") End With End Function
Code tách tên này của anh Hải sẽ sai nếu có dấu cách phía sau họ tên
Function tachten(ten As Variant)
With CreateObject("vbscript.regexp")
.Pattern = ".*\s"
tachten = .Replace([B][COLOR=#ff0000]Trim[/COLOR][/B](ten), "")
End With
End Function
Nếu không Trim thì anh thử Code sauThì ta dùng hàm Trim là được.
Mã:Function tachten(ten As Variant) With CreateObject("vbscript.regexp") .Pattern = ".*\s" tachten = .Replace([B][COLOR=#ff0000]Trim[/COLOR][/B](ten), "") End With End Function
Function tachten(ten As Variant)
With CreateObject("vbscript.regexp")
.Pattern = ".*\s|\s*$"
tachten = .Replace(Trim(ten), "")
End With
End Function
Nếu không Trim thì anh thử Code sauMã:Function tachten(ten As Variant) With CreateObject("vbscript.regexp") .Pattern = ".*\s|\s*$" tachten = .Replace([B][COLOR=#ff0000]Trim[/COLOR][/B](ten), "") End With End Function
Cái bài này sao giống cái bài anh Hải xài ở " Đố Vui VBA " vậy !
[GPECODE=vb]
Sub LOC()
[IV2] = [A3]: [IV3] = "'=* " & [A1]
[A3:A1000].AdvancedFilter 2, [IV2:IV3], [C3]
End Sub
[/GPECODE]
Vâng đúng là phải sửa anh ah. Voọc để biết thêm anh nhỉ?(Mấy cái này học có vẻ dễ hơn ADO anh Hai Lúa ah, nhìn anh viết ADO muốn nhưng chưa dám bước vào.)Vậy bạn test thử khi bỏ trim nhé. Hàm trên vẫn còn trim.
Function tachten(ten As Variant)
With CreateObject("vbscript.regexp")
.Pattern = "\w+\s*$"
tachten = .Execute(ten).Item(0).Value
End With
End Function