Vérifier si une cellule contient un mot d'une plage de cellules

Bonjour,

Tout est presque dans le titre.
J'ai une liste de matériel dans une colonne.

Je souhaite filtrer ma liste. Pour cela, j'ai une liste de mots-clefs sur une plage d'une feuille donnée.

Sur le fichier ci-joint, j'ai mis la liste fictive sur la feuille 1 et la liste de mots-clefs recherchés sur la feuille 2.

Auriez-vous une idée ? Une solution VBA serait l'idéal.

J'ai bien trouvé des choses mais ça ne marche que de cellule à cellule.

Merci,

Bonjour,

J'ai en mémoire un sujet similaire traité il y a quelques années. Il s'agissait de comparer du texte à un référentiel de mots. On utilise 2 boucles imbriquées, la première pour balayer les cellules à analyser (feuille 1 dans ton cas) et la seconde pour balayer le référentiel (feuille 2) et faire la comparaison.

Une adaptation :

Option Base 1
Sub Comparaison()

Dim Donnees() As Variant, Referentiel() As Variant, i As Long, Reference As Variant, Resultats() As Variant

Donnees = Sheets("Feuil1").Range("B2:B" & Sheets("Feuil1").Range("B" & Rows.Count).End(xlUp).Row).Value 'Chargement des données dans une variable tableau
Referentiel = Sheets("Feuil2").Range("A2:A" & Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row).Value 'Chargement du référentiel dans une variable tableau
ReDim Resultats(UBound(Donnees), 1) 'Création d'un tableau vide de même dimension que les données
For i = 1 To UBound(Donnees) 'Boucle sur les données à traiter
    Resultats(i, 1) = 0 'Pas de correspondance par défaut
    For Each Reference In Referentiel 'Boucle sur le référentiel
        If Donnees(i, 1) Like "*" & Reference & "*" Then
            Resultats(i, 1) = 1 'Correspondance trouvée
            Exit For 'On arrête de parcourir le référentiel
        End If
    Next Reference
Next i
Sheets("Feuil1").Range("C2:C" & Sheets("Feuil1").Range("B" & Rows.Count).End(xlUp).Row).Value = Resultats 'Report des résultats

End Sub

Les noms des feuilles sont à adapter à ton fichier original.

Alors j'aurais quelques questions si tu es d'accord avant de pouvoir essayer.

  • Je ne comprends pas la fonction ReDim, et elle semble essentielle. Au début tu déclares une variable sous format texte et il semble que tu la requalifies ensuite.
  • Le terme "For" sert à quoi ?
  • i1 et i2 semblent désigner deux colonnes fictives d'un nouveau tableau imaginaires. Est-ce cela ?
  • Peux-tu expliquer les étapes logiques de la boucle pas à pas ?

Je débute en VBA (c'est pour le boulot, j'apprends sur le tas) et même si j'enchaîne les vidéos je n'ai pas encore croisé toutes les fonctions les plus courantes.

Alors j'aurais quelques questions si tu es d'accord avant de pouvoir essayer.

  • Je ne comprends pas la fonction ReDim, et elle semble essentielle. Au début tu déclares une variable sous format texte et il semble que tu la requalifies ensuite.
  • Le terme "For" sert à quoi ?
  • i1 et i2 semblent désigner deux colonnes fictives d'un nouveau tableau imaginaires. Est-ce cela ?
  • Peux-tu expliquer les étapes logiques de la boucle pas à pas ?

Je débute en VBA (c'est pour le boulot, j'apprends sur le tas) et même si j'enchaîne les vidéos je n'ai pas encore croisé toutes les fonctions les plus courantes.

