2017-10-19 12 views
1

Je cherche un code vba pour savoir si un tableau de chaînes est contenu (pas totalement compatible) dans les cellules d'une colonne. J'ai une liste de faux emails stockés dans la feuille "Helper" sur A1: A3242 et dans la feuille JP j'ai la liste des emails (I: I) que je veux vérifier.Utilisation d'un tableau dans InStr

Si un e-mail de la première liste est trouvé dans la 2ème colonne, j'ai besoin que la ligne soit colorée en jaune.

Dim list As Variant, FF As Long, qq As Long 

list = Sheets("Helper").Range("A1:A3242").Value 
FF = Range("I" & Rows.count).End(xlUp).Row 
For qq = 1 To FF 
    If InStr(1, list, cell.Value) <> 0 Then 
     Range("I" & qq).EntireRow.Interior.Color = vbRed 
    End If 
Next qq 

End Sub 

Je suis vraiment nouveau à VBA et je ne sais pas si cela l'approche correcte, je reçois l'erreur « 424 Objet requis », Toute aide serait grandement appréciée, merci d'avance :)

+0

Vous avez pas déclaré votre variable 'cell'. (C'est pourquoi vous obtenez une erreur "objet requis" - seul un objet ou un type défini par l'utilisateur aura quelque chose comme '.Value' après le nom de la variable.) Mais vous ne pourrez pas non plus effectuer un' Instr' sur un tableau. – YowE3K

+0

La réponse utilisera probablement 'If Not IsError (Application.Match (Cellules (qq," I "). Value, list, 0)) Then', mais je ne suis pas une exportation sur' Match' donc je vais laisser quelqu'un d'autre répondre. – YowE3K

+0

@ YowE3K est-ce un indice? ;) –

Répondre

1
Function GetDomain(s as String) as String 
Dim x as Integer 
X = instr(s,"@") 
If x=0 then 
    GetDomain = s 
Else 
    GetDomain = right(s,len(s)-x) 
End IF 
End Function 

wrap et votre chaîne autour de cette fonction:

 If Not IsError(Application.Match(GetDomain(.Range("I" & qq).Value), list, 0)) 

(devrait fonctionner, non testé)

+0

Merci! Ça marche. Je pensais juste la même chose, en ajoutant une colonne où je coupe juste ce qui est après @ et utilise le code précédent pour vérifier la correspondance exacte, mais cela fonctionne. Merci encore: D –

1

Vous devez utiliser la fonction Application.Match, voir ci-dessous le code (explications dans le code des commentaires):

Option Explicit 

Sub MatchEmailList() 

Dim list As Variant, FF As Long, qq As Long 

list = Sheets("Helper").Range("A1:A3242").Value 

With Sheets("JP") ' fully qualify the sheet 
    FF = .Range("I" & .Rows.Count).End(xlUp).Row ' get last row in column "I" from sheet "JP" 

    For qq = 1 To FF 
     ' if not is Error >> Match was successful to find a match 
     If Not IsError(Application.Match(.Range("I" & qq).Value, list, 0)) Then 
      .Rows(qq).Interior.Color = vbRed ' color entire roe in red 
     End If 
    Next qq 
End With 

End Sub 
+0

Remerciements J'ai essayé d'utiliser cette méthode, mais malheureusement, elle ne colore que les correspondances exactes et je devrais trouver le "@ test.com" dans "[email protected]". –

+0

@CalinLencar ne sont pas les chaînes de courriels exactement les mêmes sur les deux feuilles? –

+0

Malheureusement non, je devrais trouver le "@ test.com" dans "[email protected]". –