2017-08-30 3 views
0

J'essaie de trouver la ligne d'une cellule avec l'utilisation de la correspondance. J'ai été en mesure de le faire avecUtilisation de la fonction de correspondance avec les critères de couleur

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

Mais voilà où je suis coincé. Le "123" peut être apparu plusieurs fois dans la même colonne (ceux-ci auraient déjà été remplis avec une couleur) et j'essaie de trouver la dernière cellule "123". Cette cellule ne serait remplie d'aucune couleur.

J'ai essayé de l'entrer de cette façon, mais je crois que Interior.ColorIndex = 0 ne s'applique qu'aux objets et non aux plages.

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

J'ai aussi essayé de faire une Selection.Address sur les cellules non colorées et de faire un match à partir de là, mais cela entraîne une dans la fonction de correspondance donnant un résultat qui est pas la ligne où la cellule est dans la feuille de calcul (cela donnera la ligne qu'il peut être trouvé dans la sélection) [c'est-à-dire la rangée de cellules réelle de "123" = 2000 mais le résultat donné est "1", qui est la ligne dans la sélection]. Mon code pour ceci est

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

Une idée pour résoudre ce problème? J'espère avoir été clair dans mon explication de mon problème.

+1

Je ne sais pas ce que vous fait penser que vous pouvez utiliser match comme ça. Vous pouvez cependant utiliser la méthode Find avec un format. – SJR

+0

Utilisez un Range.Find conjointement avec le paramètre SearchFormat pour trouver la cellule appropriée – Tragamor

Répondre

0

Vous pouvez utiliser le paramètre "After" de Range.Find pour continuer à aller plus loin jusqu'à ce que vous correspondiez à la couleur intérieure que vous souhaitez.

J'ai fait un petit bout de démontrer ce que je veux dire:

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

je l'ai fait ma solution en fonction qui fonctionne assez de façon similaire à la fonction Match régulière:

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 

Semble travailler avec ce que je l'ai testé, mais votre kilométrage peut varier.

0

Voici encore une autre approche. Celui-ci utilise la méthode Find pour rechercher une correspondance. En outre, il utilise également une fonction pour retourner le numéro de ligne. Cependant, s'il n'y a pas de correspondance, elle renvoie une erreur pour laquelle elle peut être testée.

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 

Espérons que cela aide!

0

Tenir compte:

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