ReDim est une instruction utilisée pour redimensionner une variable tableau. Par exemple, si je travaillais avec une variable de 100 lignes et 2 colonnes, et que je souhaite la redimensionner pour ajouter une colonne, alors je fais ReDim MaVar(100, 3). Les variables tableaux ne sont pas indispensables, on pourrait travailler directement à partir des plages de cellule, mais le code est plus rapide avec les tableaux car en réalité les cellules comportent beaucoup d'autres informations qui ne sont pas nécessaires dans notre cas (couleur de fond, de police, taille et type de police, encadrement, hauteur, largeur, etc) et alourdissent leur manipulation.

For est une composante d'une boucle. Par exemple For Ligne = 1 To 100, littéralement pour une variable appelée ligne qui va de 1 à 100 (donc 1, puis 2, puis 3, etc). i1 et i2 sont 2 variables que j'utilise comme la variable Ligne dans mon exemple ci-dessus, pour parcourir chacun de mes 2 tableaux. Elles pourraient aussi s'appeler toto ou tata (mais on préfère généralement des noms plus explicites sur leur utilité).

Le code proposé directement dans ma réponse précédente est commenté. Si les commentaires ne sont pas suffisamment clair, je peux détailler davantage le fonctionnement du code.

Une version plus détaillée des commentaires

Option Base 1 'Indique que les tableaux commencent à 1 plutôt que 0 (valeur par défaut)
Sub Comparaison()

'Déclaration des variables, variant est un type "fourre tout", Long correspond à un nombre entier
Dim Donnees() As Variant, Referentiel() As Variant, i As Long, Reference As Variant, Resultats() As Variant

'Sheets désigne la feuille, Range la plage de cellules, la 2ème partie de l'instruction (après "&") sert juste à trouver la dernière ligne comportant des données
Donnees = Sheets("Feuil1").Range("B2:B" & Sheets("Feuil1").Range("B" & Rows.Count).End(xlUp).Row).Value 'Chargement des données dans une variable tableau
Referentiel = Sheets("Feuil2").Range("A2:A" & Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row).Value 'Chargement du référentiel dans une variable tableau
ReDim Resultats(UBound(Donnees), 1) 'Création d'un tableau vide de même dimension que les données
For i = 1 To UBound(Donnees) 'Boucle sur les données à traiter (de la 1ère à la dernière)
    Resultats(i, 1) = 0 'Pas de correspondance par défaut 'Par défaut on a pas trouvé de correspondance avec le référentiel
    For Each Reference In Referentiel 'Boucle sur le référentiel
        If Donnees(i, 1) Like "*" & Reference & "*" Then 'Si la référence est contenue dans la donnée ("*" remplace n'importe quel caractère), alors...
            Resultats(i, 1) = 1 'Correspondance trouvée, on remplace 0 par 1 dans le tableau des résultats
            Exit For 'On arrête de parcourir le référentiel, puisqu'on a déjà au moins une correspondance
        End If 'Fin de structure SI "Si [condition] alors [instruction(s)]"
    Next Reference 'Fin de structure POUR "Pour [variable] allant de [début] à [fin]"
Next i 'Fin de structure POUR "Pour [variable] allant de [début] à [fin]"
Sheets("Feuil1").Range("C2:C" & Sheets("Feuil1").Range("B" & Rows.Count).End(xlUp).Row).Value = Resultats 'Report des résultats en colonne C

End Sub

D'abord merci beaucoup pour le temps passé à expliquer le code. C'est fort utile.

(Du coup, j'ai découvert Ubound, les boucles de différents type, la concaténation avec l'esperluette...).

___

Bon, comme je débute iI y a une paire de passages que je ne saisis pas trop :

  • la syntaxe de la première ligne avec le "In", comment le logiciel l'interprète-t-il ? Je parle du passage : For Each Reference In Referentiel
    • Je m'attendais à une plage de données ou à un objet comme le tableau référence. Est-ce que ce passage implique une égalité avec la mention In ?
  • Tout juste derrière, il y a ce passage qui me pose problème : If Donnees(i, 1) Like "*" & Reference & "*" Then
    • Comment interpréter les étoiles ? Dans mon cas, je ne comprends pas la syntaxe de l'enchaînement.
  • "Exit For" marque la fin d'une boucle dès qu'on a indiqué qu'une case était égale à 1 c'est ça ? Avant cela, on a pris soin d'entrer 0 dans toutes les cases. C'est bien ça ?

