Thay Code cho hàm Vlookup() (2 người xem)

Liên hệ QC

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

0905744404

Thành viên thường trực
Tham gia
26/10/10
Bài viết
333
Được thích
107
Nghề nghiệp
Trước là : Thủ Kho - còn giờ thì :"Tài Xế"
Em nhờ mọi cả nhà giúp em viết code chuyển từ hàm Vlookup() sang Code VBA
 
Em nhờ mọi cả nhà giúp em viết code chuyển từ hàm Vlookup() sang Code VBA
Nếu dùng VBA để thay thế một hàm của Excel, xin bạn hãy quên thói quen này đi, bởi hàm trong Excel tôi tin rằng nó đã rất tối ưu, bạn viết không thể chạy nhanh bằng hàm của anh Bill đâu!
 
Upvote 0
Em nhờ mọi cả nhà giúp em viết code chuyển từ hàm Vlookup() sang Code VBA
Nếu đưa hàm vlookup vào trong code thì còn được chứ đi viết lại 1 hàm giống vlookup là điều không tưởng. Bởi vì vlookup là do cả 1 tập thể những lập trình viên kiệt xuất tạo ra. Còn chúng ta...
 
Upvote 0
Nếu đưa hàm vlookup vào trong code thì còn được chứ đi viết lại 1 hàm giống vlookup là điều không tưởng. Bởi vì vlookup là do cả 1 tập thể những lập trình viên kiệt xuất tạo ra. Còn chúng ta...
Mình đã nhầm: Nhờ bạn giúp mình cách đưa hàm Vlookup vào trong code với
 
Upvote 0
Mình đã nhầm: Nhờ bạn giúp mình cách đưa hàm Vlookup vào trong code với
Có 2 dạng đưa vào code:

1) Dạng chuyển công thức từ code vào sheet, tức sau khi chạy code thì tại một ô nào đó chứa công thức.

2) Thực hiện trực tiếp công thức trên code, khi gán giá trị xuống sheet, thì chỉ là kết quả được tính toán.

Vậy bạn muốn phương thức nào?
 
Upvote 0
Có 2 dạng đưa vào code:

1) Dạng chuyển công thức từ code vào sheet, tức sau khi chạy code thì tại một ô nào đó chứa công thức.

2) Thực hiện trực tiếp công thức trên code, khi gán giá trị xuống sheet, thì chỉ là kết quả được tính toán.

Vậy bạn muốn phương thức nào?
Em muốn thực hiện phương pháp thứ 2 tức:"Thực hiện trực tiếp công thức trên code, khi gán giá trị xuống sheet, thì chỉ là kết quả được tính toán."
 
Upvote 0
Em muốn thực hiện phương pháp thứ 2 tức:"Thực hiện trực tiếp công thức trên code, khi gán giá trị xuống sheet, thì chỉ là kết quả được tính toán."
Bạn dùng đoạn code Application.WorksheetFunction.Vlookup(...). Hàm vlookup này hoàn toàn giống kết cấu trong excel. Chỉ có điều, các địa chỉ tham chiếu hơi khác tí là bạn phải gọi cụ thể vùng tham chiếu bằng VBA. Ví dụ nhé: Application.WorksheetFuntion.Vlookup(Sheet2.Range("A1").Value, Sheet1.Range("A1:B50"),2,0)).
 
Upvote 0
Bạn dùng đoạn code Application.WorksheetFunction.Vlookup(...). Hàm vlookup này hoàn toàn giống kết cấu trong excel. Chỉ có điều, các địa chỉ tham chiếu hơi khác tí là bạn phải gọi cụ thể vùng tham chiếu bằng VBA. Ví dụ nhé: Application.WorksheetFuntion.Vlookup(Sheet2.Range("A1").Value, Sheet1.Range("A1:B50"),2,0)).
Cũng nói thêm, khi bạn sử dụng nhiều Hàm của Excel hoặc một hàm lặp đi lặp lại, thì bạn nên chọn một biến thay thế cho nó ngắn gọn, ví dụ:

Mã:
Sub Test()
    Dim Ham As WorksheetFunction
    Set Ham = WorksheetFunction
    Sheet2.Range("D1") = Ham.VLookup(Sheet2.Range("A1").Value, Sheet1.Range("A1:B50"), 2, 0)
End Sub

Ngoài ra khi bạn làm như trên, thì sau khi bạn gõ chữ Ham thì bạn chỉ cần đặt dấu chấm (.) sau nó, một danh sách hàm có thể sử dụng trong VBA được hiện ra, bạn chỉ việc chọn hàm nào cần thiết mà thực thi cấu trúc của nó.
 

