2016-08-18 101 views
-2

我完全困惑在這種情況下該怎麼做。任何幫助都會很棒。如何在excel中搜索特定值的列

我有三列,並在第一列我有名稱與重複條目,併爲此我有另一列作爲角色及其各自的價值(主/輔)。現在,我試圖根據列A和B獲取狀態值是或否。如果列A中的名稱具有作爲主鍵的角色,則狀態應爲否,否則爲否。表示如果在列A中名稱沒有主鍵值的記錄,那麼狀態應該是NO。以下是供參考的例子。

Name   Role  Status 
C7E748588B6D PRIMARY  Yes 
C7E748588B6D SECONDARY Yes 
C7E748588B6D SECONDARY Yes 
C7E748588B6D SECONDARY Yes 
C7E748588B6D SECONDARY Yes 
5E0463D34209 SECONDARY No 
5E0463D34209 SECONDARY No 
5E0463D34209 SECONDARY No 
5E0463D34209 SECONDARY No 
46C14AEC2EB5 PRIMARY  Yes 
46C14AEC2EB5 SECONDARY Yes 
46C14AEC2EB5 SECONDARY Yes 
46C14AEC2EB5 SECONDARY Yes 
46C14AEC2EB5 SECONDARY Yes 
A6C883388E3D PRIMARY  Yes 
A6C883388E3D SECONDARY Yes 
A6C883388E3D SECONDARY Yes 

謝謝。

+2

這是否需要成爲VBA?這可以用一個公式完成,假設你的狀態是/否列在列C中,而行1是一個標題行,所以你的實際數據從第2行開始,然後在單元格C2中複製下來就是這個公式:'= IF(COUNTIFS(A:A,A2,B:B,「PRIMARY」)> 0,「是」,「否」) – tigeravatar

回答

0

編輯:改變了我的答案下面的意見。

這可能不是最簡單的方法,但它應該工作

Dim l As Long 
Dim name As String 
Dim cnt As Integer 

l = 1 
cnt = 0 

For l = 1 To ActiveSheet.UsedRange.Rows.Count 

    If Cells(l, 2).Value = "PRIMARY" Then 
     name = Cells(l, 1) 
     Do While (Cells(l + cnt, 1) = name) 
      Cells(l + cnt, 3).Value = "YES" 
      cnt = cnt + 1 
     Loop 
     cnt = 0 
    ElseIf Cells(l, 3).Value = "" Then Cells(l, 3).Value = "No" 
    End If 

Next l 
+0

這將只設置單詞「PRIMARY」的行以顯示Yes。根據他提供的示例,OP希望重複名稱的所有行都顯示「是」,如果它具有「主要」。 – tigeravatar

+0

而'細胞'使用'(行,列)'。它看起來像你有你的指數逆轉 – PartyHatPanda

+0

@tigeravatar如果所有行重複名稱顯示是,那麼他永遠不會得到一個值No – phil652

0

這應該工作,無論什麼樣的順序的數據是,它爲您提供您18行寫的。您當然必須將工作表變量和For循環的控件更新爲特定的應用程序。

Option Explicit 
Sub PrimaryCheck() 

Dim i As Integer 
Dim w1 As Worksheet 
Set w1 = ThisWorkbook.Sheets(1) 
Dim SearchString As Range 
Dim SearchRange As Range 
Dim SearchAddress As String 
Dim FoundRange As Range 

Set SearchRange = w1.Range(w1.Cells(1, 1), w1.Cells(18, 1)) 


For i = 2 To 18 
    If IsEmpty(w1.Cells(i, 3)) Then 
     If w1.Cells(i, 2).Value = "PRIMARY" Then 
      w1.Cells(i, 3) = "YES" 
     ElseIf w1.Cells(i, 2).Value = "SECONDARY" Then 
      Set SearchString = w1.Cells(i, 1) 
      SearchAddress = w1.Cells(i, 1).Address 
      Set FoundRange = SearchRange.Find(SearchString, w1.Cells(i, 1), , , , xlNext, True) 
      Do While Not FoundRange Is Nothing And FoundRange.Address <> SearchAddress 

       If w1.Cells(FoundRange.Row, 2).Value = "PRIMARY" Then 
        w1.Cells(i, 3) = "YES" 
       End If 
       Set FoundRange = SearchRange.FindNext(FoundRange) 
      Loop 
      If IsEmpty(w1.Cells(i, 3)) Then 
       w1.Cells(i, 3).Value = "NO" 
      End If 
     End If 
    End If 
Next i 
End Sub