VBA dupliquer feuille + renommer + modifier

RIV3LONE

XLDnaute Nouveau
Bonjour à tous,

Je vais essayer de vous expliquer mon problème concernant VBA.


Feuilles déjà existantes :
- Master : avec une liste d'entreprises en colonne A et leurs pays respectifs en colonne B
- Entreprise 1 : avec son nom (Entreprise 1) en A1 et son pays (France) en a2

Mon objectif : créer une procédure VBA qui permet de copier une feuille déjà existante (Entreprise 1), en modifiant son nom (entreprise coca, etc...), et en modifiant les 2 premieres lignes de la colonne A avec des données issues de la feuille Master.

Voici mon code VBA actuel qui rencontre un probleme (la 3e ligne en partant de la fin) et qui marche pratiquement : cela me creer bien des feuilles nouvelles remplies, sauf qu'une feuille sans nom est ajoutée à la toute fin, et un message d'erreur apparait (application defined error or object defined error)
Desolé de ne pouvoir vous envoyer un fichier :(
Merci d'avance




Sub copie_renomme()

nb_entreprises = Sheets("Master").Rows.Count

For i = 2 To nb_entreprises

Sheets("A2A").Select
Cells.Copy
Sheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Paste

ActiveSheet.Cells(1, 1) = Sheets("Master").Cells(i, 1)
ActiveSheet.Cells(2, 1) = Sheets("Master").Cells(i, 2)
ActiveSheet.Name = Cells(1, 1)
Next


End Sub
 

GeoTrouvePas

XLDnaute Impliqué
Re : VBA dupliquer feuille + renommer + modifier

Bonjour

Difficile de t'aider avec aussi peu de précisions et sans même savoir le type d'erreur que tu obtiens.
Aurais tu un fichier test ?
A priori, il n'y a pas d'erreur de syntaxe dans ta macro. Je me demande si à un moment donné, tu n'aurais pas la cellule(1,1) qui serait vide. A ce moment là, il serait normal que ta macro plante sur cette ligne :
Code:
ActiveSheet.Name = Cells(1, 1)
puisque le nom d'une feuille ne peut être vide.

A voir !
 

Papou-net

XLDnaute Barbatruc
Re : VBA dupliquer feuille + renommer + modifier

Bonjour RIV3LONE,

Je pense que c'est normal, car la ligne nb_entreprises = Sheets("Master").Rows.Count renvoie le nombre de lignes total de la feuille.

Je te propose d'essayer comme ceci :

Code:
Sub copie_renomme()
Dim Entreprises as Range
Set Entreprises = Sheets("Master").Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
For Each Cel in Entreprises
   Sheets("A2A").Select
   Cells.Copy
   Sheets.Add after:=Sheets(Worksheets.Count)
   ActiveSheet.Paste
   ActiveSheet.Cells(1, 1) = Sheets("Master").Cells(Cel.Row, 1)
   ActiveSheet.Cells(2, 1) = Sheets("Master").Cells(Cel.Row, 2)
   ActiveSheet.Name = Cells(1, 1)
Next
End Sub
Sans fichier, je ne peux tester mais on ne doit pas être loin de la solution.

Cordialement.

Edit : Bonjour GeoTrouvePas.
 

RIV3LONE

XLDnaute Nouveau
Re : VBA dupliquer feuille + renommer + modifier

Merci de vos réponses :)

@Geotrouvepas :
Etant donné que ma feuille master contient 10 entreprises, la 11e ligne est vierge, donc je pense que le problème viendrait de là ?

@papounet : merci ton code fonctionne sur mon fichier ! mais j'aimerai bien le comprendre et voir comment mon problème a été solutionné :)

Encore merci
 

Papou-net

XLDnaute Barbatruc
Re : VBA dupliquer feuille + renommer + modifier

@papounet : merci ton code fonctionne sur mon fichier ! mais j'aimerai bien le comprendre et voir comment mon problème a été solutionné

RE :

J'ai commencé par définir une plage de cellules :
Code:
Dim Entreprises as Range
Ensuite, je lui affecte l'ensemble des cellules de la zone A2:A1048576 (Rows.Count) qui contiennent des données (SpecialCells(xlCellTypeConstants))
Code:
Set Entreprises = Sheets("Master").Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)