File đính kèm

  • Ham.jpg
    Ham.jpg
    24 KB · Đọc: 360
Upvote 0
Cũng nói thêm, khi bạn sử dụng nhiều Hàm của Excel hoặc một hàm lặp đi lặp lại, thì bạn nên chọn một biến thay thế cho nó ngắn gọn, ví dụ:

Mã:
Sub Test()
    Dim Ham As WorksheetFunction
    Set Ham = WorksheetFunction
    Sheet2.Range("D1") = Ham.VLookup(Sheet2.Range("A1").Value, Sheet1.Range("A1:B50"), 2, 0)
End Sub

Ngoài ra khi bạn làm như trên, thì sau khi bạn gõ chữ Ham thì bạn chỉ cần đặt dấu chấm (.) sau nó, một danh sách hàm có thể sử dụng trong VBA được hiện ra, bạn chỉ việc chọn hàm nào cần thiết mà thực thi cấu trúc của nó.

Em có nhu cầu muốn tìm kiếm thêm 1 cột nữa, tìm giá trị trên cột B
Sheet1.Range("A1:C5"), 3, 0) thì phải sửa thế nào. Ai đó làm ơn chỉ hộ em cái. Nói như trên em không hiểu gì cả.
 
Upvote 0
Upvote 0
Dùng hàm VLOOKUP() trong VBA cần chú í bẩy lỗi. Nếu không bẩy lỗi thì sẽ có lúc hàm VLOOKUP() không tìm ra dữ liệu cần thiết nó sẽ quay lại fá ta!
Em có nhu cầu muốn tìm kiếm thêm 1 cột nữa, tìm giá trị trên cột B
Vậy thì bạn cứ thực hiện trên trang tính cho tươm tất rồi đối chiếu với các hàm của các bài trên mà chỉnh sửa cho vừa í.
Chúc tuần làm việc vui vẻ!
 
Upvote 0
Vâng. file thế này anh. xin giúp em.

Để đở mất công những người trợ giúp, khuyên các bạn nên đưa file thật (hoặc có cấu trúc giống với file thật) lên đây
Rút kinh nghiệm nhiều lần rồi: Các bạn cứ gửi lên đây file giả lập "tào lao", khi người ta viết code xong, không biết cách áp dụng vào file thật lại hỏi tới hỏi lui
 
Upvote 0
Để đở mất công những người trợ giúp, khuyên các bạn nên đưa file thật (hoặc có cấu trúc giống với file thật) lên đây
Rút kinh nghiệm nhiều lần rồi: Các bạn cứ gửi lên đây file giả lập "tào lao", khi người ta viết code xong, không biết cách áp dụng vào file thật lại hỏi tới hỏi lui
Thầy ơi! Cho em hỏi thêm chút...
Mã:
  Sheet2.Range("C1") = Ham.VLookup(Sheet2.Range("$B1").Value, Sheet1.Range("B1:C5"), 2, 0)
Viết lại đoạn code trên sao để có kết quả từ C2:C5 ( Em chỉ làm được kết quả tại ô C1)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thầy ơi! Cho em hỏi thêm chút...
Mã:
  Sheet2.Range("C1") = Ham.VLookup(Sheet2.Range("$B1").Value, Sheet1.Range("B1:C5"), 2, 0)
Viết lại đoạn code trên sao để có kết quả từ C2:C5 ( Em chỉ làm được kết quả tại ô C1)

sao ko xài vlookup đi mà phải viết code?
nếu viết code thì xài code luôn sao phải xài worksheetfunction?
Mã:
Sub Test()
    Dim Ham As WorksheetFunction
    Set Ham = WorksheetFunction
    For i = 1 To 5
    Sheet2.Range("C" & i) = Ham.VLookup(Sheet2.Range("$B" & i).Value, Sheet1.Range("B1:C5"), 2, 0)
    Next
End Sub
 
Upvote 0
Sheet2.Range("C1:C5") = Ham.VLookup(Sheet2.Range("B1:B5").Value, Sheet1.Range("B1:C5"), 2, 0)


Dạ, cấu trúc file thật của em đây.
Code này của anh Hoàng Trọng Nghĩa viết mới tìm 1 cột em muốn tìm thêm 1 cột nữa.
Sub Test()
Dim Ham As WorksheetFunction
Set Ham = WorksheetFunction
Sheet2.Range("D1") = Ham.VLookup(Sheet2.Range("A1").Value, Sheet1.Range("A1:B50"), 2, 0)
End Sub
 

