[Catégorie encore modifiée .Net - VBA] Création [Résolu]

Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
- - Dernière réponse : Matmouss
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
- 22 oct. 2010 à 16:12
Bonjour,

je débute en VBA sur excel et j'aurais besoin d'un coup de main s'il vous plaît.

J'ai créé une macro qui permet de générer des fichiers excels préremplis grâce à un template initial.

Basiquement, cela consiste en:

- choisir quel contrat l'utilisateur veut générer (un numero correspondant à une ligne d'un tableau)
- copier les onglets dans un nouveau fichier,
- faire des copiers coller vers le nouveau fichier
- le fermer.

Par contre, je réalise cette action 1 fichier par 1 fichier. Y aurait-il une possibilité de sélectionner les différentes lignes souhaitées et de toutes les générer en même temps?

Je vous copie ce que j'ai effectué pour le moment.

Merci d'avance,

Mathieu

Sub CréationContratAffaireSélectionné()

' CréationContratAffaire Macro

Dim Condition As Byte

Dim ContratSelect As Integer

Dim NomFichier As String

Dim chemin As String

chemin = InputBox("Ou souhaitez-vous enregistrer votre fichier? Ex: C:\Documents and Settings\*****\Bureau\Dossier de travail\****\Création_Macro")


Range("'Unité PILOTE'!A5").Select

Condition = 6


Do While Condition = 6

ContratSelect = Val(InputBox("Quel contrat souhaitez-vous générer? (indiquez le N° de contrat - Ex: 3) ")) + 4



Worksheets(Array("V 14 oct", "Unité PILOTE")).Select
Worksheets(Array("V 14 oct", "Unité PILOTE")).Copy

Sheets("V 14 oct").Select


Range("E5:J5").Select
ActiveCell = "='Unité PILOTE'!B" & ContratSelect
Range("E6:J6").Select
ActiveCell = "='Unité PILOTE'!C" & ContratSelect
Range("E8:J8").Select
ActiveCell = "='Unité PILOTE'!D" & ContratSelect
Range("L5").Select
ActiveCell = "='Unité PILOTE'!E" & ContratSelect
Range("L6").Select
ActiveCell = "='Unité PILOTE'!F" & ContratSelect
Range("L7").Select
ActiveCell = "='Unité PILOTE'!G" & ContratSelect
Range("E10:J10").Select
ActiveCell = "='Unité PILOTE'!S" & ContratSelect
Range("E11:J11").Select
ActiveCell = "='Unité PILOTE'!H" & ContratSelect
Range("E23:G13").Select
ActiveCell = "='Unité PILOTE'!I" & ContratSelect
Range("E23").Select
ActiveCell = "='Unité PILOTE'!O" & ContratSelect
Range("F23").Select
ActiveCell = "='Unité PILOTE'!P" & ContratSelect
Range("H23").Select
ActiveCell = "='Unité PILOTE'!Q" & ContratSelect
Range("J23:K23").Select
ActiveCell = "='Unité PILOTE'!R" & ContratSelect


ActiveSheet.Name = "Contrat n° " & ContratSelect - 4

'chemin = "C:\Documents and Settings\*****\Bureau\Dossier de travail\***\Création_Macro"

ActiveWorkbook.SaveAs Filename:=chemin & "" & Sheets("Unité PILOTE").Range("C" & ContratSelect).Value & ".xls", FileFormat _
:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False

ActiveWorkbook.Close

Condition = MsgBox("Souhaitez-vous générer un autre contrat?", vbYesNo)

Loop

MsgBox ("Merci")

End Sub
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
26806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2019
317
3
Merci
Bonjour,

est-ce que c'est possible de cocher des lignes


