Résolu Comment créer un nombre de feuille selon une variable dans une feuille Escel

  • Auteur de la discussion jprieux
  • Date de début

jprieux

Nouveau membre
Bonjour,
Voilà, je suis un débutant en VBA (et c'est peu de le dire, mais il y a un début à tout) et jusque'ici, je parvenais à faire tout ce que je souhaitais dans Excel sans VBA (je suis un pro des formules de calculs, mais ignare en VBA).
Aujourd'hui, mon problème est que je dois créer un formulaire où, lorsque l'on rentre un nombre dans une cellule (appellons-là V5) et que l'on clique sur un bouton "OK", cela copie une feuille (appellons-là Feuille2) autant de fois que la valeur de V5.
Je suis certains qu'au moins l'un d'entre vous, spécialistes en VBA, trouverez cette question trop facile, alors, n'hésitez pas : épattez-moi !

Merci d'avance.
 

zeb

Modérateur
Salut,

Je t'invite à la lecture de ce topic : . Tu devrais avoir un bon gros début de réponse. On en reparle quand tu auras un premier bout de code ?
 

snakezap

Nouveau membre
Bonjour,
je cherche la même chose que toi jprieux.

voilà ce que j'ai trouver:

[cpp]Sub imprimeClasseur()
Dim X As Byte
On Error goTo gestionErreur
X = inputBox('Saisir le nombre de copies à effectuer . ', 'Impression')
activeWorkbook.printOut Copies:=X, Collate:=True
Exit Sub
gestionErreur:
If Err = 13 Then msgBox 'Saisie non valide .'
End Sub
[/cpp]


mais pour l'instant je n'arrive pas à le mettre en place.

J'ai ma première feuille nommé listing, la valeur que doit représenté le nombre de copie se trouve en listing!i3 avec une zone d'impression zoneA situé sur une autre feuille nommé etiquette.

Pour l'instant je fais mes test avec PrintPreview.

Je suis bloqué, si quelqu'un pourrai me mettre sur la voie...

merci
 

jprieux

Nouveau membre
Merci, je vais essayer de partir de cela. Sachant que je ne souhaite pas imprimer les feuilles, mais copier les onglets en fin de classeur. Je vais essayer de trouver un bout de code, peut être en partant de ce que tu as indiqué.
Encore merci.
 

zeb

Modérateur
Eh, JP, tu as essayé de faire pondre un bout de code à l'enregistreur de macro ?
 

jprieux

Nouveau membre
oui, j'ai bien essayé mais je n'arrive pas à lui faire copier un nombre de feuille demandé. C'est cette fonction que je ne trouve pas

Code:
Sub nb_pieces()
'
' nb_pieces Macro
'

'
    ActiveCell.FormulaR1C1 = "2"
    Range("V6").Select
    Sheets("Revue de Contrat").Select
    Sheets("Revue de Contrat").Copy After:=Sheets(5)
    Sheets("Revue de Contrat").Select
    Sheets("Revue de Contrat").Copy After:=Sheets(6)
    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    Sheets("Phase Etude").Select
End Sub

Merci
 

zeb

Modérateur
Ah.....! :)

__________________________________________
Dès que le règlement sera respecté, surtout en se qui concerne la balise
Code:
, une solution basée sur ton code te sera proposée.
\
[:zeb:6]
 

jprieux

Nouveau membre
j'ai essayé ça, mais j'ai un message d'erreur "impossible d'exécuter le code en mode Arrêt" :
Code:
Sub nb_piece()
 '
 ' nb_piece Macro
 '
   Dim X As Byte
   On Error GoTo gestionErreur
   X = TextBox 'Saisie'
   Sheets("Revue de Contrat").Select
   Sheets("Revue de Contrat").Copy After:=Sheets(5).Copy = X, Collate:=True
   Exit Sub
gestionErreur:
   If Err = 13 Then MsgBox 'Saisie non valide .'
End Sub

Merci
 

zeb

Modérateur
Meilleure réponse
Ah ! .... :)
T'aurais pu modifier ton message plutôt que de tout refaire. Spa grave.

--------------------------

Bon, alors il s'agit de ne pas faire n'importe quoi. :o
Relis le code de snakezap, on y utilise InputBox, pas TextBox.
Pis c'est quoi ce bordel ?
Code:
Sheets("Revue de Contrat" ).Copy After:=Sheets(5).Copy = X, Collate:=True
:??:

Au début de chacun de tes modules, écris la ligne suivante. Cela va restreindre la permissivité du langage VB, mais ce sera d'un grand bénéfice.
Code:
Option Explicit

--------------------------

Etape 1

Avant de s'emmerder avec des saisies, on va faire simple. Soit N le nombre de copies voulues.

