VLookup liệu có giải quyết được bài toán này

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

LinDan

Thành viên tiêu biểu
Tham gia
8/2/12
Bài viết
412
Được thích
111
Bài toán của em như hình đính kèm, quan trọng nhất là điền vào tên mặt hàng, nhờ mọi người tư vấn dùm em cách làm
lookup_zps1d1f0f15.png
 

File đính kèm

Híc...đúng là trình độ của Ndu, quả thật em chưa bao giờ nghĩ đến sử dụng lookup như thế, đặc biệt cái thành phần

COUNTIF(B4,"*"&$B$15:$B$18&"*"), em cứ nghĩ mảng..mảng từ tối đến giờ không xong, tiện đây em xin hỏi thày có cách nào để giải quyết bài này nữa không ah?
 
Cách khác dùng hàm mảng:
=INDEX($C$15:$C$18,MATCH(1,--ISNUMBER(SEARCH($B$15:$B$18,B4)),0))
Ctrl-Shift-Enter
 
Thích dùng CHOOSE thì dùng:
=CHOOSE(MATCH(1,INDEX(LEN(B4)-LEN(SUBSTITUTE(B4,$B$15:$B$18,"")),),0),$C$15,$C$16,$C$17,$C$18)
Enter
Tuy nhiên dùng LOOKUP vẫn là ngắn nhất.
 
Nhớ thuở nào học trung tâm, mình làm vầy

Mình cũng đưa lên cho vui thôi!
Hi, hi,. . . . . . .
 

File đính kèm

Giúp em luyện tập về bài toán tìm kiếm

Em đang thực hành một số bài toán tìm kiếm, bài này cũng tương tự như bài trước nhưng nâng cao hơn 1 chút (tìm với 2 điều kiện),
----------------
nhờ mọi người giúp cho (kể cả công thức +VBA) để em có điều kiện học hỏi.
 

File đính kèm

Cách khác dùng hàm mảng:
=INDEX($C$15:$C$18,MATCH(1,--ISNUMBER(SEARCH($B$15:$B$18,B4)),0))
Ctrl-Shift-Enter

Cũng dùng SEARCH nhưng kết hợp với LOOKUP:
Mã:
=LOOKUP(2,1/SEARCH($B$15:$B$18,B4),$C$15:$C$18)
Tương tự vậy cho bài số 7:
Mã:
=LOOKUP(2,1/FIND($A$16:$A$19,B2),OFFSET($A$16:$A$19,,INT((C2-1)/3)+1))
Hoặc
Mã:
=LOOKUP(2,1/FIND($A$16:$A$19,B2),OFFSET($A$16:$A$19,,LOOKUP(--C2,{0,4,7},{1,2,3})))
Hàng đống cách
 
Lần chỉnh sửa cuối:
Cũng dùng SEARCH nhưng kết hợp với LOOKUP:
Mã:
=LOOKUP(2,1/SEARCH($B$15:$B$18,B4),$C$15:$C$18)
Tương tự vậy cho bài số 7:
Mã:
=LOOKUP(2,1/FIND($A$16:$A$19,B2),OFFSET($A$16:$A$19,,INT((C2-1)/3)+1))
Hoặc
Mã:
=LOOKUP(2,1/FIND($A$16:$A$19,B2),OFFSET($A$16:$A$19,,LOOKUP(--C2,{0,4,7},{1,2,3})))
Hàng đống cách

Thưa thày, dạng bài số 7 em rất hay gặp trong công việc, rất mong thày dạy dùm em VBA bài này với ah.
 
Thưa thày, dạng bài số 7 em rất hay gặp trong công việc, rất mong thày dạy dùm em VBA bài này với ah.

Bài toán dạng TÌM KIẾM dùng VBA có đầy trên GPE rồi còn gì
Giờ nếu muốn dùng code VBA, vậy bạn muốn xây dựng code thành 1 Function hay 1 Sub?
 
Dạ bằng Sub ah, em chưa thạo lắm nên nhìn thuật toán cái này dễ hơn.

E rằng sẽ hơi khó đối với bạn (nếu là Function thì có thể dễ hiểu hơn)
1> Sub tổng quát để tra từ khóa vào bảng tra:
Mã:
Sub FindSpec(ByVal rFind As Range, ByVal LookUp_Table As Range, ByVal aColIndex, ByVal Target As Range)
  Dim lR1 As Long, lR2 As Long, n As Long, ColIndex As Long
  Dim aTable, aFind, aResult()
  Dim tmp1 As String, tmp2 As String
  On Error Resume Next
  aFind = rFind.Value
  aTable = LookUp_Table.Value
  ReDim aResult(1 To UBound(aFind), 1 To 1)
  For lR1 = 1 To UBound(aFind, 1)
    tmp1 = CStr(aFind(lR1, 1))
    If Len(tmp1) Then
      ColIndex = aColIndex(lR1, 1)
      For lR2 = 1 To UBound(aTable, 1)
        tmp2 = CStr(aTable(lR2, 1))
        If Len(tmp2) Then
          If InStr(1, tmp1, tmp2) Then
            aResult(lR1, 1) = aTable(lR2, ColIndex)
            Exit For
          End If
        End If
      Next
    End If
  Next
  Target.Resize(lR1 - 1, 1).Value = aResult
End Sub
2> Sub chính
Mã:
Sub Main()
  Dim rFind As Range, LookUp_Table As Range, aColIndex, Target As Range
  Dim i As Long, lTmp As Long
  On Error Resume Next
  With Sheet1
    Set rFind = .Range("B2:B11")
    Set LookUp_Table = .Range("A16:D19")
    aColIndex = .Range("C2:C11").Value
    Set Target = .Range("D2")
  End With
  For i = 1 To UBound(aColIndex)
    lTmp = Int((aColIndex(i, 1) - 1) / 3) + 2
    aColIndex(i, 1) = lTmp
  Next
  FindSpec rFind, LookUp_Table, aColIndex, Target
End Sub
Đoạn code thứ nhất bạn không cần quan tâm, chỉ quan tâm Sub Main. Đưa vào các tham chiếu phù hợp như:
rFind: là vùng chứa mã số cần tra
LookUp_Table: là bảng tra
Target: là nơi sẽ đặt kết quả
Vì ta chưa có vị trí cột nên phải tự tính bằng đoạn:
Mã:
For i = 1 To UBound(aColIndex)
  lTmp = Int((aColIndex(i, 1) - 1) / 3) + 2
  aColIndex(i, 1) = lTmp
Next
Chạy Sub Main, sẽ có kết quả
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom