Créer une plage variable

Bonjour au forum,

J'essaie de définir une plage variable contenant plusieurs autres plages, selon un chablon qui se résumerait comme ceci :

D6:K35 - O6:V35 - Z6:AG35.. etc, ceci 12 fois en tout (il y a donc un décalage de 4 colonnes entre chaque plage)

Je rencontre des difficultés pour la suite :

Si la cellule "D" & 35 + 6 est non vide, intégrer dans cette plage finale le même schéma que les 12 première plages, soit :

D41:K70 - O41:V70 - Z41:AG70.. etc, ceci encore 12 fois...

Cette répétition vers le bas tant que la cellule vérifiée est vide.

Je n'ai malheureusement pas de fichier exemple car c'est la 1ere base de mon travail.

J'espère avoir été suffisamment clair, sinon j'essaierai de créer un fichier exemple de ce que je souhaite.

Merci d'avance pour vos idées !

J'ai eu le temps de faire un petit fichier exemple pour plus de compréhension, ci-joint.

Merci à vous !

7fof.xlsx (35.73 Ko)

Bonjour,

Ce principe est-il celui attendu ?

Cordialement

6fof.xlsx (48.77 Ko)

Bonjour Parrish,

Merci pour ta réponse.

Ce n'est malheureusement pas du tout ce que je souhaite, j'ai dû mal m'exprimer...

Ce que je souhaite c'est créer une variable "PlageFinale" pour l'utiliser dans VBA selon les conditions mentionnées.

Ma plage initiale est donc :

Set PlageInitiale = Sheets("Chablon").Range("D6:K35,O6:V35,Z6:AG35,AK6:AR35,AV6:BC35,BG6:BN35,BR6:BY35,CC6:CJ35,CN6:CU35,CY6:DF35,DJ6:DQ35,DU6:EB35")

Je souhaite ensuite tester ma cellule D6 + 35 lignes (donc D41), et si cette cellule est vide, alors PlageFinal = PlageInitiale.

Si cette cellule (D41) n'est pas vide, alors j'ajoute à PlageInitiale la nouvelle plage PlageInitiale.Offset(35.0), c'est à dire ("D41:D70,O41:V70....etc").

Ainsi, PlageFinale serait = PlageInitiale + PlageInitiale.Offset(35.0).

J'ai besoin de répéter ceci tant que D6 + 35*x est non vide.

J'espère avoir été un peu plus clair, ce n'est vraiment pas évident à expliquer, donc j'imagine que pour comprendre...

Merci d'avance,

Je penses avoir saisi l'idée, pour le coup c'est hors de mes compétences,

Bon courage à toi ^^

Cordialement

Bonjour Nrev74, je n'avais pas compris que c'était du VBA dans votre premier poste... je cherchais à faire des plages avec le gestionnaire de nom.

A tester ce code est-ce que cela fonctionne ?

Sub test()
Dim PlageInitiale As Range
Set PlageInitiale = Sheets("Chablon").Range("D6:K35,O6:V35,Z6:AG35,AK6:AR35,AV6:BC35,BG6:BN35,BR6:BY35,CC6:CJ35,CN6:CU35,CY6:DF35,DJ6:DQ35,DU6:EB35")
For X = 1 To 11
debut = 6 + 35 * X
fin = 35 + 35 * X
If Sheets("Chablon").Range("D" & debut) <> "" Then Set PlageInitiale = Union(PlageInitiale, Sheets("Chablon").Range("D" & debut & ":K" & fin & ",O" & debut & ":V" & fin & ",Z" & debut & ":AG" & fin & ",AK" & debut & ":AR" & fin & ",AV" & debut & ":BC" & fin & ",BG" & debut & ":BN" & fin & ",BR" & debut & ":BY" & fin & ",CC" & debut & ":CJ" & fin & ",CN" & debut & ":CU" & fin & ",CY" & debut & ":DF" & fin & ",DJ" & debut & ":DQ" & fin & ",DU" & debut & ":EB" & fin & ""))
Next X
PlageInitiale = ""
End Sub

A+

@Parrish : merci d'avoir essayé !

@Gabin37 : merci beaucoup pour votre réponse. Effectivement je n'ai pas précisé que je souhaite une solution en VBA, je m'excuse pour cela.

Concernant votre code, je ne peux malheureusement plus le tester jusqu'à demain matin (je suis dans un train sur téléphone), mais si je comprends bien, le 1 To 11 fait référence au nombre d'itérations de plages (lignes 6-35, 41-70, etc.) ?

Si c'est bien le cas, j'aimerais remplacer ce 11 par une variable, qui vérifierait si la cellule D(x) de la dernière itération est vide. Si vide, on arrête l'union de plages, sinon on continue.

x aura donc pour valeur la dernière ligne non vide de la colonne D + 6

Merci infiniment pour votre proposition qui me permet déjà de bien avancer :)

Bonjour Gabin37,

J'ai pu tester votre code et il fonctionne parfaitement.

J'ai juste ajouter une variable qui compte le nombre de "blocs" verticaux pour remplacer le "11" :

Sub test()
Dim PlageInitiale As Range
Dim x As Long
Dim debut, fin As Long
Dim NbChablon, dl As Long

dl = Sheets("Chablon").Range("B" & Rows.Count).End(xlUp).Row
NbChablon = dl / 35
Set PlageInitiale = Sheets("Chablon").Range("D6:K35,O6:V35,Z6:AG35,AK6:AR35,AV6:BC35,BG6:BN35,BR6:BY35,CC6:CJ35,CN6:CU35,CY6:DF35,DJ6:DQ35,DU6:EB35")

For x = 1 To NbChablon
debut = 6 + 35 * x
fin = 35 + 35 * x
If Sheets("Chablon").Range("D" & debut) <> "" Then Set PlageInitiale = Union(PlageInitiale, Sheets("Chablon").Range("D" & debut & ":K" & fin & ",O" & debut & ":V" & fin & ",Z" & debut & ":AG" & fin & ",AK" & debut & ":AR" & fin & ",AV" & debut & ":BC" & fin & ",BG" & debut & ":BN" & fin & ",BR" & debut & ":BY" & fin & ",CC" & debut & ":CJ" & fin & ",CN" & debut & ":CU" & fin & ",CY" & debut & ":DF" & fin & ",DJ" & debut & ":DQ" & fin & ",DU" & debut & ":EB" & fin & ""))
Next x
PlageInitiale.Select
'PlageInitiale = ""
End Sub

Merci infiniment et excellente journée à vous et au forum !

Hello Nrev74, bien joué pour l'adaptation du code.

Sinon une autre solution pouvait être:

Sub test()
Dim PlageInitiale As Range
Set PlageInitiale = Sheets("Chablon").Range("D6:K35,O6:V35,Z6:AG35,AK6:AR35,AV6:BC35,BG6:BN35,BR6:BY35,CC6:CJ35,CN6:CU35,CY6:DF35,DJ6:DQ35,DU6:EB35")
For X = 1 To 9999
debut = 6 + 35 * X
fin = 35 + 35 * X
If Sheets("Chablon").Range("D" & debut) <> "" Then 
    Set PlageInitiale = Union(PlageInitiale, Sheets("Chablon").Range("D" & debut & ":K" & fin & ",O" & debut & ":V" & fin & ",Z" & debut & ":AG" & fin & ",AK" & debut & ":AR" & fin & ",AV" & debut & ":BC" & fin & ",BG" & debut & ":BN" & fin & ",BR" & debut & ":BY" & fin & ",CC" & debut & ":CJ" & fin & ",CN" & debut & ":CU" & fin & ",CY" & debut & ":DF" & fin & ",DJ" & debut & ":DQ" & fin & ",DU" & debut & ":EB" & fin & ""))
Else
    Exit for
End if
Next X
PlageInitiale = ""
End Sub

Ici, on fait une boucle "infini puisque 9999.." et si la condition "Sheets("Chablon").Range("D" & debut) <> "" n'est pas respectée alors on quitte la boucle donc on va pas plus loin.

L'avantage c'est que si d'autres cellules à coté sont remplis elle n'influencerons pas le "Sheets("Chablon").Range("B" & Rows.Count).End(xlUp).Row"

Bonne journée

A+

Hello Gabin37,

Je note votre astuce, merci !

Concernant ce fichier, les cellules B6:B35 sont obligatoirement non vide, c'est pourquoi je suis parti sur la division du dl / 35, mais il est vrai que je n'avais pas préciser ce détail dans mon post...

Merci encore pour votre aide précieuse !

À bientôt sur le forum.

Rechercher des sujets similaires à "creer plage variable"