des guillemets dans une Union(Range(... et autres moyens d'expression

  • Initiateur de la discussion Initiateur de la discussion Cipic
  • Date de début Date de début

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 !

C

Cipic

Guest
De manière un peu brute pardonnez moi :

Pourquoi
Code:
Union(Rows("1:2"), Range(debut & ":" & fin)).Select

marche, alors que

Code:
    Rows("1:2").Select
    numero1 = Selection
    
        Cells.Find(What:="debut").Activate
        debut = ActiveCell.Row
        Cells.Find(What:="fin").Activate
        fin = ActiveCell.Row
        
    Rows(debut & ":" & fin).Select
    numero2 = Selection

    Union(Range("numero1"), Range("numero2")).Select

ne marche pas ?

>> 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 ?

Merci beaucoup !
 
Re : des guillemets dans une Union(Range(... et autres moyens d'expression

Bonsoir,

>> En français : comment fais-je pour sélectionner deux plages de cellules nommées ? (numero1 et numero2 dans mon exemple)
Ceci:
Code:
numero1 = Selection
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 "&"
Les 2 vont de paires. Cela permet d'ajouter du texte dans une instruction VBA.
En reprenant par exemple ton code:
Code:
Cells.Find(What:=[B]"[/B]debut[B]"[/B]).Activate
Ici les guillemets indique du texte (donnée brut)
Code:
Cells.Find(What:=debut).Activate
Le fait d'enlever les guillemets signifie que debut est une variable.
Ceci marchera aussi:
Code:
Cells.Find(What:=variable & "fin").Activate
et autres bizarreries qu'on trouve dans les parenthèses...
Par exemple?
 
Dernière édition:
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
Code:
Union(numero1, numero2).Select

J'espère avoir été clair

A+

edit bonsoir Mr Skoobi
 
Dernière édition:
Re : des guillemets dans une Union(Range(... et autres moyens d'expression

Bonsoir à tous.
Ayant naguère eu quelques soucis avec les questions soulevées par Cipic, je vais essayer de lui faire une réponse approfondie en décortiquant
Code:
Union(Rows("1:2"), Range(debut & ":" & fin)).Select
et
Code:
Rows("1:2").Select
    numero1 = Selection
    
        Cells.Find(What:="debut").Activate
        debut = ActiveCell.Row
        Cells.Find(What:="fin").Activate
        fin = ActiveCell.Row
        
    Rows(debut & ":" & fin).Select
    numero2 = Selection

    Union(Range("numero1"), Range("numero2")).Select
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 variable numero1 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 mot debut (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 variable debut (resp. fin) qu'il ne faut pas confondre avec le mot debut (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.​
Bon courage et bonne nuit !
ROGER2327
 

Pièces jointes

- 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.
Retour