Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
des guillemets dans une Union(Range(... et autres moyens d'expression
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
>> En français : comment fais-je pour sélectionner deux plages de cellules nommées ? (numero1 et numero2 dans mon exemple)
>> De manière générale, je ne comprends pas bien les règles qui régissent l'utilisation des guillemets, des "&", et autres bizarreries qu'on trouve dans les parenthèses... Sauriez-vous ou je peux trouver cela, histoire de ne pas re-déranger tout le monde à chaque fois ?
te donnera la valeur de la cellule sélectionnée.
Pour connaître la syntaxe permettant de nommer une cellule, utilise l'enregistreur de macro.
Et ensuite
Code:
Union(Range("numero1"), Range("numero2")).Select
marchera.
je ne comprends pas bien les règles qui régissent l'utilisation des guillemets, des "&"
Re : des guillemets dans une Union(Range(... et autres moyens d'expression
Bonsoir,
pour repondre à ta question, quand on utilise une variable, on ne met pas de guillemets sinon le code prend ce qu'il y a entre les guillemets au pied de la lettre, Dans ton code :
Code:
Union(Range("numero1"), Range("numero2")).Select
ne peut marcher pour trois raisons :
1) les variables numero1 et numero2 sont entre guillemets
2) elles sont mal définies : quand on définit des plage Range, il vaut mieux déclarer tes variables comme ceci :
Code:
Dim numero1 as Range
et affecter la valeur de la variable comme ceci
Code:
Rows("1:2").Select
Set numero1 = selection
ou plus simplement :
Code:
Set numero1 = Rows("1:2")
3) une plage de type range (définie comme telle) ne peut être appellée par une méthode Range, écrire Range(numero1).Select bugge par contre numero1.Select fonctionne
cette instruction ne faisant pas appel à Range fonctionne
Ces choses obscures s'éclaircissent lorsqu'on les place dans leur contexte.
Code:
Option Explicit
Sub toto()
Union(Rows("1:2"), Range(debut & ":" & fin)).Select
End Sub
provoque une erreur à cause des variables non déclarées que sont debut et fin.
Code:
Sub toto()
Dim debut, fin
Union(Rows("1:2"), Range(debut & ":" & fin)).Select
End Sub
provoque une autre erreur bien que les variables aient été déclarées. Par défaut, ces variables sont de type Variant (indéfini serait correct en Français), et prennent la valeur Empty (vide). Or, "vide:vide" ne peut être une référence reconnue par l'objet Range.
Code:
Sub toto()
Dim debut As String, fin As String
debut = "F3" [COLOR="Green"]'ou tout autre nom de cellule.[/COLOR]
fin = "H7" [COLOR="Green"]'ou tout autre nom de cellule.[/COLOR]
Union(Rows("1:2"), Range(debut & ":" & fin)).Select
End Sub
fonctionne car
Range(debut & ":" & fin)
n'est autre que
Range("F3:H7")
Maintenant, que se passe-t-il avec
Code:
Sub tata()
Dim debut, fin
Dim numero1, numero2
Rows("1:2").Select
numero1 = Selection [COLOR="Green"]'3[/COLOR]
Cells.Find(What:="debut").Activate [COLOR="Green"]'4[/COLOR]
debut = ActiveCell.Row [COLOR="Green"]'5[/COLOR]
Cells.Find(What:="fin").Activate [COLOR="Green"]'6[/COLOR]
fin = ActiveCell.Row [COLOR="Green"]'7[/COLOR]
Rows(debut & ":" & fin).Select [COLOR="Green"]'8[/COLOR]
numero2 = Selection [COLOR="Green"]'9[/COLOR]
Union(Range("numero1"), Range("numero2")).Select [COLOR="Green"]'10[/COLOR]
End Sub
Les variables sont déclarées sans type apparent : ce sont des Variant vides.
À l'exécution, pas de problème jusqu'à la ligne 3. La variablenumero1 prend la valeur de la sélection, mais ne représente pas la sélection. En effet la sélection est un objet Range, ensemble de cellules vides ou non, dotées de formats, couleurs, formules, ... divers et variés. Lorsqu'on écrit
numero1 = Selection
VBA interprète en fait
numero1 = Selection.Value
c'est-à-dire que numero1 représente soit la valeur (texte, nombre, vide...) de la cellule sélectionnée, soit le tableau des valeurs des cellules composant la sélection. Écririez-vous
Range(numero1)
ou
numero1
en ligne 10 que cela n'arrangerait rien : en supposant que vous ayez sélectionné une seule cellule contenant le mot tableur, alors la variable numero1 devient une variable String (chaîne de caractères). Lorsque vous écrivez ensuite
Range(numero1)
vous écrivez
Range("tableur")
et le plantage s'ensuit... ...sauf si une plage nommée "tableur" existe dans le classeur. La même remarque vaut pour
Range("numero1")
(qui ne provoquera pas d'erreur s'il existe une plage nommée "numero1").
Il faut donc modifier la ligne 3 pour que numero1 représente bien la sélection, c'est-à-dire un objet Range avec toutes ses propriétés, ce qui se fait en écrivant
Code:
Set numero1 = Selection
Idem en ligne 9.
Ceci étant fait, la ligne 4 (respectivement 6) a de fortes chances de nous mener à un nouveau plantage : on va cherchez "debut" (resp. "fin"), i.e. le motdebut (resp. fin) dans l'ensemble des cellules de la feuille active. Si aucune cellule ne contient ce mot, la ligne 4 (resp. 6) provoque une erreur. Donc, pour utiliser ce code, il faut s'assurer que le mot debut (resp. fin) figure quelque part dans la feuille.
Supposons pour la suite que la cellule B4 contient debut, et C6 contient fin.
La ligne 4 (resp. 6) sélectionnera la cellule B4 (resp. C6).
Alors la ligne 5 (resp. 7) affectera le numéro de ligne de B4 (resp. C6) à la variabledebut (resp. fin) qu'il ne faut pas confondre avec le motdebut (resp. fin). Les variables debut et fin sont donc des entiers longs valant respectivement 4 et 6.
La ligne 8
Rows(debut & ":" & fin).Select
signifie donc
Rows("4:6").Select
Dès lors qu'on écrira
Union(numero1, numero2).Select
en ligne 10, la procédure tata fonctionnera parfaitement.
Tant qu'à faire, déclarons correctement les variables. On obtient
Code:
Sub tata()
Dim debut As Long, fin As Long
Dim numero1 As Range, numero2 As Range
Rows("1:2").Select
Set numero1 = Selection [COLOR="Green"]'3[/COLOR]
Cells.Find(What:="debut").Activate [COLOR="Green"]'4[/COLOR]
debut = ActiveCell.Row [COLOR="Green"]'5[/COLOR]
Cells.Find(What:="fin").Activate [COLOR="Green"]'6[/COLOR]
fin = ActiveCell.Row [COLOR="Green"]'7[/COLOR]
Rows(debut & ":" & fin).Select [COLOR="Green"]'8[/COLOR]
Set numero2 = Selection [COLOR="Green"]'9[/COLOR]
Union(numero1, numero2).Select [COLOR="Green"]'10[/COLOR]
End Sub
Le classeur joint vous permet de vérifier tout ça.
En conclusion, je dirai qu'il convient de prendre le temps de l'analyse et se donner la peine de toujours déclarer les variables en les typant le plus précisément possible. Le recours au type 'Variant' "parce qu'on ne sait pas trop ce qui va passer" est certainement le meilleur moyen de se planter et de perdre un temps bien supérieur à celui que demande la réflexion nécessaire à l'analyse.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.