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
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!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...Em nhờ mọi cả nhà giúp em viết code chuyển từ hàm Vlookup() sang Code VBA
Mình đã nhầm: Nhờ bạn giúp mình cách đưa hàm Vlookup vào trong code vớiNế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...
Có 2 dạng đưa vào code:Mình đã nhầm: Nhờ bạn giúp mình cách đưa hàm Vlookup vào trong code với
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."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?
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)).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."
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ụ: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)).
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
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 nhờ mọi cả nhà giúp em viết code chuyển từ hàm Vlookup() sang Code VBA
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 í.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âng. file thế này anh. xin giúp em.Hoặc là bạn cho file lên đây để mọi người làm trực tiếp vào file của bạn
Hoặc là tham khảo bài này:
http://www.giaiphapexcel.com/forum/...ết-dùng-mã-vba-thay-thế-cho-hàm-vlookup/page3
Vâng. file thế này anh. xin giúp em.
Thầy ơi! Cho em hỏi thêm chút...Để đở 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
Sheet2.Range("C1") = Ham.VLookup(Sheet2.Range("$B1").Value, Sheet1.Range("B1:C5"), 2, 0)
Thầy ơi! Cho em hỏi thêm chút...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)Mã:Sheet2.Range("C1") = Ham.VLookup(Sheet2.Range("$B1").Value, Sheet1.Range("B1:C5"), 2, 0)
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
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 ạ.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?
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
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
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
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
Cám Ơn anh Em đã hiểu.. (phải thêm For nữa)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
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 ạ.