La boucle suivante balaie toutes les cellules de la plage définie :
Code:
For Each Cel in Entreprises
Enfin, je récupère la ligne de la cellule en cours de lecture :
ActiveSheet.Cells(1, 1) = Sheets("Master").Cells(Cel.Row, 1)
ActiveSheet.Cells(2, 1) = Sheets("Master").Cells(Cel.Row, 2)

Pour le reste, je n'ai touché à rien.

On pourrait également se passer de définir la plage de cellules comme ci-dessous :

Code:
Sub copie_renomme()
For Each Cel in Sheets("Master").Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)            Sheets("A2A").Select
 Cells.Copy
 Sheets.Add after:=Sheets(Worksheets.Count)
 ActiveSheet.Paste
 ActiveSheet.Cells(1, 1) = Sheets("Master").Cells(Cel.Row, 1)
 ActiveSheet.Cells(2, 1) = Sheets("Master").Cells(Cel.Row, 2)
 ActiveSheet.Name = Cells(1, 1)
Next
End Sub
Espérant avoir répondu.

Cordialement.

PS : je m'aperçois que j'ai oublié de te souhaiter la bienvenue. Voilà qui est fait.
 

RIV3LONE

XLDnaute Nouveau
Re : VBA dupliquer feuille + renommer + modifier

Merci beaucoup, c'est parait :)

Toutefois, sans abuser de ta gentilesse, si je souhaite créer une proc qui supprime tous les onglets que l'on a créé avec la 1ere procedure, ça se concretise comment ? :eek:
 

RIV3LONE

XLDnaute Nouveau
Re : VBA dupliquer feuille + renommer + modifier

J'ai fait ceci, mais c'est faux :

Sub suppression()
Dim societes As Range
Set societes = Sheets("Master").Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
For Each Cel In societes
Sheets("Cel.Name").Select
Application.DisplayAlerts = False
Feuille.Delete
Application.DisplayAlerts = True

Next
End Sub
 

GeoTrouvePas

XLDnaute Impliqué
Re : VBA dupliquer feuille + renommer + modifier

Re RIV3LONE, bonjour Papou-net,

donc je pense que le problème viendrait de là

Si ta ligne d'indice "nb_entreprise" est vide, alors la cellule Sheets("Master").Cells(i, 1) sera vide lorsque i arrivera à cette valeur.
Par voie de conséquence, ta ligne :
Code:
ActiveSheet.Name = Cells(1, 1)
affichera une erreur puisque tu essayeras de donner un nom vide à un onglet (ce qui est interdit). Le code de Papou-net devrait résoudre ton problème.

Pour ce qui est de la suppression des feuilles, tu peux essayer ceci :
Code:
 Application.DisplayAlerts = False
i = 1
Do
If ThisWorkbook.Sheets(i).Name <> "Master" And ThisWorkbook.Sheets(i).Name <> "A2A" Then
    ThisWorkbook.Sheets(i).Delete
Else
    i = i + 1
End If
Loop While i <= ThisWorkbook.Sheets.Count
Application.DisplayAlerts = True
 

Papou-net

XLDnaute Barbatruc
Re : VBA dupliquer feuille + renommer + modifier

RE :

Essaie comme ceci, peut-être :

Code:
Sub suppression()
Dim societes As Range
Set societes = Sheets("Master").Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
Application.DisplayAlerts = False
For Each Cel In societes
   Sheets(Cel.Value).Delete
Next
Application.DisplayAlerts = True
End Sub
Cordialement.
 

Papou-net

XLDnaute Barbatruc
Re : VBA dupliquer feuille + renommer + modifier

RE :

GeoTrouvePas propose une autre solution qui est aussi très logique.

Elle m'inspire une solution intermédiaire, encore plus courte :

Code:
Sub suppression()
Application.DisplayAlerts = False
For Each sh In sheets
   If sh.Name <> "Master" Or sh.Name <> "A2A" Then sh.delete
Next
Application.DisplayAlerts = True
End Sub

Cordialement.
 

Discussions similaires

Statistiques des forums

Discussions
312 378
Messages
2 087 760
Membres
103 661
dernier inscrit
fcleves