VBA : déclarer des plages multiples en une plage
Résolu
stitchbouck
Messages postés
135
Date d'inscription
Statut
Membre
Dernière intervention
-
stitchbouck Messages postés 135 Date d'inscription Statut Membre Dernière intervention -
stitchbouck Messages postés 135 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un classeur avec de multiples onglets comptant différents tableaux aux mesures différentes et je fais un bouton d'effacement de toutes les données de tous les tableaux.
Est-il possible dans une déclaration de plage de rassembler en 1 seule déclaration tous mes noms de plages pour ne faire qu'une seule commande ?
Là, j'ai tout déclaré et chaque plage possède sa propre commande, identique finalement à la plage précédente et suivante à savoir ".clearcontents" (extrait du code). ça fonctionne. :
Je cherche un moyen de tout rassembler, je pensais rajouter ça mais ça ne fonctionne pas :
C'est probablement ridicule, mais j'ai essayé avec + comme pour un calcul, et And aussi au cas où, sans résultat...
Est-ce seulement possible ??
Merci !!
J'ai un classeur avec de multiples onglets comptant différents tableaux aux mesures différentes et je fais un bouton d'effacement de toutes les données de tous les tableaux.
Est-il possible dans une déclaration de plage de rassembler en 1 seule déclaration tous mes noms de plages pour ne faire qu'une seule commande ?
Là, j'ai tout déclaré et chaque plage possède sa propre commande, identique finalement à la plage précédente et suivante à savoir ".clearcontents" (extrait du code). ça fonctionne. :
Sub EraseAll()
Dim SOdR As Worksheet
Set SOdR = Sheets("Ordre de relevé")
Dim SC As Worksheet
Set SC = Sheets("Cuve")
Dim SSTE As Worksheet
Set SSTE = Sheets("Stock TE")
Dim PlageSODR As Range
Dim PlageSC As Range
Dim PlageSSTE As Range
Set PlageSODR = Union(SOdR.Range("B6:x61"), SOdR.Range("z6:Al61"), SOdR.Range("an6:bl61"), SOdR.Range("bn6:cs61"))
Set PlageSC = Union(SC.Range("B12:C68"), SC.Range("e12:f68"), SC.Range("h12:i68"))
Set PlageSSTE = SSTE.Range("B5:h60")
PlageSODR.ClearContents
PlageSC.ClearContents
PlageSSTE.ClearContents
End Sub
Je cherche un moyen de tout rassembler, je pensais rajouter ça mais ça ne fonctionne pas :
Dim Allplages as range
set Allplages = PlageSODR & PlageSC & PlageSSTE
Allplages.clearcontents
C'est probablement ridicule, mais j'ai essayé avec + comme pour un calcul, et And aussi au cas où, sans résultat...
Est-ce seulement possible ??
Merci !!
A voir également:
- Vba union multiple ranges
- Trait d'union insécable word - Guide
- Ecran multiple pc - Guide
- Excel cellule choix multiple - Guide
- Copier coller multiple - Guide
- C2002 western union - Forum Vos droits sur internet
16 réponses
Bonjour,
tu pourrais nommer tes plages et boucler sur les noms pour les détecter et les effacer.
Mais pour 3 ça ne vaut vraiment pas le coup.
eric
tu pourrais nommer tes plages et boucler sur les noms pour les détecter et les effacer.
Mais pour 3 ça ne vaut vraiment pas le coup.
eric
Bonjour,
J'avais tellement planché dessus il y a 2 ans que je peux t'affirmer qu'à ma connaissance il n'est pas possible de "former" une plage avec des plages différentes de différentes feuilles.
Le Clearcontents ne s'effectuera que sur la feuille active.
Si les plages étaient sur la même feuille c'est faisable mais pas sur différentes feuilles (en parlant bien de plages différentes bien sur).
Bonne journée
J'avais tellement planché dessus il y a 2 ans que je peux t'affirmer qu'à ma connaissance il n'est pas possible de "former" une plage avec des plages différentes de différentes feuilles.
Le Clearcontents ne s'effectuera que sur la feuille active.
Si les plages étaient sur la même feuille c'est faisable mais pas sur différentes feuilles (en parlant bien de plages différentes bien sur).
Bonne journée
pour 10, ça peut se discuter
Effacer toutes les plages nommées dont le nom commence par Plage :
avec pour autre avantage que si le plages évoluent (en taille ou en nombre) il n'y a que les noms à modifier, le code reste inchangé.
eric
Effacer toutes les plages nommées dont le nom commence par Plage :
Dim nm As Name, tmp For Each nm In ThisWorkbook.Names If Left(LCase(nm.Name), 5) = "plage" Then tmp = Split(Mid(nm.RefersTo, 2), "!") Worksheets(tmp(0)).Range(tmp(1)).ClearContents End If Next nm
avec pour autre avantage que si le plages évoluent (en taille ou en nombre) il n'y a que les noms à modifier, le code reste inchangé.
eric
Bonjour,
Ou alors, en saisissant, dans l'ordre, un Array Feuille et un Array Plage, on y parvient.
Ou alors, en saisissant, dans l'ordre, un Array Feuille et un Array Plage, on y parvient.
Sub EraseAll() Dim WshName As Variant, RngAddress As Variant, i As Integer WshName = Array("Feuil2", "Feuil6", "Feuil4", "Feuil3", "Feuil5", "Feuil1") RngAddress = Array("A2:F18", "B6:X61, Z6:AL61", "B12:C68, e12:f68, h12:i68", "A1", "R190:PP191", "$C$2:$C$11,$E$7:$E$11,$G$11") For i = LBound(WshName) To UBound(WshName) With Worksheets(WshName(i)) .Range(RngAddress(i)).ClearContents End With Next i End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
OK merci à tous les deux pour vos retours !!
Bon, ça va j'ai 10 feuilles en tout et donc 10 tableaux, ça reste gérable.
Je ne vais donc pas m'arracher les cheveux là-dessus, ce n'était que de la recherche
d'estético-efficacité, ça fonctionne très bien en décomposant chaque plage.
Merci à vous !
Bon, ça va j'ai 10 feuilles en tout et donc 10 tableaux, ça reste gérable.
Je ne vais donc pas m'arracher les cheveux là-dessus, ce n'était que de la recherche
d'estético-efficacité, ça fonctionne très bien en décomposant chaque plage.
Merci à vous !
Encore plus simple, avec des adresses de Range qui incluent le nom de la feuille...
Exemple :
Exemple :
Dim MesPlages As Variant, i As Integer MesPlages = Array("Feuil2!$B$5,$E$13,$C$5:$D$13", "Feuil1!$A$1", "Feuil3!B12:C68, e12:f68, h12:i68") For i = LBound(MesPlages) To UBound(MesPlages) Range(MesPlages(i)).ClearContents Next
Bonjour !!
comme dis, on est mardi et j'ai pu essayer tout ça. la seule que j'arrive à faire fonctionner c'est celle de Pijaku !! Et comme pour les trois, il m'a d'abord fallu décrypter, partiellement au moins, ce qu'il se passe.
Celle de Franck, il me fait une "erreur range de l'objet global a échoué" sur la ligne
Range(MesPlages(i)).ClearContents
Je le fais sur un classeur neuf, 3 feuilles créées. SI je lis bien, c'est une contraction de ce que propose Pijaku, c'est ça ?
Celle d'Eric, il ne me dit pas d'erreur, mais après le "then" il va directe au end if, et passe au nom suivant, avec le même résultat.
Sur un classeur neuf, j'ai fait 3 plages nommées type "essai1", "essai2" etc... via gestionnaire et via référence. On voit au pas à pas qu'il comprend bien qu'il y a 3 noms, mais ils ne répondent pas au critères du if, critères que je ne comprends pas non plus...
En fait, si c'est possible, je veux bien une explication, pour mon apprentissage. ce que je trouve sur le net ne veut rien dire dans ce cas présent. je trouve pour Left(LCase : recherche le caractère le plus à gauche, et convertit-le en minuscule... m'est avis qu'il y a quelque chose qui m'échappe^^
Pour les 2 j'ai mis dans un module... c'est peut-être ça qui ne va pas ?
comme dis, on est mardi et j'ai pu essayer tout ça. la seule que j'arrive à faire fonctionner c'est celle de Pijaku !! Et comme pour les trois, il m'a d'abord fallu décrypter, partiellement au moins, ce qu'il se passe.
Celle de Franck, il me fait une "erreur range de l'objet global a échoué" sur la ligne
Range(MesPlages(i)).ClearContents
Je le fais sur un classeur neuf, 3 feuilles créées. SI je lis bien, c'est une contraction de ce que propose Pijaku, c'est ça ?
Celle d'Eric, il ne me dit pas d'erreur, mais après le "then" il va directe au end if, et passe au nom suivant, avec le même résultat.
Sur un classeur neuf, j'ai fait 3 plages nommées type "essai1", "essai2" etc... via gestionnaire et via référence. On voit au pas à pas qu'il comprend bien qu'il y a 3 noms, mais ils ne répondent pas au critères du if, critères que je ne comprends pas non plus...
En fait, si c'est possible, je veux bien une explication, pour mon apprentissage. ce que je trouve sur le net ne veut rien dire dans ce cas présent. je trouve pour Left(LCase : recherche le caractère le plus à gauche, et convertit-le en minuscule... m'est avis qu'il y a quelque chose qui m'échappe^^
Pour les 2 j'ai mis dans un module... c'est peut-être ça qui ne va pas ?
Bonjour,
ma proposition teste si les noms commencent par "plage".
Si tu les nommes "essai" il faut adapter en ce sens.
prend les 5 caractères de gauche
Je converti en minuscule car vba y est sensible. Ainsi que tu aies nommé "essai" ou "Essai" ou "EsSaI", il détectera le nom.
Exemple : https://www.cjoint.com/c/JLwltl7RT8r
Pour les 2 j'ai mis dans un module... c'est peut-être ça qui ne va pas ?
tes plages étant sur différentes feuilles c'est même préférable.
En tous cas, félicitation pour ta ténacité à vouloir comprendre les différentes propositions. Si tous les demandeurs pouvaient être comme toi ! :-)
eric
ma proposition teste si les noms commencent par "plage".
Si tu les nommes "essai" il faut adapter en ce sens.
Left(xxxx, 5)
prend les 5 caractères de gauche
Je converti en minuscule car vba y est sensible. Ainsi que tu aies nommé "essai" ou "Essai" ou "EsSaI", il détectera le nom.
Exemple : https://www.cjoint.com/c/JLwltl7RT8r
Pour les 2 j'ai mis dans un module... c'est peut-être ça qui ne va pas ?
tes plages étant sur différentes feuilles c'est même préférable.
En tous cas, félicitation pour ta ténacité à vouloir comprendre les différentes propositions. Si tous les demandeurs pouvaient être comme toi ! :-)
eric
haaaa mais ok j'avais mal compris !! oui, donc je continue de les nommer "plage" mais via gestionnaire de nom.
ok pour la sensibilité !
Merci :) En même temps ça me sert de base pour continuer et remployer ces codes, mais si je ne les ai pas compris, c'est bien plus chaud pour les remployer^^.
et je viens de voir que Franck = Pijaku lol ! je me disais, "mais bon sang, j'ai bien vu un Franck quelque part !!"
Oui parce que la, en revanche, autant la méthode "longue" fonctionne autant la "raccourcie" ne veut rien savoir.
En tout cas merci à tous !! c'est quand même plus propre, moins redondant quoi.
ok pour la sensibilité !
Merci :) En même temps ça me sert de base pour continuer et remployer ces codes, mais si je ne les ai pas compris, c'est bien plus chaud pour les remployer^^.
et je viens de voir que Franck = Pijaku lol ! je me disais, "mais bon sang, j'ai bien vu un Franck quelque part !!"
Oui parce que la, en revanche, autant la méthode "longue" fonctionne autant la "raccourcie" ne veut rien savoir.
En tout cas merci à tous !! c'est quand même plus propre, moins redondant quoi.
bonjour,
Sauf que je suis sur un classeur neuf :) donc en Feuil1 etc...
Je copie colle ce code, et ça ne fonctionne pas. A la ligne avant Next, il m'indique une erreur : erreur d'exécution 1004 - la méthode "range" de l'objet "_global" a échoué.
Sur ce même classeur tout neuf, je colle votre 1er code
Elle fonctionne sans erreurs. j'ai pu l'adapter sans problème, d'ailleurs, merci :)
Pour en revenir à la seconde, j'imagine que chez vous elle fonctionne tel quel non ? alors pourquoi chez moi, classeur neuf et macro activée, elle indique une erreur ? il ya 6 feuilles de créées sur le classeur, donc je sais que ça ne vient pas de là...
J'ai essayé aussi en ajoutant "i" au next, comme sur la macro longue mais ça ne change rien.
... J'ai même relancé le pc, des fois ça lui fait du bien... aucune variation.
Je dis ça pour info, parce que comme dit plus haut, j'ai adapté le 1er code. C'est juste de la curiosité ! :p
Sauf que je suis sur un classeur neuf :) donc en Feuil1 etc...
Sub essai()
Dim MesPlages As Variant, i As Integer
MesPlages = Array("Feuil2!$B$5,$E$13,$C$5:$D$13", "Feuil1!$A$1", "Feuil3!B12:C68, e12:f68, h12:i68")
For i = LBound(MesPlages) To UBound(MesPlages)
Range(MesPlages(i)).ClearContents
Next
End Sub
Je copie colle ce code, et ça ne fonctionne pas. A la ligne avant Next, il m'indique une erreur : erreur d'exécution 1004 - la méthode "range" de l'objet "_global" a échoué.
Sur ce même classeur tout neuf, je colle votre 1er code
Sub EraseAll()
Dim WshName As Variant, RngAddress As Variant, i As Integer
WshName = Array("Feuil2", "Feuil6", "Feuil4", "Feuil3", "Feuil5", "Feuil1")
RngAddress = Array("A2:F18", "B6:X61, Z6:AL61", "B12:C68, e12:f68, h12:i68", "A1", "R190:PP191", "$C$2:$C$11,$E$7:$E$11,$G$11")
For i = LBound(WshName) To UBound(WshName)
With Worksheets(WshName(i))
.Range(RngAddress(i)).ClearContents
End With
Next i
End Sub
Elle fonctionne sans erreurs. j'ai pu l'adapter sans problème, d'ailleurs, merci :)
Pour en revenir à la seconde, j'imagine que chez vous elle fonctionne tel quel non ? alors pourquoi chez moi, classeur neuf et macro activée, elle indique une erreur ? il ya 6 feuilles de créées sur le classeur, donc je sais que ça ne vient pas de là...
J'ai essayé aussi en ajoutant "i" au next, comme sur la macro longue mais ça ne change rien.
... J'ai même relancé le pc, des fois ça lui fait du bien... aucune variation.
Je dis ça pour info, parce que comme dit plus haut, j'ai adapté le 1er code. C'est juste de la curiosité ! :p
Hello,
En effet, je n'avais pas assez poussé mes tests, cette méthode ne fonctionne pas avec des Range "disjoints". Ex : "Feuil2!$B$5,$E$13,$C$5:$D$13"
Il faut, pour l'utiliser, séparer les adresses, comme ceci :
En effet, je n'avais pas assez poussé mes tests, cette méthode ne fonctionne pas avec des Range "disjoints". Ex : "Feuil2!$B$5,$E$13,$C$5:$D$13"
Il faut, pour l'utiliser, séparer les adresses, comme ceci :
Sub essai() Dim MesPlages As Variant, i As Integer MesPlages = Array("Feuil2!$B$5", "Feuil2!$E$13", "Feuil2!$C$5:$D$13", "Feuil1!$A$1", "Feuil3!B12:C68", "Feuil3!E12:F68", "Feuil3!H12:I68") For i = LBound(MesPlages) To UBound(MesPlages) Range(MesPlages(i)).ClearContents Next End Sub
ha oui, nickel !! ok donc chaque plage doit avoir son nom de feuille systématiquement.
Compris,
Merci !!
Compris,
Merci !!
J'ai essayé autre chose mais je ne sais pas si c'est à mettre sur un post résolu.
J'ai essayé, au lieu de nettoyer les cellules, de les copier (pour d'autres travaux sans lien avec celui-là), mais je ne sais pas trop vers quelle syntaxe me tourner...
J'ai un peu la même problématique, à savoir plusieurs feuilles en déclaration, plusieurs plages aux quelles j'applique les mêmes commandes mais pas pour les mêmes destinations. Et qui dit copier dit coller...
Du coup, ça me paraissait bien, mais je n'arrive pas à l'appliquer. Là j'essai de copier les cellules feuille 2 b5 et feuille 2 e13 vers feuille 3 a1 et feuille 3 a5 ; pour l'exemple évidemment, car sinon c'est plus gros que juste 2 cellules :)
Je m'en sors avec un code fonctionnel mais très redondant (extrait du code, pour un exemple concret) :
C'est toujours le même problème quand on s'y connait pas beaucoup, on bute sur des cailloux ! :)
J'ai essayé, au lieu de nettoyer les cellules, de les copier (pour d'autres travaux sans lien avec celui-là), mais je ne sais pas trop vers quelle syntaxe me tourner...
J'ai un peu la même problématique, à savoir plusieurs feuilles en déclaration, plusieurs plages aux quelles j'applique les mêmes commandes mais pas pour les mêmes destinations. Et qui dit copier dit coller...
Du coup, ça me paraissait bien, mais je n'arrive pas à l'appliquer. Là j'essai de copier les cellules feuille 2 b5 et feuille 2 e13 vers feuille 3 a1 et feuille 3 a5 ; pour l'exemple évidemment, car sinon c'est plus gros que juste 2 cellules :)
Sub essai()
Dim MesPlages As Variant, i As Integer
MesPlages = Array("Feuil2!$B$5", "Feuil2!$E$13")
Mesplages2 = array("Feuil3!a1", "feuil3!a5")
For i = LBound(MesPlages) To UBound(MesPlages)
Range(MesPlages(i)).copy
Next
Range(mesplages2).paste
End Sub
Je m'en sors avec un code fonctionnel mais très redondant (extrait du code, pour un exemple concret) :
Sub mail_frn()
Dim SHPa As Worksheet
Set SHPa = ThisWorkbook.Worksheets("Projet abonnement")
Dim SHLFRN As Worksheet
Set SHLFRN = ThisWorkbook.Worksheets("Liste FRN")
Dim FR1 As Worksheet
Set FR1 = ThisWorkbook.Worksheets("FRN1")
Dim FR2 As Worksheet
Set FR2 = ThisWorkbook.Worksheets("FRN2")
Dim Plagefrn1 As Range
Set Plagefrn1 = SHPa.Range("A4:q20")
Dim Plagefrn2 As Range
Set Plagefrn2 = SHPa.Range("a23:q46")
Application.ScreenUpdating = False
If SHPa.Cells(3, 3) = SHLFRN.Columns(1).Find(What:=SHPa.Cells(3, 3), LookAt:=xlPart) Then
Plagefrn1.Copy
FR1.Activate
Cells(1, 1).Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'Cells.Select
'Selection.Clear
End If
If SHPa.Cells(22, 3) = SHLFRN.Columns(1).Find(What:=SHPa.Cells(22, 3), LookAt:=xlPart) Then
Plagefrn2.Copy
FR2.Activate
Cells(1, 1).Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'Cells.Select
'Selection.Clear
End If
End Sub
C'est toujours le même problème quand on s'y connait pas beaucoup, on bute sur des cailloux ! :)
Voilà, ton sujet est marqué "NON RESOLU".
Ceci étant, maintenant, si tu veux bien nous décrire précisément ce que doit faire ta macro.
Du genre :
> je veux copier Feuil1 A5:B6 vers feuil3 A6
> etc...
Donne nous tous les détails de ce que tu ferais manuellement.
Ceci étant, maintenant, si tu veux bien nous décrire précisément ce que doit faire ta macro.
Du genre :
> je veux copier Feuil1 A5:B6 vers feuil3 A6
> etc...
Donne nous tous les détails de ce que tu ferais manuellement.
Ok, cool ! bon alors je termine d'abord cette version "courte" pour la poster, parce que sinon ça va être compliqué de tout expliquer. Je pourrais m'appuyer dessus pour illustrer ses fonctions et montrer où je pêche !
Merci en tout cas !!
Merci en tout cas !!
BOnjour,
à la réflexion je vais clore ce sujet-ci car le prochain n'a finalement pas de rapport direct (comme dit avant, c'est un autre dossier que je mène, et les embranchements sont trop variés).
Pour celui-là, c'est bon et j'ai même réussi à faire fonctionner les 3 méthodes. D'ailleurs, pour le nom des feuilles, pas d'espace ! il n'aime pas du tout. J'ai renommer toutes mes feuilles avec des underscores et hop, tout s'est bien passé.
Dès que j'ai fini, je posterai ici un lien vers le sujet suivant...
Un très grand merci pour votre aide, et votre patience !!
à la réflexion je vais clore ce sujet-ci car le prochain n'a finalement pas de rapport direct (comme dit avant, c'est un autre dossier que je mène, et les embranchements sont trop variés).
Pour celui-là, c'est bon et j'ai même réussi à faire fonctionner les 3 méthodes. D'ailleurs, pour le nom des feuilles, pas d'espace ! il n'aime pas du tout. J'ai renommer toutes mes feuilles avec des underscores et hop, tout s'est bien passé.
Dès que j'ai fini, je posterai ici un lien vers le sujet suivant...
Un très grand merci pour votre aide, et votre patience !!
haa c'était ça. ok, merci.
Bon comme dit, ci dessous le lien pour un nouveau sujet évoqué ici... Et au final, j'ai l'impression qu'il n'y a pas de rapport. Enfin, de mon point de vu de béotien^^
https://forums.commentcamarche.net/forum/affich-37031464-envoi-de-plusieurs-mails-selon-tableau-dynamique?fn2EzC74UE1goTEuLFA_HUZm9xdP6R0zDz0CyyiN0jY
Quoiqu'il en soit, merci à vous pour l'aide déjà apporté.
Bon comme dit, ci dessous le lien pour un nouveau sujet évoqué ici... Et au final, j'ai l'impression qu'il n'y a pas de rapport. Enfin, de mon point de vu de béotien^^
https://forums.commentcamarche.net/forum/affich-37031464-envoi-de-plusieurs-mails-selon-tableau-dynamique?fn2EzC74UE1goTEuLFA_HUZm9xdP6R0zDz0CyyiN0jY
Quoiqu'il en soit, merci à vous pour l'aide déjà apporté.