Code:
Dim I As Integer
Dim N As Integer

N = 3
For I = 1 To N
    Sheets("Revue de Contrat").Copy After:=Sheets("Revue de Contrat")
Next

Et voilà !
Bon, moi je n'aime pas les sheets génériques (feuilles quelconques). Comme j'aime à savoir ce que je fais, j'utilise des Worksheets (feuilles de calcul).
Code:
Dim I As Integer
Dim N As Integer

N = 3
For I = 1 To N
    Worksheets("Revue de Contrat").Copy After:=Worksheets("Revue de Contrat")
Next

Etape 2

Bon, maintenant, on se dit que ce serait bien mieux de mettre les nouvelles feuilles à la fin.
Comment savoir quelle est la dernière feuille ? Existe-t-il un Sheets.LastSheet ?
Ben non. Va falloir le faire soi-même. En revanche, il existe un Sheets.Count.
On a donc le nombre de feuilles totale. En plus, une feuille peut être désignée par son nom Sheets("Revue de Contrat"), ou par son numéro Sheets(12).
Pratique non ? Ben si, regarde. La dernière feuille est : Sheets(Sheets.Count).

Stro facile :sol:
Code:
Dim I As Integer
Dim N As Integer

N = 3
For I = 1 To N
    Worksheets("Revue de Contrat").Copy After:=Sheets(Sheets.Count)
Next

Etape 2

Bon, maintenant qu'on sait faire pour N=3, on va essayer pour N quelconque.
Soit on pose la question à l'utilisateur (cf. code de snakezap), soit on ramasse l'info sur la feuille.
Dans tous les cas, moi j'en fous, je traite le cas général :

Code:
Sub Photocopieuse(sh As WorkSheet, N As Integer)
    Dim I As Integer

    For I = 1 To N
        sh.Copy After:=Sheets(Sheets.Count)
    Next
End Sub

Maintenant, il suffit d'appeler correctement notre photocopieuse.

En "dur" :
Code:
Photocopieuse Worksheets("Revue de Contrat"), 3

En "interactif" :
Code:
Sub PhotocopieSaisie()
    Dim reponse As String
    
    Do
        reponse = InputBox("Nombre de copies", "MultiCopie")
        If reponse = "" Then Exit Sub
    Loop While Not IsNumeric(reponse)
    Photocopieuse Worksheets("Revue de Contrat"), CInt(X)
End Sub

snakezap, profites-en pour corriger ton code horrible et bencale.
En VB, on utilise des doubles-quotes pour les chaînes.
Ta gestion des erreurs est abominable : tu laisses l'application se planter au lieu de tester tes variables.
Et ton étiquette s'appelle gestionErreur, beurk ! (Spice de javaiste, va ! :na: )
:o
[Avant de t'énerver tout rouge, évalue le niveau d'ironie de mon commentaire ;)]

En "automatique" :

Code:
Sub PhotocopieAutomatique()
    If IsNumeric(Range("V5").Value) Then Photocopieuse Worksheets("Revue de Contrat"), Range("V5").Value
End Sub

C'est ce que tu attendais ?
 

jprieux

Nouveau membre
Super et encore merci !
Je commence un peu plus à aimer VBA...
A très bientôt (il y ades chances, avec un bleu comme moi !)
Ciao !
 

snakezap

Nouveau membre
Bonjour,

pas de soucis zeb ;)

ton code fonctionne, mais j'ai d'autre soucis à réglé avec ce type de code.

Je t'expose mon problème. Je dois réalisé pour mon entreprise des étiquettes de transport.
Actuellement nous le faisons à la main(copier/coller) pour créer ces étiquettes.
sachant qu'il peut avoir de 1 à 30 étiquettes par client, et que je me tape environ 100 à 200client par jour.
On va bientôt avoir un export csv fonctionnelle qui nous fera gagné énormément de temps.

Sur ces étiquettes je dois noté le nom du transporteur, les coordonnées client, le nombres de colis, le volume et quels produits nous envoyons.

J'ai eu l'idée de créer un listing complet dans un tableau (Feuil1) et que dans une autre feuille il y a les étiquettes qui récupère les données de ce listing. via quelques fonction Si j'ai trouvé une solution mais je voudrais amélioré les choses car il faut sans arret faire des filtres et plein de bidouille pour les imprimé, donc source d'erreur.

Quelques transporteurs exporte les données via pdf mais je ne sais pas comment faire tout cela.

Si quelqu'un à une solution, ça serrait super ;)

merci d'avance.

PS: Vu que c'est un autre soucis dois-je créer un autre sujet?
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 055
Membres
1 586 282
Dernier membre
Yannick3553
Partager cette page
Haut