[edit : pour une raison que j'ignore une grande partie de mon message n'a pas été pris en compte lors du premier envoi.]

Il existe plusieurs types de boucle, par exemple :

'Variable numérique sur un intervalle donné :
For VariableNumérique = 10 To 100
    'Blabla
Next VariableNumérique

'Variable de nature diverse selon élément donné :
For Each Element In Collection
    'Blabla
Next Element

Dans le 1er exemple, c'est le cas de la première boucle sur les données. Dans ce cas, la boucle ne parcourt pas directement le tableau, on boucle sur un indice qui nous sert ensuite à travailler sur un élément particulier de la variable tableau. Cela me permet ici de réutiliser cet indice pour travailler sur un second tableau en parallèle (celui des résultats).

Dans le second cas, on boucle directement sur le tableau. Dans ce cas, on demande à parcourir chaque élément d'un ensemble, ici un tableau mais ça pourrait être l'ensemble des feuilles du classeur, une plage contenant plusieurs cellules, un ensemble de plusieurs graphiques, etc. Le In sert donc à définir l'ensemble des éléments à parcourir.

Tu trouveras des explications plus complètes dans les sections de cours du site.

J'ai mis à jour mon message tronqué au-dessus de votre réponse, alors que vous postiez votre réponse.

A cela, je rajoute une vérification : du coup pour faire la même chose sur toutes les feuilles d'un classeur, alors on aurait quelque chose du type :

"For Each sheets In workbook". Mais où faudrait-il le placer ?

Bonjour !

  • Tout juste derrière, il y a ce passage qui me pose problème : If Donnees(i, 1) Like "*" & Reference & "*" Then
    • Comment interpréter les étoiles ? Dans mon cas, je ne comprends pas la syntaxe de l'enchaînement.

* est dans ce cas un caractère générique, qui permet de chercher une correspondance partielle. Il remplace n'importe quel caractère, en quantité variable (s'il n'y a aucun caractère, ça fonctionne aussi). Un bon exemple est plus parlant :

Phrase 1Bonjour Martin Dupont
Phrase 2Il fait beau aujourd'hui
Phrase 3J'aime le jambon
Phrase 4Bon
If phrase Like "bon" Then Msgbox phrase 'Seule la phrase 4 répond au critère (correspondance exacte à "Bon")
If phrase Like "*bon" Then Msgbox phrase 'Les phrases 3 et 4 se terminent par "Bon"
If phrase Like "bon*" Then Msgbox phrase 'Les phrases 1 et 4 commencent par "Bon"
If phrase Like "*bon*" Then Msgbox phrase 'Les phrases 1, 3 et 4 contiennent "Bon"
  • "Exit For" marque la fin d'une boucle dès qu'on a indiqué qu'une case était égale à 1 c'est ça ? Avant cela, on a pris soin d'entrer 0 dans toutes les cases. C'est bien ça ?

Exit for permet une sortie anticipée de la boucle en cours. La sortie "normale" a lieu lorsque l'on est arrivé au dernier élément à parcourir. Si on trouve une correspondance avant (donc résultat = 1), il est inutile de continuer à en trouver une autre pour l'expression en cours. Dans le cas de la macro en question, c'est bien ça, 0 par défaut, si correspondance on remplace par 1 et on arrête la boucle. Mais il faut bien comprendre que le fonctionnement de la boucle est complètement indépendant de la variable résultat. Chaque fois que VBA rencontre l'instruction Next machin, il passe à l'élément suivant. En revanche, pour qu'il rencontre l'instruction Exit For, il faut qu'il soit entré dans la structure If...Then....

