phuyen89
Thành viên tích cực


- Tham gia
- 20/11/08
- Bài viết
- 875
- Được thích
- 341
- Nghề nghiệp
- Student
Em thử làm thế này xem:Em mới biết dùng hàm Vlookup trong VBA nhưng em chưa biết cách Fill xuống những dòng dưới.
Mong anh chị hướng dấn giùm.
Em có ghi macro nhưng làm chưa được.
Nếu mà dân dã A lại dùng cách này cơ,hihiDùng autofil đi anh, cho nó dân giả hơn với thao tác bình thường.
Chẳng lẻ cái này lại dùng vòng lặp na.
Sub Macro1()
With Sheet1.Range("H5:H8")
.Value = "=VLOOKUP(RC[-1],R4C2:R7C3,2,0)"
.Value = .Value
End With
End Sub
Em cứ thử xem nó có hiện không nào.Anh khoa, cách này thì cái hàm Vlookup nó hiện lên trên bảng tính rồi.Em muốn gõ mã là hàm Vlookup nó âm thầm thực hiện ah. Tức người dùng không biết. Do em thích hàm Vlookup nó được ẩn đi nên mới dùng như trên đó anh.
Em cứ thử xem nó có hiện không nào.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("G5:H10"), Target) Is Nothing Then
With Sheet1.Range("H5:H100")
.Value = "=VLOOKUP(RC[-1],R4C2:R7C3,2,0)"
Range("H5").AutoFill Destination:=Range("H5:H100")
End With
End If
End Sub
-----------------Em mới biết dùng hàm Vlookup trong VBA nhưng em chưa biết cách Fill xuống những dòng dưới.
Mong anh chị hướng dấn giùm.
Em có ghi macro nhưng làm chưa được.
Private Sub Worksheet_Change(ByVal Target As Range) Dim rCel As Range, rngData As Range, rFind As Range
On Error GoTo ExitSub
If Target.Range("G5:G100") Then
Set rngData = Sheet1.Range("B4").CurrentRegion
For Each rCel In Intersect(Target, Range("G5:G100"))
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
Trong code này, bạn bỏ câu lệnh On Error GoTo ExitSub là sẽ phát hiện ra ngay chỗ sai.-----------------
Bài trên em có viết code như sau
Híc nó không chịu chạy!!! Em nhờ Thầy cô, anh chi fân tích chỗ SAI.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.Range("G5:G100") Then Set rngData = Sheet1.Range("B4").CurrentRegion For Each rCel In Intersect(Target, Range("G5:G100")) 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
Em cảm ơn!
Với bài toán này thì sử dụng phương thức Find và gán giá trị như cách của Hong.Van sẽ hợp lý hơn dùng VLOOKUP. Hơn nữa, đã dùng VBA can thiệp thì chẳng có lý do gì mà mình lại để công thức trên sheet cả, vì chính việc này sẽ làm bảng tính xử lý chậm chạp. Hãy tưởng tượng: Nếu code gán giá trị thì chỉ khi nào mình thao tác trên vùng G5:G100 thì code mới chạy, nghĩa là mới có sự thay đổi trong vùng H5:H100, còn trong trường hợp bạn gán công thức cho vùng H5:H100 thì cho dù bạn thay đổi giá trị của bất kỳ ô nào trên sheet, thậm chí là trên Workbook thì kết quả của VLOOKUP đều cần phải tính toán lại, do đó bảng tính sẽ chậm chạp hơn.Em muốn nó cập nhật khi thay đỗi mã hàng, em đưa vào sự kiện change thì bấm vào đâu nó cũng cập nhật hết.Giống như lúc nào nó cũng chạy hết vậy đó.
Làm bảng tính chậm quáPHP:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Range("G5:H10"), Target) Is Nothing Then With Sheet1.Range("H5:H100") .Value = "=VLOOKUP(RC[-1],R4C2:R7C3,2,0)" Range("H5").AutoFill Destination:=Range("H5:H100") End With End If End Sub
Thử kiểu bình dân này xem sao. Cách này thì chỉ ép phê tại dòng nào bạn thay đổi dữ liệu thôi chắc sẽ nhanh hơn ít nhiều.Em muốn nó cập nhật khi thay đỗi mã hàng, em đưa vào sự kiện change thì bấm vào đâu nó cũng cập nhật hết.Giống như lúc nào nó cũng chạy hết vậy đó.
Làm bảng tính chậm quáPHP:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Range("G5:H10"), Target) Is Nothing Then With Sheet1.Range("H5:H100") .Value = "=VLOOKUP(RC[-1],R4C2:R7C3,2,0)" Range("H5").AutoFill Destination:=Range("H5:H100") End With End If End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tim As Range
If Target.Column = 7 Then
If Target.Row > 3 Then
Set tim = [B:B].Find(Target, , , 1, , , 0)
If Not tim Is Nothing Then Target.Offset(, 1) = tim.Offset(, 1)
End If
End If
End Sub
Cái hàm này của Anh Ndu nhé.hiFunction MVlookUp(fRng As Range, sRng As Range, Col As Long)
Dim Sh As Worksheet, tmpRng As Range
MVlookUp = CVErr(xlErrNA)
For Each Sh In ActiveWorkbook.Worksheets
Set tmpRng = Sh.Range(sRng.Address).Resize(, 1).Find(fRng, , xlValues, xlWhole)
If Not tmpRng Is Nothing Then
MVlookUp = tmpRng(, Col)
Exit Function
End If
Next
End Function