Bonjour,
Débutante sur VBA, j'aurai besoin de votre aide.
J'aimerai pouvoir dans mon fichier excel mettre la valeur S à toutes les cases qui sont inférieures à 11 , sauriez vous quel code puis je utiliser ?
Merci!
Bonjour,
Débutante sur VBA, j'aurai besoin de votre aide.
J'aimerai pouvoir dans mon fichier excel mettre la valeur S à toutes les cases qui sont inférieures à 11 , sauriez vous quel code puis je utiliser ?
Merci!
Bonjour, par exemple si le tableau commence en "A1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Sub essai() tableau = Range("A1").CurrentRegion For ligne = 1 To UBound(tableau, 1) For colonne = 1 To UBound(tableau, 2) If tableau(ligne, colonne) < 11 Then tableau(ligne, colonne) = "S" Next Next Range("$A$1").Resize(UBound(tableau, 1), UBound(tableau, 2)) = tableau End Sub
Juste une petite remarque au cas où : cela peut se faire soit par mise en forme conditionnelle sans passer par VBA (il vaut mieux éviter si des copier-coller seront effectués par la suite dans la feuille), soit comme l'a proposé a_diard dans une boucle qui change après un test la mise en forme (cette façon de faire est plus robuste) et il est également possible de mettre en place une mise en forme conditionnelle par macro (mais en prenant les précautions nécessaires afin de ne pas tomber dans le travers de la première méthode...).
Concernant les tableaux, la petite subtilité est que par défaut l'indice de départ est 0 (ce qui peut être changé par l'instruction facultative Option Base 1).
LBound donne la borne inférieure d'un tableau, comme UBound donne la borne inférieure. Du coup quand je fais la boucle sur un tableau j'aime bien utiliser les deux. Hésitez pas à me dire pourquoi si quelqu'un trouve ça idiot xD
J'en profite pour rappeler les bienfaits de la fonction recherche (sur le forum et ailleurs) et de la consultation de l'aide d'Excel et de MSDN. (Petite proposition subliminale à l'auteur de la question : crois moi tu vas progresser en cherchant ^^)
Edit :
L'indice de départ des tableaux est 0 par défaut mais celui des lignes et des colonnes est 1. Par conséquent affecter une zone de la feuille de calcul dont la première cellule est A1 va effectivement forcer le changement de base, mais il suffit d'utiliser un autre tableau en base 0 dont les valeurs vont servir à faire des opérations sur les valeurs des cellules du tableau précédent pour potentiellement avoir un souci qui avec un peu de chance ne causera même pas d'erreur donc sera difficile à repérer. D'où ma remarque. Cf complément d'explication dans mon post ci-plus-bas dans cette discussion
Bonjour,
Désolé de te reprendre Nagel Tha mais ce que tu dis là n'est pas totalement juste :
Quand tu affectes à un tableau un Range, la base est toujours 1 et non 0 car il n'existe ni ligne 0 ni colonne 0 !Concernant les tableaux, la petite subtilité est que par défaut l'indice de départ est 0 (ce qui peut être changé par l'instruction facultative Option Base 1).
Il suffit de le tester de cette façon :
A1 doit avoir au moins une cellule voisine non vide même si elle même est vide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Sub Test() Dim Tableau Tableau = Range("A1").CurrentRegion MsgBox LBound(Tableau) End Sub
Bonjour,
Je me suis dit que finalement ça valait un post et non un simple edit.
Cette différence est source de confusions dans deux cas évidents pour moi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub Test() Dim Tableau As Variant Tableau = Range("A1").CurrentRegion Debug.Print LBound(Tableau) 'affiche 1 : A1 est la première cellule de coordonnées (1;1) et il n'en existe pas avant 'L'indice de départ du tableau est donc forcé à 1 Dim Tableau2(2) As Variant Debug.Print LBound(Tableau2) 'affiche 0 : par défaut l'indice de départ des tableaux est 0 et non 1 End Sub
- dans une boucle où les deux tableaux seraient présents
- lorsque l'on fait des opérations entre ces tableaux
C'est pourquoi je proposais de fixer Option Base 1 afin d'éviter toute confusion. Sachant que ce genre de confusions sera potentiellement difficile à débusquer (c'est très simple et évident mais qu'on a le nez dans le code on peut passer des heures à essayer de comprendre le pourquoi du comment et réaliser en revenant dessus des heures plus tard que c'était "aussi simple que ça" finalement ; en tout cas ça m'arrive...).
Voici le même code, avec l'instruction Option Base :
Je le précise pour ceux qui connaissent moins VBA : l'instruction Debug.Print est un outil de débogage qui permet d'afficher ce qui suit (si compatibilité de type bien sûr) directement dans la fenêtre d'exécution qui se trouve de deux manières :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Option Base 1 ' l'indice de départ des tableaux est désormais 1 Sub Test() Dim Tableau As Variant Tableau = Range("A1").CurrentRegion Debug.Print LBound(Tableau) 'affichait 1 sans Option Base 1 et affiche 1 avec Option Base 1 Dim Tableau2(2) As Variant Debug.Print LBound(Tableau2) 'affichait 0 sans Option Base 1 et affiche 1 avec Option Base 1 End Sub
- Affichage > Fenêtre d'exécution
- Ctrl + G
Cette manière de faire présente l'avantage de ne pas sortir de la fenêtre VBA et est plus rapide à exécuter. De plus, elle garde en mémoire les affichages effectués durant la session ouverte ce qui est assez pratique.
Autre remarque : ne pas définir le type de variable va donner le type Variant à cette variable (cependant l'écrire le type rend les choses plus claires). Cependant ici, l'affichage du type de la variable va donner 8204. Explication : 8204 = vbArray + vbVariant, soit un tableau de type Variant. J'ai trouvé l'explication ici (en anglais) : https://stackoverflow.com/questions/...204-for-arrays
Pour ceux qui débutent:
Quelques ressources sur MSDN :
Option Base
Resize
CurrentRegion
Quelques ressources complémentaires de DVP :
Tutoriel sur les tableaux de SilkyRoad
Tutoriel sur les mises en forme conditionnelles de SilkyRoad
FAQ mise en forme conditionnelle
Bonjour,
C'est pour cette raison que j'ai dis :
Quand tu affectes un Range à un tableau ce dernier sera toujours en base 1...ce que tu dis là n'est pas totalement juste
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Salut.
Mon grain de sel…
Jouer avec Option Base est potentiellement dangereux et empêche de réutiliser sans risques le code d'un module dans un autre projet.
Si besoin de fixer l'indice de base du tableau, il est à mon sens préférable de le faire de façon explicite avec dim t(x to y) en précisant le x. On peut ainsi commencer où on le souhaite en fonction de ce que l'on a à faire avec le tableau. On pourrait par exemple avoir Dim t(10 to 29)) pour faire coller l'indice du tableau avec la ligne correspondante d'une plage qui commencerait en ligne 10 d'une feuille.
Comme le dit Theze, le passage d'une plage à un tableau génèrera toujours un tableau de base 1, quelle que soit Option Base en début de module.
Il peut être également intéressant de savoir que si l'on crée un tableau avec la fonction Array(…), la base du tableau dépend de Option Base sauf si on utilise Vba.Array(…) qui génèrera un tableau de base 0 quel que soit Option Base…
C'était donc mon grain de sel…![]()
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Partager