2017-08-30 3 views
0

Ich versuche, die Zeile einer Zelle mit der Verwendung von Übereinstimmung zu finden. Ich bin in der Lage, dies mitVerwendung der Match-Funktion mit Farbkriterien

rowfound = Application.WorksheetFunction.Match("123", Range("A:A"), 0) 

zu tun, aber hier kommen, wo ich stecke. Die "123" könnte mehrmals in derselben Spalte erschienen sein (diese wären bereits mit einer Farbe gefüllt worden) und ich versuche die neueste "123" -Zelle zu finden. Diese Zelle würde nicht mit irgendeiner Farbe gefüllt werden.

Ich habe versucht, es auf diese Weise einzugeben, aber ich glaube Interior.ColorIndex = 0 gilt nur für Objekte und nicht Bereiche.

rowfound = Application.WorksheetFunction.Match("123", Range("A:A").Interior.ColorIndex = 0, 0) 

ich auch eine Selection.Address auf den ungefärbten Zellen versucht haben zu tun und ein Spiel von dort zu tun, aber diese werden die Ergebnisse in der Funktion Spiel dass ein Ergebnis, das nicht die Reihe ist, wo die Zelle in dem Arbeitsblatt ist (es gibt die Zeile, die in der Auswahl gefunden werden kann) [dh die tatsächliche Zellenzeile von "123" = 2000, aber das Ergebnis ist "1", was die Zeile in der Auswahl ist). Mein Code dafür ist

RRR = Selection.Address 
rowfound = Application.WorksheetFunction.Match("123", Range(RRR), O) 

Irgendeine Idee, wie man das löst? Hoffe ich war klar in meiner Erklärung meines Problems.

+1

nicht sicher, was Sie denken, macht Sie Spiel so verwenden können. Sie können die Find-Methode jedoch mit einem Format verwenden. – SJR

+0

Verwenden Sie eine Range.Find in Verbindung mit dem SearchFormat-Parameter, um die relevante Zelle zu finden – Tragamor

Antwort

0

Sie können den "After" -Parameter von Range.Find weiter verwenden, bis Sie die gewünschte Interior.Color-Farbe erreicht haben.

machte ich einen kleinen Ausschnitt zu zeigen, was ich meine:

Sub test() 
Dim blankCode As Long 
Dim tempRange As Range 
Dim lookupValue As String 

blankCode = 16777215 'Blank cell 
lookupValue = "testing this out" 'what im looking for 
Set tempRange = Range("A1") 'Starting in cell A1 

Do 
'Going through each match of the lookup value until the color is what we need 
    Set tempRange = Range("A:A").Find(lookupValue, After:=tempRange) 
    If tempRange.Interior.Color = blankCode Then 
     MsgBox ("Found it on cell " & tempRange.Address) 
     Exit Do 
    End If 

'This will loop indefinitely if the value isn't there, so I'd add a loop control that suits your project 
Loop While True 

End Sub 
0

Ich habe meine Lösung als eine Funktion, die ziemlich ähnlich wie bei der regulären Match Funktion funktioniert:

Public Function MatchUncolored(lookup_value, lookup_array As Range) 
Dim cell As Range, ct As Long 

For Each cell In Union(lookup_array.SpecialCells(xlCellTypeConstants), lookup_array.SpecialCells(xlCellTypeFormulas)) 

    ct = ct + 1 

    If ct > 10000 Then 
     MatchUncolored = "#ERROR" 
     Exit Function 
    End If 

    If cell.Value = lookup_value And cell.Interior.ColorIndex = xlNone Then 
     MatchUncolored = ct 
     Exit Function 
    End If 

Next cell 

End Function 

scheint mit zu arbeiten Was ich getestet habe, aber Ihre Laufleistung kann variieren.

0

Hier ist noch ein weiterer Ansatz. Dieser verwendet die Find-Methode, um nach einer Übereinstimmung zu suchen. Außerdem verwendet es eine Funktion, um die Zeilennummer zurückzugeben. Wenn es jedoch keine Übereinstimmung gibt, gibt es einen Fehler zurück, für den es getestet werden kann.

Option Explicit 

Sub test() 
    Dim vRow As Variant 
    vRow = FindUncolored("123", Range("A:A")) 
    If IsError(vRow) Then 
     MsgBox "No match found!", vbInformation 
    Else 
     MsgBox "Match found in Row " & vRow, vbInformation 
    End If 
End Sub 

Function FindUncolored(strSearchFor As String, rngRange As Range) 

    Dim rngFound As Range 

    With Application.FindFormat 
     .Clear 
     .Interior.ColorIndex = xlNone 
    End With 

    With rngRange 
     Set rngFound = .Find(what:=strSearchFor, after:=.Cells(.Rows.Count), LookIn:=xlValues, _ 
      lookat:=xlWhole, searchorder:=xlRows, searchdirection:=xlNext, MatchCase:=False, SearchFormat:=True) 
    End With 

    If Not rngFound Is Nothing Then 
     FindUncolored = rngFound.Row 
    Else 
     FindUncolored = CVErr(xlErrNA) 
    End If 

    Application.FindFormat.Clear 

End Function 

Hoffe, das hilft!

0

Bedenken Sie:

Application.FindFormat.Interior.ColorIndex = 0 
rowfound = Range("A:A").Find("123", SearchFormat:=True) 
Verwandte Themen