File đính kèm

Upvote 0
sao ko xài vlookup đi mà phải viết code?
nếu viết code thì xài code luôn sao phải xài worksheetfunction?
Xin thưa anh là: Kết quả dò tìm đó lại được Copy đi nơi khác hoặc Sheet khác, nên nếu để công thức sẽ hay bị sai, do đó cần macro để lấy giá trị anh ạ.
 
Upvote 0
Sheet2.Range("C1:C5") = Ham.VLookup(Sheet2.Range("B1:B5").Value, Sheet1.Range("B1:C5"), 2, 0)


Dạ, cấu trúc file thật của em đây.
Code này của anh Hoàng Trọng Nghĩa viết mới tìm 1 cột em muốn tìm thêm 1 cột nữa.
Sub Test()
Dim Ham As WorksheetFunction
Set Ham = WorksheetFunction
Sheet2.Range("D1") = Ham.VLookup(Sheet2.Range("A1").Value, Sheet1.Range("A1:B50"), 2, 0)
End Sub

Vẫn áp dụng bài này:
http://www.giaiphapexcel.com/forum/...ết-dùng-mã-vba-thay-thế-cho-hàm-vlookup/page3
Ta làm như sau:
1> Code trong module
Mã:
Public Chk As Boolean, Dic As Object, aResult()
Sub Auto_Open()
  Dim wks As Worksheet, SrcRng As Range, sArray
  Dim lR As Long, i As Long, n As Long, tmp
  On Error Resume Next
  Set wks = Sheets("Sheet2")
  Set SrcRng = wks.Range("A2:C10000")
  sArray = SrcRng.Value
  ReDim aResult(1 To UBound(sArray, 1), 1 To UBound(sArray, 2))
  Set Dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(sArray, 1)
    If CStr(sArray(i, 1)) <> "" Then
      tmp = sArray(i, 1)
      If Not Dic.Exists(tmp) Then
        lR = lR + 1
        Dic.Add tmp, lR
        aResult(lR, 1) = tmp
        aResult(lR, 2) = sArray(i, 2)
        aResult(lR, 3) = sArray(i, 3)
      End If
    End If
  Next
End Sub
2> Code trong sheet2
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Chk = True
End Sub
Private Sub Worksheet_Deactivate()
  If Chk Then
    Auto_Open
    Chk = False
  End If
End Sub
3> Code cho sheet 3
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long
  Dim arr(), tmp
  On Error Resume Next
  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("B3:B1000"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("B3:B1000"), Target)
    If IsArray(rTarget.Value) Then
      aTarget = rTarget.Value
    Else
      ReDim aTarget(1 To 1, 1 To 1)
      aTarget(1, 1) = rTarget.Value
    End If
    ReDim arr(1 To UBound(aTarget, 1), 1 To 2)
    For i = 1 To UBound(aTarget, 1)
      If aTarget(i, 1) <> "" Then
        tmp = aTarget(i, 1)
        If Dic.Exists(tmp) Then
          arr(i, 1) = aResult(Dic.Item(tmp), 2)
          arr(i, 2) = aResult(Dic.Item(tmp), 3)
        End If
      End If
    Next
    rTarget.Offset(, 1).Resize(, 2).Value = arr
  End If
End Sub
 

File đính kèm

Upvote 0
sao ko xài vlookup đi mà phải viết code?
nếu viết code thì xài code luôn sao phải xài worksheetfunction?
Mã:
Sub Test()
    Dim Ham As WorksheetFunction
    Set Ham = WorksheetFunction
    For i = 1 To 5
    Sheet2.Range("C" & i) = Ham.VLookup(Sheet2.Range("$B" & i).Value, Sheet1.Range("B1:C5"), 2, 0)
    Next
End Sub
Cám Ơn anh Em đã hiểu.. (phải thêm For nữa)
 
Upvote 0
Xin thưa anh là: Kết quả dò tìm đó lại được Copy đi nơi khác hoặc Sheet khác, nên nếu để công thức sẽ hay bị sai, do đó cần macro để lấy giá trị anh ạ.

nếu chỉ vậy thì chỉ việc copy rồi paste value.
chỉ góp ý vậy thôi, tùy ý thích của mỗi người mà..........hihihihih
 
Upvote 0
Web KT

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

Back
Top Bottom