Pour bien comprendre le code, je vous invite à l'exécuter en mode pas à pas, à l'aide de la touche F8. Vous pourrez alors mieux comprendre le mode de fonctionnement du code et les valeurs prises par les variables.

J'ai mis à jour mon message tronqué au-dessus de votre réponse, alors que vous postiez votre réponse.

A cela, je rajoute une vérification : du coup pour faire la même chose sur toutes les feuilles d'un classeur, alors on aurait quelque chose du type :

"For Each sheets In workbook". Mais où faudrait-il le placer ?

Le référentiel ne change pas, il n'est pas nécessaire de l'inclure dans la boucle qui parcourt les feuilles. En revanches, les données et résultats changent à chaque feuille et doivent donc être définies à chaque tour de boucle. Il faut également prévoir une instruction spécifique pour sauter la feuille contenant le référentiel (et ne pas la traiter comme une feuille de données à traiter). Je propose donc (non testé) :

Option Base 1
Sub Comparaison()

Dim Donnees() As Variant, Referentiel() As Variant, i As Long, Reference As Variant, Resultats() As Variant, Sh As Worksheet

Referentiel = Sheets("Feuil2").Range("A2:A" & Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row).Value 'Chargement du référentiel
For Each Sh In ThisWorkbook.Worksheets 'Boucle sur les feuilles
    If Not Sh.Name = "Feuil2" Then 'Ignorer feuille référentiel
        Donnees = Sh.Range("B2:B" & Sh.Range("B" & Rows.Count).End(xlUp).Row).Value 'Chargement des données
        ReDim Resultats(UBound(Donnees), 1) 'Initialisation tableau des résultats
        For i = 1 To UBound(Donnees) 'Boucle sur les données à traiter
            Resultats(i, 1) = 0 'Pas de correspondance par défaut
            For Each Reference In Referentiel 'Boucle sur le référentiel
                If Donnees(i, 1) Like "*" & Reference & "*" Then
                    Resultats(i, 1) = 1 'Correspondance trouvée
                    Exit For 'Arrêt anticipé boucle sur référentiel
                End If
            Next Reference
        Next i
        Sh.Range("C2:C" & Sh.Range("B" & Rows.Count).End(xlUp).Row).Value = Resultats 'Report des résultats
    End If
Next Sh

End Sub

Merci beaucoup !

Les explications sont très claires. Je me suis penché sur le code ligne à ligne et… c'est beau.

Alors j'en ai profité pour tester le code pas à pas, et c'est très instructif. J'ai même l'impression d'avoir parcouru des raccourcis dans l'apprentissage grâce à vos "bonnes pratiques" disséminées un peu partout.

_____

Aussi, si je comprends bien le code semble déduire que les lignes du référentiel sont des références, simplement grâce à la ligne "For Each Reference In Referentiel".
Non pas qu'il s'agisse en soi des références mais qu'il associe chaque ligne de Referentiel à Reference. C'est bien ça ?

A la réflexion je ne suis pas certain de comprendre comment il interprète "Reference"

___

Après j'ai un autre souci. C'est que je cherche à pouvoir l'utiliser sur d'autres fichiers similaires
De base, mon fichier n'inclue pas de "feuil2" avec mes mots-clefs. "Feuil2" que je vais essayer de renommer par macro moi-même au passage.
J'ai l'impression qu'il y a plusieurs solutions pour l'appliquer à d'autres fichiers similaires.

1. Si je souhaite partager, ma macro je passe par l'éditeur VBE, j'ouvre mes deux fichiers et je déplace ma macro.
Par contre, je n'arrive pas à déplacer la feuil2 qui est la feuille contenant le référentiel.
Peut-être faut-il ajouter au début de la macro : la création d'une feuille, renommer en "feuil2", ajouter les mots-clefs.

