thuongsykxps
Thành viên chính thức


- Tham gia
- 3/6/08
- Bài viết
- 67
- Được thích
- 20
Mình muốn tạo 1 hàm giống Vlookup để tra theo 1 bảng có sẵn. Sau khi tra mình có thể chỉnh sửa nội dung được, vì khi dùng Hlookup không thể chỉnh sửa nội dung được. Mong mọi người giúp đở. (file đính kèm)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCel As Range, rngData As Range, rFind As Range
On Error GoTo ExitSub
If Target.Column = 1 Then
Set rngData = Sheets("CSDL").Range("A1").CurrentRegion
For Each rCel In Intersect(Target, Range("A:A"))
Set rFind = rngData.Resize(, 1).Find(rCel.Value, , xlValues, xlWhole)
If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, 1).Value
Next
End If
ExitSub:
End Sub
Bạn cho hỏi, mình muốn chuyển nó sang Sub (để trong Module, khi nào cần mới bấm, kg sử dụng code trong Sheet ) thì sửa code ntn?Cho code dưới đây vào Sheet DT nhé:
Mã:Private Sub Worksheet_Change(ByVal Target As Range) Dim rCel As Range, rngData As Range, rFind As Range On Error GoTo ExitSub If Target.Column = 1 Then Set rngData = Sheets("CSDL").Range("A1").CurrentRegion For Each rCel In Intersect(Target, Range("A:A")) Set rFind = rngData.Resize(, 1).Find(rCel.Value, , xlValues, xlWhole) If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, 1).Value Next End If ExitSub: End Sub
Xin hỏi , bây giờ mình muốn dò ngược lại thì sửa code trên như thế nào?Cho code dưới đây vào Sheet DT nhé:
Mã:Private Sub Worksheet_Change(ByVal Target As Range) Dim rCel As Range, rngData As Range, rFind As Range On Error GoTo ExitSub If Target.Column = 1 Then Set rngData = Sheets("CSDL").Range("A1").CurrentRegion For Each rCel In Intersect(Target, Range("A:A")) Set rFind = rngData.Resize(, 1).Find(rCel.Value, , xlValues, xlWhole) If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, 1).Value Next End If ExitSub: End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCel As Range, rngData As Range, rFind As Range
On Error GoTo ExitSub
If Target.Column = 1 Then
Set rngData = Sheets("CSDL").Range("b1").CurrentRegion
For Each rCel In Intersect(Target, Range("A:A"))
Set rFind = rngData.Resize(, -1).Find(rCel.Value, , xlValues, xlWhole)
If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, -1).Value
Next
End If
ExitSub:
End Sub
Bạn cho hỏi, mình muốn chuyển nó sang Sub (để trong Module, khi nào cần mới bấm, kg sử dụng code trong Sheet ) thì sửa code ntn?
Xin cảm ơn!
Sub Main()
Dim wksSource As Worksheet, wksTarget As Worksheet
Dim rCel As Range, rngData As Range, rFind As Range, rTarget
On Error Resume Next
Set wksSource = ThisWorkbook.Worksheets("CSDL")
Set wksTarget = ThisWorkbook.Worksheets("DT")
wksTarget.Select
Set rTarget = Selection
Set rngData = wksSource.Range("A1").CurrentRegion
If TypeOf rTarget Is Range Then
For Each rCel In rTarget
Set rFind = rngData.Resize(, 1).Find(rCel.Value, , xlValues, xlWhole)
If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, 1).Value
Next
End If
End Sub
Sửa thành vầy:Xin hỏi , bây giờ mình muốn dò ngược lại thì sửa code trên như thế nào?
Thí dụ: Bên Sheet DT, ô A3, mình nhập CÔNG TÁC 4 Thì bên B2 sẽ hiện là MH4
Mình đã sửa code như sau
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCel As Range, rngData As Range, rFind As Range
On Error GoTo ExitSub
If Target.Column = 1 Then
Set rngData = Sheets("CSDL").Range("A1").CurrentRegion
For Each rCel In Intersect(Target, Range("A:A"))
Set rFind = rngData.[COLOR=#ff0000]Offset(, 1)[/COLOR].Resize(, 1).Find(rCel.Value, , xlValues, xlWhole)
If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset[COLOR=#ff0000](, -1)[/COLOR].Value
Next
End If
ExitSub:
End Sub
Code trên của bạn mình đã sửa để dò tìm ngược và có thêm điều kiện mới như:Sửa thành vầy:
Quét chọn vùng dữ liệu ở cột A của Sheet DT rồi bấm Alt + F8, chọn Main để chạy codeMã:Sub Main() Dim wksSource As Worksheet, wksTarget As Worksheet Dim rCel As Range, rngData As Range, rFind As Range, rTarget On Error Resume Next Set wksSource = ThisWorkbook.Worksheets("CSDL") Set wksTarget = ThisWorkbook.Worksheets("DT") wksTarget.Select Set rTarget = Selection Set rngData = wksSource.Range("A1").CurrentRegion If TypeOf rTarget Is Range Then For Each rCel In rTarget Set rFind = rngData.Resize(, 1).Find(rCel.Value, , xlValues, xlWhole) If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, 1).Value Next End If End Sub
----------------------------------------
Sub VLOOKUP_2() Dim wksSource As Worksheet, wksTarget As Worksheet
Dim rCel As Range, rngData As Range, rFind As Range, rTarget
On Error Resume Next
Set wksSource = ThisWorkbook.Worksheets("CSDL")
Set wksTarget = ThisWorkbook.Worksheets("DT")
wksTarget.Select
Set rTarget = Range("A1:A100")
Set rngData = wksSource.Range("A1").CurrentRegion
If TypeOf rTarget Is Range Then
For Each rCel In rTarget
Set rFind = rngData.Offset(, 1).Resize(, 1).Find(rCel.Value, , xlValues, xlWhole)
If rTarget = "" Then rCel.Offset(, 1).Value = ""
If Not rFind Is Nothing Then
rCel.Offset(, 1).Value = rFind.Offset(, -1).Value
Else
rCel.Offset(, 1).Value = "CHUA CO TEN"
End If
Next
End If
End Sub
Code trên của bạn mình đã sửa để dò tìm ngược và có thêm điều kiện mới như:
1/ Nếu rTarget là trống thì ô kế bên sẽ trống
2/ Nếu rTarget khác trống nhưng tìm không có thì báo "CHUA CO TEN"
Nhưng code của mình sửa xong thì các ô trống bị báo là "CHUA CO TEN"
Mong các bạn giúp mình, xin cảm ơn!
Mã:Sub VLOOKUP_2() Dim wksSource As Worksheet, wksTarget As Worksheet Dim rCel As Range, rngData As Range, rFind As Range, rTarget On Error Resume Next Set wksSource = ThisWorkbook.Worksheets("CSDL") Set wksTarget = ThisWorkbook.Worksheets("DT") wksTarget.Select Set rTarget = Range("A1:A100") Set rngData = wksSource.Range("A1").CurrentRegion For Each rCel In rTarget Set rFind = rngData.Offset(, 1).Resize(, 1).Find(rCel.Value, , xlValues, xlWhole) If [COLOR=#ff0000]rTarget[/COLOR] = "" Then rCel.Offset(, 1).Value = "" If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, -1).Value Else rCel.Offset(, 1).Value = "CHUA CO TEN" End If Next End If End Sub
Sub VLOOKUP_2()
Dim wksSource As Worksheet, wksTarget As Worksheet
Dim rCel As Range, rngData As Range, rFind As Range, rTarget
On Error Resume Next
Set wksSource = ThisWorkbook.Worksheets("CSDL")
Set wksTarget = ThisWorkbook.Worksheets("DT")
Set rTarget = wksTarget.Range("A1:A100")
Set rngData = wksSource.Range("A1").CurrentRegion
For Each rCel In rTarget
If rCel.Value = "" Then
rCel.Offset(, 1).Value = ""
Else
Set rFind = rngData.Offset(, 1).Resize(, 1).Find(rCel.Value, , xlValues, xlWhole)
If Not rFind Is Nothing Then
rCel.Offset(, 1).Value = rFind.Offset(, -1).Value
Else
rCel.Offset(, 1).Value = "CHUA CO TEN"
End If
End If
Next
End Sub
Sub VLOOKUP_3()
Dim wksSource As Worksheet, wksTarget As Worksheet
Dim rngData As Range, rFind As Range
Dim Item, tmp As String, aTarget
Dim lR As Long
On Error Resume Next
Set wksSource = ThisWorkbook.Worksheets("CSDL")
Set wksTarget = ThisWorkbook.Worksheets("DT")
Set rngData = wksSource.Range("A1").CurrentRegion
With wksTarget.Range("A1:A100")
aTarget = .Value
For lR = 1 To UBound(aTarget, 1)
tmp = CStr(aTarget(lR, 1))
If Len(tmp) Then
Set rFind = rngData.Offset(, 1).Resize(, 1).Find(tmp, , xlValues, xlWhole)
If Not rFind Is Nothing Then
aTarget(lR, 1) = rFind.Offset(, -1).Value
Else
aTarget(lR, 1) = "CHUA CO TEN"
End If
End If
Next
.Offset(, 1).Value = aTarget
End With
End Sub