Kéo hàm Vlookup trong VBA như thế nào. (1 người xem)

  • Thread starter Thread starter phuyen89
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

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 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.
 

File đính kèm

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.
Em thử làm thế này xem:
Sub Formula()
Dim i As Byte
For i = 1 To 4
Range("H" & i + 4) = Application.WorksheetFunction.VLookup(Range("G" & i + 4), Range("$B$3:$C$7"), 2, 0)
Next i
End Sub
Vẫn còn cách nữa đó là dùng autofil
 
Upvote 0
Dù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.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
Em cứ thử xem nó có hiện không nào.

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 đó.


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


Làm bảng tính chậm quá
 
Lần chỉnh sửa cuối:
Upvote 0
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.
-----------------
Bài trên em có viết code như sau
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
Híc nó không chịu chạy!!! Em nhờ Thầy cô, anh chi fân tích chỗ SAI.
Em cảm ơn!
 
Upvote 0
-----------------
Bài trên em có viết code như sau
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
Híc nó không chịu chạy!!! Em nhờ Thầy cô, anh chi fân tích chỗ SAI.
Em cảm ơn!
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.
Vấn đề là ở điều kiện Target.Range("G5:G100"), anh chàng VBA hổng hiểu chỗ này nên phát sinh lỗi, vậy là ảnh nhảy tới ExitSub luôn.
Bạn sửa lại điều kiện này thành Not Intersect(Target, Range("G5:G100")) Is Nothing là được.

Cũng có thể cải tiến code này một chút để phòng trường hợp tìm không ra giá trị thích hợp (Ví dụ: Lúc trước nhập G5="a", sẽ có kết quả H5=3, nhưng sau đó lại nhập lại G5="e", lúc này sẽ không tìm thấy giá trị trong bảng dò, nhưng số 3 lúc trước vẫn không bị xóa đi):
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCel As Range, rFind As Range
If Not Intersect(Target, [G5:G100]) Is Nothing Then
For Each rCel In Intersect(Target, [G5:G100])
rCel.Offset(, 1).ClearContents
Set rFind = Range([B4], [B65536].End(xlUp)).Find(rCel.Value, , xlValues, xlWhole)
If Not rFind Is Nothing Then rCel.Offset(, 1).Value = rFind.Offset(, 1).Value
Next
End If
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
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 đó.
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
Làm bảng tính chậm quá
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.
 
Upvote 0
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 đó.


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
Làm bảng tính chậm quá
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.
PHP:
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
 
Lần chỉnh sửa cuối:
Upvote 0
Các cách thì mọi người đã làm rồi giờ Thử dùng hàm tốc độ nhanh hơn Vlookup xem sao?
Function 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
Cái hàm này của Anh Ndu nhé.hi
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom