Giúp về code VBA Lookup ngược

Liên hệ QC

jennythanh

Thành viên mới
Tham gia
14/7/18
Bài viết
3
Được thích
0
Chào Anh Chị
Mình muốn viết 1 Sub để tìm giá trị cho cột Ma theo bảng Nguồn bên cạnh
mong anh chị giúp đỡ
 

File đính kèm

  • lookup VBA.xlsm
    8.6 KB · Đọc: 10
dùng lookup được không bạn
Cách nào ra kết quả thì làm, sao cứ phải là Lookup()?
Muốn Lookup() thì cột M của bạn phải sort lại A-Z.
Nếu giữ nguyên như vậythì có thể dùng công thức này:
PHP:
B3=INDEX($L$3:$L$9;MATCH(C3;$M$3:$M$9;0);)
 
Lần chỉnh sửa cuối:
Upvote 0
Cách nào ra kết quả thì làm, sao cứ phải là Lookup()?
Muốn Lookup() thì cột M của bạn phải sort lại A-Z.
Nếu giữ nguyên như vậythì có thể dùng công thức này:
PHP:
B3=INDEX($L$3:$L$9;MATCH(C3;$M$3:$M$9;0);)
công thức thì mình đã làm được, mình làm 2 cách lookup và Index, và giờ muốn chuyển qua VBA để tiện cho chương trình
 
Upvote 0
mình sử dụng công thức được rồi, muốn chuyển qua code VBA
cám ơn các bạn
Tôi nghĩ công thức được thì dùng chứ sao lại làm khó nhau vậy, cái có sẳn không thích lại thích cái tự tạo (chưa chắc cái tự tạo ngon hơn cái có sẳn). Vậy bạn đợi các thành viên khác giúp bạn nhé.
 
Upvote 0
Chào Anh Chị
Mình muốn viết 1 Sub để tìm giá trị cho cột Ma theo bảng Nguồn bên cạnh
mong anh chị giúp đỡ
Chẳng hiểu bạn muốn tra cột nào? Trong File dựa vào Ma (cột B) để tra Internet (cột C).
Nếu bạn muốn tra ngược thì hoán vị bảng tra và cột tra rồi nhấn nút.
 

File đính kèm

  • TRA INTERNET.xlsm
    19.2 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Chào Anh Chị
Mình muốn viết 1 Sub để tìm giá trị cho cột Ma theo bảng Nguồn bên cạnh
mong anh chị giúp đỡ
1> Cho code dưới đây vào module:
Mã:
Public dicObject    As Object
Public isChanged    As Boolean
Sub Main()
  Dim arrSrc, key
  Dim lRow As Long
  If (dicObject Is Nothing) Or (isChanged = True) Then
    CreateDic Sheet1.Range("M3:M1000"), Sheet1.Range("L3:L1000"), dicObject
  End If
  With Sheet1.Range("C3:C100")
    arrSrc = .Value
    ReDim arrDes(1 To UBound(arrSrc), 1 To 1)
    For lRow = 1 To UBound(arrSrc, 1)
      key = arrSrc(lRow, 1)
      If dicObject.Exists(key) Then arrDes(lRow, 1) = dicObject.item(key)
    Next
    .Offset(, -1).Value = arrDes
  End With
  isChanged = False
End Sub
Private Sub CreateDic(ByVal rngKeys As Range, ByVal rngItems As Range, ByRef dict As Object)
  Dim lRow As Long, lCol As Long
  Dim arrKeys(), arrItems(), key, item
  Set dict = CreateObject("Scripting.Dictionary")
  If rngKeys.Count = 1 Then
    ReDim arrKeys(1 To 1, 1 To 1)
    ReDim arrItems(1 To 1, 1 To 1)
    arrKeys(1, 1) = rngKeys.Value
    arrItems(1, 1) = rngItems(1, 1).Value
  Else
    Set rngItems = rngItems.Resize(rngKeys.Rows.Count, rngKeys.Columns.Count)
    arrKeys = rngKeys.Value
    arrItems = rngItems.Value
  End If
  For lRow = 1 To UBound(arrKeys, 1)
    For lCol = 1 To UBound(arrKeys, 2)
      key = arrKeys(lRow, lCol)
      item = arrItems(lRow, lCol)
      If key <> Empty Then
        If Not dict.Exists(key) Then dict.Add key, item
      End If
    Next
  Next
End Sub
2> Cho code dưới đây vào sự kiện change của sheet1
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("L3:M1000"), Target) Is Nothing Then isChanged = True
End Sub
Chạy Sub Main và kiểm tra kết quả
(code viết hơi thô, có khả năng sẽ còn lỗi)
 

File đính kèm

  • Lookup VBA.xlsm
    24.1 KB · Đọc: 10
Upvote 0
Code thô hay không chưa xác định nhưng chuẩn thì chưa chuẩn theo luật viết code biến toàn cục (global):
- biến chỉ dùng ở 1 module thì phải private. Biến chỉ public khi cần dùng ở nhiều mudules. Nếu có nhiều biến public thì người ta tạo một module riêng cho chúng, và chỉ chứa chúng.
- theo cách viết chuyên nghiệp thì những biến toàn cục đi với nhau (cái này bổ sung tính chất của cái kia) thì người ta cho chung vào một Type, hoặc bắt đầu tên bằng một chuỗi giống nhau. Cách truy cập tên sẽ dài hơn 1 chút nhưng chúng sẽ không bị lẫn lộn nhau.
 
Upvote 0
Web KT
Back
Top Bottom