VBA : déclarer des plages multiples en une plage

Résolu/Fermé
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 - Modifié le 16 déc. 2020 à 10:30
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 - 7 janv. 2021 à 09:03
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. :


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

16 réponses

eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 238
16 déc. 2020 à 11:53
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
1
ptitpanda Messages postés 65 Date d'inscription dimanche 5 août 2012 Statut Membre Dernière intervention 8 avril 2023 8
16 déc. 2020 à 12:45
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
1
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 238
16 déc. 2020 à 16:45
pour 10, ça peut se discuter
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
1
Bonjour,

Merci pour ce retour, je ne connais pas du tout ces commandes.
je vais donc tâtonner un peu et reviendrais vers vous si quelque chose m'échappe, mais si je comprends bien, je dois effacer et remplacer mes "Set Plage..." par des " Set nm" ?

Merci :)
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 238 > stitchbouck
Modifié le 17 déc. 2020 à 21:43
Non, tu ne les déclares plus dans le code mais tu les nommes dans excel : 'Formule / Gestionnaire de noms'
Ou bien tu sélectionnes ta plage, saisi le nom dans la zone des références (juste au-dessus des n° de lignes, et tu valides avec Entrée
eric
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
18 déc. 2020 à 09:27
Bonjour,

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

1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
16 déc. 2020 à 16:28
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 !
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
18 déc. 2020 à 15:30
Merci à tous !

je teste tout ça mardi !!

Un grand merci pour votre aide :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
18 déc. 2020 à 15:38
Encore plus simple, avec des adresses de Range qui incluent le nom de la feuille...

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

0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
22 déc. 2020 à 11:10
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 ?
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 238
Modifié le 22 déc. 2020 à 12:28
Bonjour,

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
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
22 déc. 2020 à 14:23
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
23 déc. 2020 à 13:57
Salut,

Pour qu'elle fonctionne, il faut adapter les plages dans la ligne :
MesPlages = Array("Feuil2!$B$5,$E$13,$C$5:$D$13", "Feuil1!$A$1", "Feuil3!B12:C68, e12:f68, h12:i68")
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
30 déc. 2020 à 11:34
bonjour,

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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
30 déc. 2020 à 11:41
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 :
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
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
30 déc. 2020 à 13:30
ha oui, nickel !! ok donc chaque plage doit avoir son nom de feuille systématiquement.
Compris,

Merci !!
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
Modifié le 30 déc. 2020 à 13:52
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 :)

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 ! :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
30 déc. 2020 à 13:56
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.
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
Modifié le 30 déc. 2020 à 14:34
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 !!
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
6 janv. 2021 à 15:57
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 !!
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 238
6 janv. 2021 à 20:26
Bonjour,

si, les espaces sont acceptés, mais il faut mettre le nom de la feuille entre 2 simples quotes ' ' : 'ta feuille avec espaces'
0
stitchbouck Messages postés 127 Date d'inscription mercredi 12 janvier 2011 Statut Membre Dernière intervention 29 août 2024 2
7 janv. 2021 à 09:03
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é.
0