Vérifier si une cellule contient un mot d'une plage de cellules
Ok c'est plus clair, dans ce cas j'opterais plus pour quelque chose du genre :
For i = 2 To Sh.Range("B" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes
Select Case Sh.Range("C" & i).Interior.Color 'Selon couleur fond
Case 5296274 'Vert
'Instruction(s)
Case 6740479 'Jaune
'Instruction(s)
Case 255 'Rouge
Sh.Range("E" & i) = Sh.Range("C" & i) 'Report valeur en colonne E
End Select
Next iLe code révisé de la macro globale (inutile de parcourir plusieurs fois les mêmes feuilles et vérifier à chaque fois la présence de "Nbre") :
Option Base 1
Sub Comparaison()
Dim Donnees() As Variant, Referentiel() As Variant, i As Long, Reference As Variant, Resultats() As Variant, Sh As Worksheet, FeuilleActuelle As Object, Tab_Max As Range
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 toutes les feuilles
If Sh.Range("B1") = "Nbre" Then
'FORMATAGE FEUILLE============
Sh.Range("D:G").Insert 'Insérer 4 colonnes uniquement dans les feuilles P3.2
'Créer des en-têtes des 4 nouvelles colonnes
Sh.Cells(1, 4).Value = "Code Hexa Couleur"
Sh.Cells(1, 5).Value = "Adresse Verte"
Sh.Cells(1, 6).Value = "Adresse Bleue"
Sh.Cells(1, 7).Value = "Résultats du Tri"
'REPORT DONNEES SELON COULEUR CELLULE============
For i = 2 To Sh.Range("B" & Rows.Count).End(xlUp).Row 'Boucle sur les lignes
Select Case Sh.Range("C" & i).Interior.Color
Case 5296274 'Vert
'Instruction(s)
Case 6740479 'Jaune
'Instruction(s)
Case 255 'Rouge
Sh.Range("E" & i) = Sh.Range("C" & i) 'Report valeur en colonne E
End Select
Next i
'RECHERCHE DES CORRESPONDANCES AVEC REFERENTIEL===========
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: Exit For 'Correspondance trouvée
Next Reference
Next i
Sh.Range("G2:G" & Sh.Range("B" & Rows.Count).End(xlUp).Row).Value = Resultats 'Report des résultats
End If
Next Sh
End SubOk, 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.
Je crois que vous n'avez pas intégré le principe des variables tableau (variable tableau ≠ tableau Excel), oubliez les pour l'instant ce n'est pas primordial. Le type d'une variable tableau peut être Variant, mais pas uniquement (par exemple String si tous les éléments du tableau correspondent à du texte, Integer si ce n'est que des entiers, etc).
Comme expliqué précédemment, Select et Activate reproduisent ce que nous faisons en temps qu'utilisateur : par exemple sélectionner une cellule avant de la modifier. Mais VBA n'a pas besoin de ça pour travailler sur un élément, et souvent ces instructions alourdissent le code et sont source d'erreur. Dans votre cas par exemple, vous ne sélectionniez pas la cellule B2 de la feuille Sh utilisée par la boucle, mais bien de la feuille active au moment du lancement de la macro.
Une des possibilités pour déterminer la dernière ligne utilisée dans un classeur est ce type d'instruction (par ailleurs déjà utilisée dans la macro) :
Sh.Range("B" & Rows.Count).End(xlUp).Row 'N° de la dernière ligne utilisée en colonne BOk, je croyais que le bout de code de la dernière ligne était l'équivalent des Ctrl+FlècheHaut ou Ctrl+FlècheBas qui s'arrêtent lorsqu'il y a des cases vides.
Sh.Range("B" & Rows.Count).End(xlUp).RowSi j'essaye de traduire pas à pas la ligne de code du dessus... On s'intéresse à la valeur d'une plage de cette feuille Sh.Range(X).Value.
Je vois la concaténation entre la colonne B et un comptable de ligne. Mais j'ai du mal à comprendre la suite puisque je ne comprends pas comment fonctionne la suite. J'imagine vaguement qu'il va à la fin (End), et qu'il remonte vers le haut de la colonne.
Merci pour le nettoyage et les précisions sur le code.
Il faut que je rajoute les instructions selon le modèle que vous avez indiqué. Par contre, je ne sais pas comment vous avez obtenu le code couleur. Je pense qu'il s'agit d'une autre fonction que celle que j'utilisais (mais la fonction n'a pas d'importance). J'ai juste besoin de savoir comment on arrive à ce code couleur.
Autrement, je retiens la fonction Select Case lorsqu'il y a un grand nombre de conditions. Je ne comprends pas tout à fait la structure cela dit. On devine que les conditions sont en dessous (ici le code couleur). Est-ce qu'il sélectionne et applique les instructions pour chaque cellule = à la valeur indiquée ?
Merci !
Bonjour
Ok, je croyais que le bout de code de la dernière ligne était l'équivalent des Ctrl+FlècheHaut ou Ctrl+FlècheBas qui s'arrêtent lorsqu'il y a des cases vides.
Sh.Range("B" & Rows.Count).End(xlUp).RowSi j'essaye de traduire pas à pas la ligne de code du dessus... On s'intéresse à la valeur d'une plage de cette feuille
Sh.Range(X).Value.Je vois la concaténation entre la colonne B et un comptable de ligne. Mais j'ai du mal à comprendre la suite puisque je ne comprends pas comment fonctionne la suite. J'imagine vaguement qu'il va à la fin (End), et qu'il remonte vers le haut de la colonne.
Oui cette instruction reproduit bien Ctrl+Flèche Haut, qui à l'inverse de Ctrl+Flèche Bas n'est pas perturbé par des cellules vides puisqu'il s'arrête à la première cellule complétée rencontrée (donc la dernière). Détaillée, cette instruction se place en dernière ligne de la colonne B (le nombre de ligne max dépend de la version d'Excel, donc on utilise Rows.Count pour le déterminer). .End(xlUp) est équivalent à Ctrl+Flèche Haut, et .Row renvoie le n° de la ligne de la cellule obtenue.
Il faut que je rajoute les instructions selon le modèle que vous avez indiqué. Par contre, je ne sais pas comment vous avez obtenu le code couleur. Je pense qu'il s'agit d'une autre fonction que celle que j'utilisais (mais la fonction n'a pas d'importance). J'ai juste besoin de savoir comment on arrive à ce code couleur.
J'ai utilisé une macro dédiée qui reprend la même syntaxe : Sh.Range("C" & i).Interior.Color pour déterminer le code correspondant aux couleurs utilisées. En fait, pour être précis, j'ai fait une fonction personnalisée (qui s'utilise ensuite comme une fonction classique Excel) :
Public Function CodeCouleur(Cellule As Range) As Long
CodeCouleur = Cellule.Interior.Color
End FunctionAutrement, je retiens la fonction
Select Caselorsqu'il y a un grand nombre de conditions. Je ne comprends pas tout à fait la structure cela dit. On devine que les conditions sont en dessous (ici le code couleur). Est-ce qu'il sélectionne et applique les instructions pour chaque cellule = à la valeur indiquée ?
Select Case [variable]
Case [Valeur1], [Valeur2]
'Instruction(s) si variable = Valeur1 ou variable = Valeur2
Case [Valeur3]
'Instruction(s) si variable = Valeur3
Case Else
'Instruction(s) pour toute autre valeur
End SelectSelect Case ne permet pas à lui tout seul d'appliquer des instructions sur chaque cellule concernée. Il sert juste à déclencher l'exécution d'instructions spécifiques en fonction de la valeur prise par une variable. C'est une structure proche de If...Then...Else, qui permet d'éviter certaines redondances.
C'est super clair ! Je vous remercie pour ces explications. Je finirai cette macro la semaine prochaine. :)
Bon week-end !