2. Ou plus simple probablement, je peux créer un fichier fixe avec une "feuil2" quelque part sur mon ordinateur.
Et je demande à Excel d'aller chercher cette feuille dans un classeur qu'il trouve sur mon ordinateur d'après un chemin indiqué (C:\Users\LAMA\Documents\Travail\Macro\Fichiers_fixes) et de la copier/insérer dans mon classeur

Qu'en pensez-vous ?

(En tous les cas, je vous remercie infiniment pour les solutions apportées !)

Pour l'histoire de Reference et Référentiel, imaginons que l'on ai travaillé directement sur la plage de cellules plutôt que sur une variable tableau. Ca donne un code du genre :

For Each Cellule In Sheets("Feuil2").Range("A2:A10")
    MsgBox "La cellule " & Cellule.Address & " contient la valeur " & Cellule.Value
Next Cellule

La variable Reference dans la macro, ou Cellule dans l'exemple ci-dessus, pourrait tout aussi bien s'appeler Toto ou Michel, ce n'est pas important. VBA interprètera de lui même sa nature à partir de l'ensemble donné juste après In. Si on donne comme ensemble une plage, la variable correspondra successivement à chaque cellule la composant. Ensuite, c'est à nous de préciser quel élément de la cellule nous intéresse (voir exemple ci-dessus). En général, c'est la valeur qu'elle contient (propriété .Value). Si l'ensemble donné n'est pas une plage mais un tableau, alors la variable correspondra à chaque élément du tableau. Dans ce cas c'est plus simple, il n'y a qu'un seul contenu associé : la valeur.

Pour généraliser la macro, je te conseille déjà de renommer toutes les "Feuil2" dans le code par le vrai nom de la feuille contenant les références. Si le nom varie d'un fichier à l'autre, tu peux également faire référence à son index (sa position) : Sheets(1), Sheets(2), etc. Tu peux ensuite dupliquer le code dans chaque fichier. Il est aussi possible de conserver une seule macro, et de faire une boucle pour ouvrir chaque fichier et appliquer la comparaison sur ses feuilles.

On peut également importer les références depuis un fichier dédié, ce qui rajoute quelques lignes de code.

Merci pour toutes ces précisions !

____

J'ai tenté d'adapter le code. Déjà j'ai réussi à insérer avec un bouton depuis un autre fichier l'onglet la feuille "motsclefs" qui a remplacé les "feuil2".

J'ai essayé d'insérer 3 colonnes après la colonne C dans chaque feuille. Le but est de mettre le résultat dans la troisième colonne (qui ici devrait être la colonne F).

Mais ça n'a pas du tout marché. Il me copie beaucoup trop de colonnes. Au passage, je pense que la syntaxe du code n'est pas terrible.

Mais pour autant je n'arrive pas à identifier l'endroit où je dois placer l'insertion des 3 colonnes. Elles doivent faire partie de la boucle mais probablement juste après la première condition (voir ci-après).

La condition If not par If Cells(1,2) = "Nbre" puisque seules les feuilles du classeur qui doivent être traitées remplissent cette condition.

Sinon, on peut utiliser le nom de la feuille qui contient (like "P3.2*").

Autre question que je me pose. Que se passe-t-il si j'ai une case vide dans ma colonne donnée (colonne C ici).

Option Base 1
Sub Comparaison()

Dim Donnees() As Variant, Referentiel() As Variant, i As Long, Reference As Variant, Resultats() As Variant, Sh As Worksheet