Comment souhaites-tu les cocher ?
[list]
Directement dans la feuille en mettant un X sur la ligne à traiter
Ou en passant par une fenêtre de saisie (un peu comme l'inputbox)
/list

Si c'est directement dans la feuille .. lorsque tu parcours ta feuille avec une boucle (For/Next), tu testes pour chaque Ligne si la cellule de la colonne à vérifier contient un X ou pas... et si Oui.. tu fais la création etc...

Si tu veux une interface, il faut que tu t'orientes vers les [b]USERFORM/b.
(Dans l'éditeur de macro, tu vas dans Insertion / Userform. )
Dans cette fenêtre, tu peux placer des "Controls" tels que listes déroulantes, zone de texte, cases à cocher, bouton d'options, boutons (tout court ^^ ) .;etc.

Pour apprendre à les utiliser, Va sur le lien : Utiliser les Userform en VBA

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI

Si une réponse vous convient, pensez à la mettre en Résolu.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 5999 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45
Messages postés
26806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2019
317
3
Merci
Bonjour,

Comment est-ce que je peux appeller le contenu de la cellule?


Je ne comprend pas trop ta question.
Tu veux récupérer la VALEUR de ta cellule c'est ça ?
Si oui, utilise la propriété .value

Exemple:

Sub test()
'-------------------------------------------------
' Lire la valeur contenue dans une cellule (exemples pour A1)
'-------------------------------------------------
Resulstat = Range("A1").Value
'ou..une autre porssibilité...
Resulstat = Cells(1, "A").Value
Debug.Print Resulstat ' affichage dans l'écran d'éxecution..

'-------------------------------------------------
' Lire la formule contenue dans une cellule (exemples pour A1)
'-------------------------------------------------
Formule = Range("A1").Formula
Debug.Print Formule ' affichage dans l'écran d'éxecution..
End Sub




Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 5999 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45
Messages postés
26806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2019
317
0
Merci
Bonjour,

(encore une fois : PENSES à utiliser les balises de code lorsque tu écrit ta macro dans le FOFO. Ce sera plus lisible pour tout le monde).

Sinon, pour ta question :
Y aurait-il une possibilité de sélectionner les différentes lignes souhaitées et de toutes les générer en même temps


Je ne comprend pas trop ce que tu souhaites.

Dans un premier temps, tu pourrais améliorer la rapidité d'execution de ta macro en désactivant l'affichage des MAJ durant le traitement de ta macro.
( Application.Screeunpdating = false)
Ensuite, pour plus de lisibilité, tu dois pouvoir écrire ton code en "enlevant" quelques lignes (.select) de cette façon :

Sub CréationContratAffaireSélectionné()
' Désactivation de l'affichage durant le traitement
Application.ScreenUpdating = False

' CréationContratAffaire Macro
Dim Condition As Byte
    Condition = 6
Dim ContratSelect As Integer
Dim NomFichier As String
Dim chemin As String

chemin = InputBox("Ou souhaitez-vous enregistrer votre fichier? Ex: C:\Documents and Settings\*****\Bureau\Dossier de travail\****\Création_Macro")

Range("'Unité PILOTE'!A5").Select

Do While Condition = 6
' Selection du N° de contrat
ContratSelect = Val(InputBox("Quel contrat souhaitez-vous générer? (indiquez le N° de contrat - Ex: 3) ")) + 4
'---------
Worksheets(Array("V 14 oct", "Unité PILOTE")).Select
Worksheets(Array("V 14 oct", "Unité PILOTE")).Copy
'---------
Sheets("V 14 oct").Select
'---------
Range("E5:J5").Formula = "='Unité PILOTE'!B" & ContratSelect
Range("E6:J6").Formula = "='Unité PILOTE'!C" & ContratSelect
Range("E8:J8").Formula = "='Unité PILOTE'!D" & ContratSelect
Range("L5").Formula = "='Unité PILOTE'!E" & ContratSelect
Range("L6").Formula = "='Unité PILOTE'!F" & ContratSelect
Range("L7").Formula = "='Unité PILOTE'!G" & ContratSelect
Range("E10:J10").Formula = "='Unité PILOTE'!S" & ContratSelect
Range("E11:J11").Formula = "='Unité PILOTE'!H" & ContratSelect
Range("E23:G13").Formula = "='Unité PILOTE'!I" & ContratSelect
Range("E23").Formula = "='Unité PILOTE'!O" & ContratSelect
Range("F23").Formula = "='Unité PILOTE'!P" & ContratSelect
Range("H23").Formula = "='Unité PILOTE'!Q" & ContratSelect
Range("J23:K23").Formula = "='Unité PILOTE'!R" & ContratSelect
'---------
ActiveSheet.Name = "Contrat n° " & ContratSelect - 4
'chemin = "C:\Documents and Settings\*****\Bureau\Dossier de travail\***\Création_Macro"
ActiveWorkbook.SaveAs Filename:=chemin & "" & Sheets("Unité PILOTE").Range("C" & ContratSelect).Value & ".xls", FileFormat _
:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
'---------
ActiveWorkbook.Close
'---------
Condition = MsgBox("Souhaitez-vous générer un autre contrat?", vbYesNo)
Loop

' activation de l'affichage
Application.ScreenUpdating = True

    MsgBox ("Merci")

End Sub


Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
0
Merci
Bonjour,

merci bcp pour ta réponse et désolé pour les balises (comment fait-on d'ailleurs stp?)!

Pour la macro:

1/ je souhaite sélectionner plusieurs lignes (au lieu de les rentrer une par une comme dans l'Input Box) et, lorsque je lance la macro, elle génèrera les fichiers excel a partir des lignes sélectionnées.

2/ Comment faire "disparaître" le msg "Vérificateur de compatibilité: Perte mineure de fidélité....." parce qu'il apparaît à chaque fois que j'enregistre 1 fichier...

3/ comment faire pour sortir de la boucle si la personne clique sur annuler dans un des input box???

En tous les cas merci bcp pour ta réactivité et pour tes réponses

Mathieu
Commenter la réponse de Matmouss
Messages postés
26806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2019
317
0
Merci
Bonjour,

(comment fait-on d'ailleurs stp?)!

= > Dans la fenêtre de saisie des messages, tu as, en haut, des icones (mettre en gras, italique..etc.). La troisième en partant de la droite te permet d'utiliser les balises de code.
Sinon tu peux aussi les écrire à la main : ( A ecrire SANS les espaces )
[ code = vb ]Ici tu entres le code [ / code ]

1/ je souhaite sélectionner plusieurs lignes (au lieu de les rentrer une par une comme dans l'Input Box) et, lorsque je lance la macro, elle génèrera les fichiers excel a partir des lignes sélectionnées.


Pour se faire, tu pourrais parcourir toutes tes lignes grâce à une boucle (For / Next).
Par exemple:
'boucle de 1 à 10
For Ligne  = 1 to 10
  ' Selection du N° de contrat
    ContratSelect = Ligne
Next



2/ Comment faire "disparaître" le msg "Vérificateur de compatibilité: Perte mineure de fidélité....." parce qu'il apparaît à chaque fois que j'enregistre 1 fichier...

=> Je suppose donc que tu es en office 2007.. de mémoire, tu as, dans le menu "office" (le rond en haut à gauche) une option permettant de faire la vérification ou non de la compatibilité.

Sinon, tu peux peut être essayer de mettre le code :
Application.DisplayAlerts =  False
au début de ton code et le passer à TRUE à la fin. Cette instruction permet de ne pas afficher les messages d'alertes (ça doit pouvoir fonctionner également pour ton cas).

3/ comment faire pour sortir de la boucle si la personne clique sur annuler dans un des input box???


Pour les INPUTBOX, lorsque tu cliques sur Anuler ou sur la croix, cela revient à ne rien écrire dedans.
Par exemple , si tu créés une Inputbox :
Resultat  = InputBox("test")

Résultat = "" si rien n'y est entré ou que tu la quittes.

Tu peux donc inclure un test pour savoir si elle est vide ou non :
Do Until resulstat = 1
' Stop la boucle si resultat = 1
Resultat = InputBox("test")
'Sort de la boucle si =2 ou si vide
'Exit Do pour sortir d'une boucle DO/LOOP
 If Resultat 2 Or resulstat "" Then Exit Do
Loop



Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45
Messages postés
26806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2019
317
0
Merci
Bonjour,



1/ je souhaite sélectionner plusieurs lignes (au lieu de les rentrer une par une comme dans l'Input Box) et, lorsque je lance la macro, elle génèrera les fichiers excel a partir des lignes sélectionnées.



Je viens de penser que tu pourrais également demander à l'utilisateur d'indiquer directemenent plusieurs valeurs (contrats) dans ton InputBox en les séparant par des vigules par exemple. (donc ne pas utiliser : VAL)
Ensuite tu ne bouclerai plus sur TOUTES tes lignes mais uniquement celles indiquées dans le tableau 'virtuel' qui contient les N° de lignes à traiter.

Exemple pour scinder (spliter) une chaine de caracteres séparés par une Vigule.

Sub test()
Dim Tableau() As String
Dim TexteADecouper As String
Dim i As Integer

TexteADecouper = "1,2,3,4"

'découpe la chaine en fonction des virgules ","
'le résultat de la fonction Split est stocké dans un tableau
Tableau = Split(TexteADecouper, ",")

'boucle sur le tableau pour visualiser le résultat
    For i = 0 To UBound(Tableau)
        'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros
        Debug.Print Tableau(i)
    Next i


End Sub



Tu trouveras sur ce site : ICI
un tutoriel sur la gestion des chaines de caractères en VBA qui te permettra de progresser dans la programmation.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
0
Merci
Merci bcp pour tes réponse.

Concernant le fait de sélectionner à la main (séparées d'une virgule) toutes les lignes à partir desquelles je veux générer des contrats,

est-ce que c'est possible de cocher des lignes (genre, si cette ligne est cochée, alors on va générer le contrat correspondant), ensuite de cliquer sur "OK" et que la macro génère les contratscorrespondant aux cases cochées?

Merci encore,

Mathieu
Commenter la réponse de Matmouss
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
0
Merci
J'ai une dernière question :-)

Lorsque j'écris:

Libelle = ("='Unité PILOTE'!C" & ContratSelect)


Libelle est défini comme un string. Mais le resultat est donne 'Unité PILOTE'!C5, 'Unité PILOTE'!C6,...

Comment est-ce que je peux appeller le contenu de la cellule?

Merci bcp,

Mathieu
Commenter la réponse de Matmouss
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
0
Merci
Super pour le .value

J'avais mis val(....) ce qui me renvoyait "0" car c'était un string!

Pour la question précédente, je crois que c'est un Userform dont j'ai besoin.

je vais aller voir ton lien, merci!

Merci bcp

Mathieu
Commenter la réponse de Matmouss
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
0
Merci
Je me permets de refaire una appartition concernant la boucle for que tu m'as conseillé.

Dans une colonne dans mon tableau source, j'ai créé un menu déroulant avec une seule possibilité: "X" si la personne souhaite sélectionner la ligne.

Ensuite j'ai créé la boucle for.. next, avec une condition if pour qu'il créé un fichier si il y a le "X" dans la ligne (ligne V en l'occurence).

Mais il ne détecte pas le "X" et sort directement de la macro (Exit Sub).

Est-ce que tu vois pourquoi?

Merci d'avance,

Mathieu

Sub CréationContratAffaireSélectionnéTEST()

' CréationContratAffaire Macro

Dim i As Integer

Dim NbLignes As Integer

Dim chemin As String

Dim Libelle As String

chemin = InputBox("Ou souhaitez-vous enregistrer votre/vos fichier(s)sélectionné(s)? Ex: C:\Documents and Settings\mousseron\Bureau\Dossier de travail\RATP\Création_Macro")

Range("'Unité PILOTE'!A5").Select

NbLignes = 0

Do While Not (IsEmpty(ActiveCell))
   NbLignes = NbLignes + 1
    Selection.Offset(1, 0).Select
Loop

NbLignes = NbLignes + 4

Application.ScreenUpdating = False

For i = 5 To NbLignes

    If IsEmpty(Range("V" & i)) Then
    Exit Sub
    Else    
    Worksheets(Array("V 14 oct", "Unité PILOTE")).Select
    Worksheets(Array("V 14 oct", "Unité PILOTE")).Copy

    Sheets("V 14 oct").Select
    
    Libelle = Range("'Unité PILOTE'!C" & i).Value
    Range("E5:J5").Formula = "='Unité PILOTE'!B" & i
    Range("E6:J6").Formula = "='Unité PILOTE'!C" & i
    Range("E8:J8").Formula = "='Unité PILOTE'!D" & i
    Range("L5").Formula = "='Unité PILOTE'!E" & i
    Range("L6").Formula = "='Unité PILOTE'!F" & i
    Range("L7").Formula = "='Unité PILOTE'!G" & i
    Range("E10:J10").Formula = "='Unité PILOTE'!S" & i
    Range("E11:J11").Formula = "='Unité PILOTE'!H" & i
    Range("E13:G13").Formula = "='Unité PILOTE'!I" & i
    Range("E23").Formula = "='Unité PILOTE'!O" & i
    Range("F23").Formula = "='Unité PILOTE'!P" & i
    Range("H23").Formula = "='Unité PILOTE'!Q" & i
    Range("J23:K23").Formula = "='Unité PILOTE'!R" & i
    
    Range("A1:V50").Select
    Selection.Copy
    Range("A1:V50").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Application.CutCopyMode = False
    
    Application.DisplayAlerts = False
    Sheets("Unité PILOTE").Delete
    Application.DisplayAlerts = True

    ActiveSheet.Name = "Contrat n° " & i - 4
    
    'chemin = "C:\Documents and Settings\mousseron\Bureau\Dossier de travail\RATP\Création_Macro"
    
    ActiveWorkbook.SaveAs Filename:=chemin & "" & Libelle & ".xls", FileFormat _
        :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False

    ActiveWorkbook.Close
    

    
    Sheets("Unité PILOTE").Select
     
    End If
Next

    Application.ScreenUpdating = True

MsgBox ("Le(s) contrat(s) a/ont bien été enregistré(s).")

End Sub
Commenter la réponse de Matmouss
Messages postés
26806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 novembre 2019
317
0
Merci
[quote]
Mais il ne détecte pas le "X" et sort directement de la macro (Exit Sub). quote]
Je vois que tu testes si la cellule est vide :
If IsEmpty(Range("V" & i)) Then
    Exit Sub
Else    
'..;
End if


Pour moi ça fonctionne correctement...
Si tu fais la macro en mode pas a pas ( F8).. ça donne quoi quand tu passes sur cette ligne ?

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45
Messages postés
9
Date d'inscription
jeudi 21 octobre 2010
Statut
Membre
Dernière intervention
22 octobre 2010
0
Merci
Finalement j'ai trouvé un moyen de "contourner" la difficulté.

J'ai écrit:

If Not IsEmpty(Range("V" & i)) Then


et le reste de la fonction sans 'Else et avec le end if juste avant le Next de la boucle for.

merci pour ton aide en tous les cas,

Mathieu
Commenter la réponse de Matmouss