2015-02-23 19 views
1

我有這樣的一個表:
每一行是3名成員 - 家庭記錄,每一列包含了家庭成員的姓名(父親,母親,孩子)查找片連續使用多個條件

COLUMN_A  COLUMN_B  COLUMN_C 

david   jane   john 
michael  jenny  kelly 
david   sarah  peter 
leo   kelly  peter 

我想通過指定父親,母親和孩子的名字找到一條記錄。

我正在考慮在每一列上做一個查找,但我不知道該怎麼做,也不知道是否沒有更好的現成解決方案來搜索這樣的記錄。

回答

0

我過去使用過的一種方法是將每個家庭組合添加到公開聲明的字典對象中。一旦添加,後續子例程可以搜索Dictionary對象以進行匹配,然後與該行進行交互。

看到下面的代碼,並讓我知道如果你能弄清楚/適應你的需要。

Public oDictionary As Object 

Public Sub CreateEntryList() 
    Dim rngToAdd As Range 
    Dim strKey As String 

    Set rngToAdd = Sheet1.Range("A2:A5") 
    Set oDictionary = CreateObject("Scripting.Dictionary") 

    For Each cel In rngToAdd 
     strKey = cel.Value & cel.Offset(, 1).Value & cel.Offset(, 2).Value 
     If Not oDictionary.exists(strKey) Then 
      oDictionary.Add strKey, cel.Row 
     End If 
    Next cel 
End Sub 

Sub InteractWithFoundrow() 
    Dim strSearch As String 

    strSearch = Range("A3") & Range("B3") & Range("C3") 

    If oDictionary.exists(strSearch) Then 
     Rows(oDictionary(strSearch)).Interior.Color = vbRed 
    Else 
     MsgBox ("Error: Doesn't exist") 
    End If 

End Sub 
0

更新:感謝@ user3561813他告訴我有關代碼中的問題。我已經相應更新了。它可能不是很專業,但它會完成這項工作。

下面的代碼是簡單的那麼一點點@ user3561813

代碼假設你的佈局是這樣的:

enter image description here

Sub rowvscol() 
Dim Father As String 
Dim Mother As String 
Dim Children As String 
Dim rng As Range 
Dim LastRow As Long 

Father = Range("F2").Value 
Mother = Range("G2").Value 
Children = Range("H2").Value 
LastRow = Range("B" & Rows.Count).End(xlUp).Row 
i = 1 
While i <= LastRow 
With Range("B" & i & ":B" & LastRow) '<- Father Column 
    Set rng = .Find(What:=Father, _ 
     LookIn:=xlValues, _ 
     LookAt:=xlWhole, _ 
     SearchOrder:=xlByRows, _ 
     SearchDirection:=xlNext, _ 
     MatchCase:=False) 
     If Not rng Is Nothing And rng.Offset(0, 1).Value = Mother And rng.Offset(0, 2).Value = Children Then 
      MsgBox rng.Row 
      Exit Sub 
     End If 
End With 
i = i + 1 
Wend 
MsgBox "No match" 
End Sub 

因此,它被彈出一個MsgBox你可以改變你的代碼。

enter image description here

+0

確實,您的代碼版本更簡單,但也是有限的。它只搜索父親的第一次出現,然後測試妻子和孩子是否匹配。如果父親的名字重複多次,那麼代碼將返回False,除非該請求恰好是父親的第一次出現。事實上,如果父親的名字沒有重複,我們根本不需要測試其他列,因爲父親是獨一無二的。我們可以使用'Loop'和FindNext'方法,但有三列,它可能開始變得醜陋。 – user3561813 2015-02-23 18:25:18

+0

這絕對是真的。我錯過了。非常感謝@ user3561813的信息。如果我們在當前的一個裏面嵌套2個以檢查母親和孩子怎麼辦? – Dubison 2015-02-24 07:27:12

+0

沒有問題@Dubison。是的,您可以在搜索範圍內嵌入IF語句來檢查母親和孩子,但我認爲代碼變得更加混亂。首先,我們必須尋找父親。接下來,檢查母親。如果母親不正確,那麼就在父親身邊循環。如果母親是正確的,那麼'循環'在孩子們身上。我懷疑使用這些嵌套的'Loop'和'IF'語句會效率不高。 – user3561813 2015-02-24 13:53:20

0

你也可以用下面的公式做到不VBA:如有需要,

=INDEX(C:C,SUMPRODUCT((A:A="david")*(B:B="jane")*ROW(C:C)),0) 

代「大衛」和「簡」爲單元格引用。