Referentiel = Sheets("motsclefs").Range("A2:A" & Sheets("motsclefs").Range("A" & Rows.Count).End(xlUp).Row).Value 'Chargement du référentiel
For Each Sh In ThisWorkbook.Worksheets 'Boucle sur les feuilles
    If Cells(1, 2) = "Nbre" Then
        'Insertion 3 colonnes

        Columns("D:D").Select
        Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        Columns("E:E").Select
        Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        Columns("F:F").Select
        Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    End If

    If Cells(1, 2) = "Nbre" Then 'Traiter uniquement les P3.2

        Donnees = Sh.Range("C2:C" & Sh.Range("C" & Rows.Count).End(xlUp).Row).Value 'Chargement des données
        ReDim Resultats(UBound(Donnees), 1) 'Initialisation tableau des résultats
        For i = 1 To UBound(Donnees) 'Boucle sur les données à traiter
            Resultats(i, 1) = 0 'Pas de correspondance par défaut
            For Each Reference In Referentiel 'Boucle sur le référentiel
                If Donnees(i, 1) Like "*" & Reference & "*" Then
                    Resultats(i, 1) = 1 'Correspondance trouvée
                    Exit For 'Arrêt anticipé boucle sur référentiel
                End If
            Next Reference
        Next i
        Sh.Range("F2:F" & Sh.Range("B" & Rows.Count).End(xlUp).Row).Value = Resultats 'Report des résultats
    End If
Next Sh

End Sub

Pour la partie "Ajout de 3 colonnes", je crois que je viens de réussir. Ca me paraît un peu laborieux dans la syntaxe. Il y a probablement plus simple.

 Dim Sh As Worksheet, i As Integer

    Sub Ajout3Colonnes()

    'Ajouter trois colonnes
     'Boucle sur toutes les feuilles
        For Each Sh In ThisWorkbook.Worksheets
            Sh.Activate
            ActiveSheet.Range("B1").Select
            If ActiveCell = "Nbre" Then 'Traiter uniquement les P3.2
                'Insérer 3 colonnes en haut de chaque feuille de P3.2
                For i = 1 To 3
                    Sh.Range("C:C").EntireColumn.Insert
                Next i
            End If
        Next Sh

    End Sub

Bonjour,

Je n'ai pas compris l'intérêt d'ajouter 3 colonnes. S'il s'agit juste de placer les résultats plus loin, il suffit tout simplement de ne pas les coller en colonne C, mais en colonne F (et à priori vous avez bien rectifié le code dans ce sens) !

Ensuite sur la forme, il est inutile de "sélectionner" ou "d'activer" un élément pour travailler dessus. A la différence de nous, pauvres humains, VBA n'a pas besoin de "voir" ce sur quoi il travaille, à condition que l'élément manipulé soit bien précisé. Idem, pour insérer 3 colonnes, il n'y a pas besoin de répéter 3 fois l'insertion d'une colonne. Le code retravaillé :

Sub Ajout3Colonnes()

Dim Sh As Worksheet 'Déclarations à faire dans la macro (pas avant)

For Each Sh In ThisWorkbook.Worksheets 'Boucle sur toutes les feuilles
    If Sh.Range("B1") = "Nbre" Then Sh.Range("C:E").Insert 'Insérer 3 colonnes uniquement dans les feuilles P3.2
Next Sh

End Sub

Cette action peut être directement intégrée à la macro originale, plutôt que séparée dans une macro dédiée.

Merci pour les précisions et les corrections ! J'ai tout rajouté à la macro originale

Oui en effet, je m'étais trompé de colonne.

Désormais je cherche à extraire la couleur de mes cases dans une des colonnes créées.

Je cherche à connaître la taille de mon tableau.

La formule utilisée un peu plus haut ne marche pas tout à fait puisqu'il y a des trous dans ma colonne par moment. En revanche, lorsque je sélectionne une cellule (comme B1), et que je fais Ctrl+A, j'arrive à sélectionner l'entièreté du tableau.

Mon but est de connaître ma dernière ligne autrement pour pouvoir appliquer une formule :

- Faire l'équivalent d'un Ctrl +A et associer cette sélection à un tableau (Tab_Max)

- Connaître la dimension max de ce tableau avec Ubound(Tab_Max).

- Coller la fonction NO_COULEUR_HEX_CELL à toute ma colonne D

Dim Tab_Max As Range

For Each Sh In ThisWorkbook.Worksheets 'Boucle sur toutes les feuilles
    Range("B1").Select
        If Cells(1, 2) = "Nbre" Then 'Traiter uniquement les P3.2
            Tab_Max = Range(ActiveCell.CurrentRegion)
            For i = 1 To UBound(Tab_Max)  'Boucle sur la colonne à traiter
                Sh.Range("D2:D" & UBound(Tab_Max)).Formula = NO_COULEUR_HEX_CELL(i)
            Next i
        End If
Next Sh

J'ai une erreur puisqu'un tableau est attendu à l'étape "Ubound".

Pas tout compris sur cette nouvelle demande, peux-tu transmettre un fichier pour illustrer l'objectif ? VBA est-il vraiment nécessaire pour appliquer la fonction ?

En tout cas le code est truffé d'incohérences, mais avant de le retravailler j'aimerais saisir un peu la finalité.

En attendant, voilà le code commenté :

Dim Tab_Max As Range

For Each Sh In ThisWorkbook.Worksheets 'Boucle sur toutes les feuilles
    Range("B1").Select 'Voir commentaire sur l'utilité des "selections" évoqué dans mon post précédent
'Attention, en l'absence de précision, la sélection concerne la feuille active (celle affichée au moment de lancer la macro)
        If Cells(1, 2) = "Nbre" Then 'Idem, on est resté sur la feuille active
            Tab_Max = Range(ActiveCell.CurrentRegion) 'ActiveCell : Active et Select, c'est le mal ! A proscrire autant que possible
'Pour définir une variable correspondant à un objet (comme une plage), on doit précéder l'instruction d'un "Set"
            For i = 1 To UBound(Tab_Max)  'UBound s'utilise sur un tableau, or ta variable n'en est pas un
                Sh.Range("D2:D" & UBound(Tab_Max)).Formula = NO_COULEUR_HEX_CELL(i) 'Idem commentaire précédent par rapport à UBound
'La fonction s'utilise sur une cellule, or "i" ne correspond pas à une cellule, c'est juste un nombre (qui n'a donc pas de couleur)
'Ecrire une fonction Excel via VBA se fait sous forme de texte, voir code produit par l'enregistreur de macro...
            Next i
        End If
Next Sh

Le fichier est en bas du message.

(J'ai créé plusieurs feuilles pour vérifier si mes conditions marchaient bien). Pour l'exercice, tout se passe sur la feuille 2 "Feuil1 (2)"

J'essaye de déterminer la couleur des cases (colorées) et de reporter cette valeur dans la colonne D2 nouvellement créée d'après le code.

Ensuite l'idée de mes deux colonnes suivantes est de copier les cellules en fonction de leur couleur.

exemple : si ma cellule D14 indique un code particulier (correspondant à la couleur qui m'intéresse : rouge) alors on copie la case C14 en E14.
Ce qui doit donner une formule du type =SI(D14=CodeRouge extrait ; E14=C14 ; " ").

5classeur1.xlsm (21.83 Ko)

edit : je suis en train de lire votre code que je viens de voir. J'essaye aussi de clarifier mon besoin si c'est nécessaire. Je vous dis ça rapidement.

Ok, je viens de lire vos commentaires.

  • Je me demande comment on peut définir un tableau. Un tableau est une variable de type "variant" c'est ça ?
  • Par curiosité, pourquoi faut-il éviter Select et Active ? Parce que ce sont des variables absolues c'est ça ?
  • Pour mon besoin : je cherchais à connaître le nombre de lignes de mon grand tableau (qui comporte plus de lignes que de colonnes). Et donc je souhaitais utiliser Ubound pour ça. De là, j'utilisais la valeur du nombre de ligne pour l'appliquer à toute une colonne jusqu'à la ligne maxi. Comme il y a des trous dans ma colonne C, je ne peux pas utiliser cette colonne pour aller à la dernière ligne.
Rechercher des sujets similaires à "verifier contient mot plage"