[VBA] Besoin d'aide pour la création d'une macro [Résolu]

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Effectivement tu as mis le doigt sur le problème.

Dans le fichier d'origine, il n'y a que des formules qui font des références à d'autres feuilles du classeur.
La démarche pour les utilisateurs est la suivante :
1. On encode sur toutes la/les feuille(s) où il y a besoin.
2. On clique sur le bouton d'archivage pour enregistrer les données.
3. On clique sur le bouton "Nettoyage feuille" pour remettre le formulaire à 0, et le remplir la fois d'après avec des nouvelles valeurs

Voilà pourquoi ma macro ne copiait pas les feuilles mais juste les données.
Puisque comme tu l'as dis, lors d'une copie de feuille cela reprend les formules (et fais des références au classeur d'origine) hors le classeur est remis à 0 après chaque utilisation. Il me faut donc extraire les valeurs qui ressortent de ces formules, et non pas copier les formules.
Ton second code ne fonctionne donc pas, puisque à chaque ouverture du fichier "copie" les valeurs se mettent à jour, donc à 0.

Je suis donc obligé de procéder en plusieurs étapes :
1. Copie des valeurs
2. Copie de la mise en page
3. Redéfinition des paramètres d'impressions.

C'est pourquoi mon code était un peu brouillon. J'avoue que j'ai plus chercher à faire un code qui fonctionne plutôt qu'un code simple !
 

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

Sans le fichier je ne peux faire d'essai de débogage, mais je pense que ceci devrait t'aller.

Code:
Sub Button7_Click()
    'Desactive les changement à l'écran
    Application.ScreenUpdating = False
    
    'Déclaration de variable
    Dim archive As String
    
    If MsgBox("Voulez-vous vraiment archiver cet enlèvement ?", vbQuestion + vbYesNo, "Confirmation") = vbYes Then

            'Créer un nouveau worbook
        Set fileTarget = Workbooks.Add
        Set fileSource = Workbooks("Outils Facturation.xlsm")
        
            'Copie la feuille du classeur d'origine
        fileSource.Sheets("Facture").Copy Before:=fileTarget.Sheets(1)
        fileSource.Sheets("Encodage").Copy After:=fileTarget.Sheets(1)
        For i = 1 To 2
            With fileTarget.Sheets(i).Cells
                .Copy
                .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage valeurs
                End With
            Next i

            'Suppression des feuilles inutilisées
        For i = 3 To 5
            Sheets(i).Delete
            Next i
            
            'Défini les paramètres d'impression : Ce sont déjà les paramètres d'impression et de présentation des feuilles d'origine
          
          'Chemin d'accès fichier
        archive = "U:\...\Archive\" & "Enlèvement " & fileSource.Sheets("Facture").[G3].Value & " du " & fileSource.Sheets("Facture").[B1].Value & ".xlsx"

          'sauvegarde du nouveau fichier
        fileTarget.SaveAs Filename:=archive, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        fileTarget.Close
          
          'Retour sur classeur d'origine
        fileSource.Range("A1").Select
          
            'On rétabli ce qu'on a désactivé avant
        'Application.ScreenUpdating = True 'Même commentaire qu'avant, ce paramètre est remis automatiquement à True à la fin de tes macros
        MsgBox "Fichier arichivé à l'adresse suivant : " & vbCrLf & archive
        
    Else: MsgBox "Echec de l'archivage !"
    End If
End Sub
C'est pourquoi mon code était un peu brouillon. J'avoue que j'ai plus chercher à faire un code qui fonctionne plutôt qu'un code simple !
Pas de soucis là dessus :) c'est la première étape. Par la suite, quand tu te sentiras plus à l'aise, les codes simples seront ceux qui fonctionnent le mieux ;)

C'est juste que je déteste tout ce qui passe par un Activate ou un Select. ça ralenti pas mal le code, et c'est assez brouillon. Malheureusement, pour les actions du type collage spécial, je ne sais pas passer outre.


Sinon, une version plus dans l'esprit de ta macro :
Code:
Sub Button7_Click()
    'Desactive les changement à l'écran
    Application.ScreenUpdating = False
    
    'Déclaration de variable
    Dim archive As String
    
    If MsgBox("Voulez-vous vraiment archiver cet enlèvement ?", vbQuestion + vbYesNo, "Confirmation") = vbYes Then

            'Créer un nouveau worbook
        Set fileTarget = Workbooks.Add
        Set fileSource = Workbooks("Outils Facturation.xlsm")
                
            'Copie des cellules du classeur d'origine
        fileSource.Sheets("Facture").Cells.Copy
        With fileTarget.Sheets(1)
            Application.CutCopyMode = False
            .Name = "Facture" 'Nommée la page "encodage" sur le premier fichier "encodage" sur le second aussi (idem facturation)
            .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage valeurs
            .PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage format (pour les dates entre autre)
            End With

            'Copie des cellules du classeur d'origine
        Sheets("Encodage").Cells.Copy
        With fileTarget.Sheets(2)
            Application.CutCopyMode = False
            .Name = "Facture" 'Nommée la page "encodage" sur le premier fichier "encodage" sur le second aussi (idem facturation)
            .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage valeurs
            .PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage format (pour les dates entre autre)
            End With
        
            'Supprime la feuille inutilisée
        Sheets(3).Delete

            'Défini les paramètres d'impression
        fileTarget.Activate
        ActiveWindow.View = xlPageBreakPreview  'Avoir un affichage en "Page Break View"
        Application.PrintCommunication = False
        For i = 1 To 2 'Boucle sur les 2 pages, vu que c'est la même
            With Workbook(newclass).Sheets(1).PageSetup
                .PrintArea = "$A$1:$G$96" 'A vérifier, j'ai pris le fichier exemple de formulaire.
                .LeftMargin = Application.InchesToPoints(0) 'Marge haut/bas/gauche/droite = 0
                .RightMargin = Application.InchesToPoints(0)
                .TopMargin = Application.InchesToPoints(0)
                .BottomMargin = Application.InchesToPoints(0)
                .HeaderMargin = Application.InchesToPoints(0)    'A définir si ok
                .FooterMargin = Application.InchesToPoints(0)    'A définir si ok

                .Zoom = False   'Option d'impression : centrée sur la feuille
                .FitToPagesWide = 1
                .FitToPagesTall = 1
            End With
        Next i
        Application.PrintCommunication = True
         
          'sauvegarde du nouveau fichier
        archive = "U:\...\Archive\" & "Enlèvement " & [G3].Value & " du " & [B1].Value & ".xlsx" 'Chemin d'accès fichier
        fileTarget.SaveAs Filename:=archive, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        fileTarget.Close
         
          'Retour sur classeur d'origine
        fileSource.Range("A1").Select
        MsgBox "Fichier arichivé à l'adresse suivant : " & vbCrLf & archive
       
        Else: MsgBox "Echec de l'archivage !"
    End If
End Sub
 
Dernière édition:

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Merci beaucoup!

Je n'ai pas encore essayé je te tiens au courant dès que j'en ai eu l'occasion.
Par contre en lisant le code, j'avoue ne pas comprendre cette partie
Code:
 'Copie la feuille du classeur d'origine
        fileSource.Sheets("Facture").Copy Before:=fileTarget.Sheets(1)
        fileSource.Sheets("Encodage").Copy After:=fileTarget.Sheets(1)
        For i = 1 To 2
            With fileTarget.Sheets(i).Cells
                .Copy
                .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage valeurs
                End With
            Next i
C'est quoi cette histoire de copy before et copy after ?
 

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Bon, même si je ne comprends pas trop le code. L'essentiel est là : il fonctionne.
En revanche, 2 problèmes se posent :
- La copie de la page entière reprend même les "boutons d'action" qui du coup ne fonctionne plus.
- Le fait de supprimer les autres pages (les vides) est dérangeant (c'est pour ça que j'avais juste hide) à chaque suppression de page, cela me demande une confirmation : êtes vous sur de vouloir supprimer cette page blablah.

Je pars tester le second code !
 

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

La commande magique pour éviter un certain nombre de messages à la con :

Application.DisplayAlerts = False
 

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Bon le second code ne marche pas (plusieurs erreurs que je ne comprends pas)

J'avais essayé la commande Application.DisplayAlerts = False
Mais sans succès.

J'ai essayé de virer toutes les données de mon fichier pour t'en donner une copie, je l'ai massacré mais l'essentiel de la structure est encore là je pense.
 

Fichiers joints

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

Bon, visiblement, excel n'aime pas les collages spéciaux dans des dossiers non activés ... ( :confused: ) Du coup, ma macro recourt au Joker de l'activate...

Code:
Sub Button7_Click()
    'Desactive les changement à l'écran
    Application.ScreenUpdating = False

   
    'Déclaration de variable
    Dim archive As String
   
    If MsgBox("Voulez-vous vraiment archiver cet enlèvement ?", vbQuestion + vbYesNo, "Confirmation") = vbYes Then

            'Créer un nouveau worbook
        Set fileTarget = Workbooks.Add
        Set fileSource = Workbooks("Outils Facturation.xlsm")
        fileTarget.Activate
        Application.CutCopyMode = False
       
            'Copie des cellules du classeur d'origine
        nomFeuille = Array("Facture", "Encodage")
        For i = 0 To UBound(nomFeuille)
            fileSource.Sheets(nomFeuille(i)).Cells.Copy
            With fileTarget.Sheets(i + 1) 'car le tableau commence à l'indice 0. Pour changer cela, utiliser la commande Option Base 1
                .Name = nomFeuille(i) 'Nommée la page "encodage" sur le premier fichier "encodage" sur le second aussi (idem facturation)
                .Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage valeurs
                .Cells.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'collage format (pour les dates entre autre)
                End With
            Next i
       
            'Cache la feuille inutilisée
        Sheets(3).Visible = False

            'Défini les paramètres d'impression
        Application.PrintCommunication = False
        Application.DisplayAlerts = False
        For i = 1 To 2 'Boucle sur les 2 pages, vu que c'est la même
           fileTarget.Sheets(i).Activate
            ActiveWindow.View = xlPageBreakPreview 'Avoir un affichage en "Page Break View"
           With fileTarget.Sheets(i).PageSetup
                .PrintArea = "$A$1:$i$56" 'A vérifier, j'ai pris le fichier exemple de formulaire.
                .LeftMargin = Application.InchesToPoints(0) 'Marge haut/bas/gauche/droite = 0
                .RightMargin = Application.InchesToPoints(0)
                .TopMargin = Application.InchesToPoints(0)
                .BottomMargin = Application.InchesToPoints(0)
                .HeaderMargin = Application.InchesToPoints(0)    'A définir si ok
                .FooterMargin = Application.InchesToPoints(0)    'A définir si ok
                .Zoom = False   'Option d'impression : centrée sur la feuille
                .FitToPagesWide = 1
                .FitToPagesTall = 1
                End With
            Next i
        Application.PrintCommunication = True
        Application.DisplayAlerts = True
         
          'sauvegarde du nouveau fichier
        archive = "U:\Registres\Registre déchets\docs 2013\Archive\" & "Enlèvement " & [G3].Value & " du " & [B1].Value & ".xlsx" 'Chemin d'accès fichier
        fileTarget.SaveAs Filename:=archive, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
        fileTarget.Close
         
          'Retour sur classeur d'origine
        fileSource.Range("A1").Select
        MsgBox "Fichier arichivé à l'adresse suivant : " & vbCrLf & archive
       
    Else
        'En cas d'annulation
        MsgBox "Echec de l'archivage !"
        End If
End Sub
 
Dernière édition:

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Salut.
Mon Excel a décidé de ne pas fonctionné aujourd'hui. (Il plante et redémarre dès que je clique quelque part)

Je ne peux donc pas tester ta macro pour le moment désolé.
Je te tiens au courant dès que j'ai pu la tester.

Merci
 

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Salut.
Après plusieurs essais hier et aujourd'hui c'est ce code qui fait totalement planter mon Excel.

En revanche, juste un dernier petit truc et après j'arrête de te harceler.
Peut-on en revenir au formulaire ?

J'aimerais encore 2 petites modifications :
1. Lorsque l'on supprime le texte contenu dans une des cellules avec la taille automatique, j'aimerais que la taille de la cellule se remette "par défaut" car actuellement elle reste à la taille qu'elle avait avec le texte dedans.
2. J'ai 3 menus déroulants interdépendants (Secteur/zone/sous-zone) sur 3 hauteur donc (Il faut choisir un secteur avant une zone, et une zone avant une sous-zone) j'aimerais donc si possible que lorsque que l'on change le secteur par exemple, la zone et la sous zone se remettent à 0. Et si on change de zone, la sous-zone se remet également à 0.

J'espère que j'ai été clair, je te remet le fichier au cas où. Merci.
http://cjoint.com/?3InjBl6PWXF
 

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

Voila pour la mise en forme.

Par contre, pour ton fichier, est-ce que tu peux faire fonctionner ma macro ligne après ligne avec la touche F8? histoire de voir où ça coince.
 

Fichiers joints

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Merci !

Pour ce qui est de mon plantage Excel :
Code:
For i = 1 To 2 'Boucle sur les 2 pages, vu que c'est la même
          fileTarget.Sheets(i).Activate
            ActiveWindow.View = xlPageBreakPreview 'Excel plante en traitant cette ligne. Et si je la met en commentaire : la ligne suivante se met en défaut et fait planté à son tour.
          With fileTarget.Sheets(i).PageSetup
               .PrintArea = "$A$1:$i$56" 'A vérifier, j'ai pris le fichier exemple de formulaire.
               .LeftMargin = Application.InchesToPoints(0) 'Marge haut/bas/gauche/droite = 0
               .RightMargin = Application.InchesToPoints(0)
               .TopMargin = Application.InchesToPoints(0)
               .BottomMargin = Application.InchesToPoints(0)
                .HeaderMargin = Application.InchesToPoints(0)    'A définir si ok
               .FooterMargin = Application.InchesToPoints(0)    'A définir si ok
               .Zoom = False   'Option d'impression : centrée sur la feuille
               .FitToPagesWide = 1
               .FitToPagesTall = 1
                End With
            Next i

PS : comment fais-tu pour mettre le code en couleur dans tes messages ?
 
Dernière édition:

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

Mmm, alors là, ça me dépasse ... que le pagesetup et le activewindow.view ne soient pas supportés, j'avoue que je ne sais pas comment te dépatouiller là ...

Mais ton excel supportait la macro générale? celle faite avec l'enregistreur au tout départ?

Pour le code en couleur, il faut remplacer la balise
Code:
 par [Code=VBA]

PS : tu es sous quelle version d'excel en fait ? il me semble que tu avais dit 2010, mais je ne sais plus
 
Dernière édition:

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Oui, je suis sous Excel 2010.
(Mais sur un réseau d'entreprise, et honnêtement Excel plante pour un rien. Notamment en ce qui concerne de près ou de loin les impressions, Excel plante à la moindre occasion c'est pourquoi je ne suis pas vraiment surpris. Et lorsque j'appelle le service informatique, on me répond brillamment : ne fais plus ce que tu faisais avant que ça plante, et ça plantera plus)
C'est pourquoi je n’insiste pas trop sur cette macro, à mon avis tu ne pourras rien y faire. Je reprendrais lorsque l'on m'aura changé mon PC, prochainement en théorie...

Bref,
J'ai fais quelques petites macros tous seul. J'aimerais que tu y jettes un oeil pour me dire ce qui peut être améliorer si tu as encore un peu de temps à m'accorder ?
Notamment 3 points :
- Pourquoi l'enregistrement se met en défaut dans la macro "envoyer un mail"
- Est-il possible de faire en sorte que l'adresse du document soit un lien dans le mail
- Comment nommer son USF ?

Merci !

PS : Comme d'hab... http://cjoint.com/?3InoJAuVBZA
 

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

- Pourquoi l'enregistrement se met en défaut dans la macro "envoyer un mail"
- Est-il possible de faire en sorte que l'adresse du document soit un lien dans le mail
- Comment nommer son USF ?
Il va falloir que tu m'expliques un peu, je ne comprends pas les 2 premières.

Pou nommer l'userform, il faut que tu ailles dans l'onglet Affichage > Fenêtre des propriétés (ou F4). Là, quand tu as sélectionné ton userform dans ton projet VBA, tu peux y changer les propriétés que tu veux, en particulier le nom.
 

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Salut Tirou,

Ok, je me suis pas très bien exprimé (voir même pas bien du tout)
Je récapitule :
- 1. L'enregistrement qui se met en défaut --> Problème réglé, c'était du à une faute de frappe (xslm au lieu de xlsm)
- 2. Est-il possible de faire en sorte que l'adresse du document soit un lien dans le mail --> Je parle de cette partie du code :
Code:
Corps = "Bonjour," & vbCrLf & "<br>" _
    & vbCrLf & "<br>" _
    & "En pièce jointe le RDP du " & [C12].Value & vbCrLf & "<br>" _
    & vbCrLf & "<br>" _
    & "Vous le trouverez également enregistré à l'adresse ci-dessous :" & vbCrLf & "<br>" _
    & "P:\RDP\Nouveaux RDP" & vbCrLf & "<br>" _ 'Ici je souhaiterais avoir un lien vers cette destination
    & vbCrLf & "<br>" _
    & "Bien à vous,"
Je souhaite donc qu'en cliquant sur la ligne "& "P:\RDP\Nouveaux RDP" & vbCrLf & "<br>" _", le dossier "Nouveaux RDP" s'ouvre.

3. Comment nommer son USF --> Même là je me suis mal exprimé je souhaite changer le titre de l'USF (le nom qui apparaît dans la première ligne en haut, celle où il y a la croix pour fermer) car actuellement quand je clique sur le bouton 'signaler un bug' l'USF qui s'ouvre porte comme nom Userform1 !
 

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

Point par point :
1 - Cela m'étonne que tu n'ai pas un bug avec la suite, lors de l'enregistrement de fichier.
En effet, tu indiques à Excel un vichier .xlsm mais tu lui dis après que c'est d'un autre type (FileFormat:=xlOpenXMLWorkbook)
Il vaudrait remplacer la ligne d'enregistrement par
Code:
ActiveWorkbook.SaveAs Filename:=pj, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
2 - J'ai trouvé une syntaxe en cherchant sur le forum, du type file://P:/RDP/Nouveaux RDP, mais je n'arrive pas à le faire fonctionner chez moi (il faut que je valide par Enter dans le corps de message ...) Je te tiens au courant si j'y arrive.

En attendant, essayes de remplacer la ligne par ça et vois ce que ça donne chez toi. (liens direct vers le fichier, je pense que c'est mieux)
Code:
 & "file://" & Replace(pj, "\", "/") & "<br>" _
3 - Il s'agit de la propriété "Caption" de l'objet UserForm1. On a en général le nom de l'objet, ce qui permet d'y faire référence, qui est différent du Caption, ce qui est affiché. (voir le message précédent pour savoir comment le modifier)
 
Dernière édition:

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Effectivement, cela ne fonctionne pas non plus chez moi (besoin de cliquer à la suite du lien et d'appuyer sur entrée pour valider)
J'ai essayé la méthode conseillée par microsoft mais sans succès non plus : Hyperlinks.Add, méthode (Excel)

"Anchor" se met en défaut en permanence chez moi.

Pour le reste, tout est ok maintenant. Merci.
 

villette54

XLDnaute Junior
Re : [VBA] Besoin d'aide pour la création d'une macro

Salut.

Bon j'ai toujours pas réussi à mettre ce foutu lien. (Je vais faire appel à une société pour résoudre le problème)
J'ai encore un peu besoin de toi Tirou, si tu veux bien.

J'ai essayer de reprendre une partie de ton code (du fichier Suivi COTOPO) puisque c'est un peu le même principe. Mais ça donne rien de bon :D.
Je t'explique, je veux prouver à un collègue que certains fichier sont totalement inutile. Pour ça je souhaite mettre en place un "compteur de vues". Ne sachant pas trop comment m'y prendre j'ai décidé de mettre un USF à l'ouverture du fichier qui demande les initiales de la personne avant de pouvoir ouvrir le fichier.
J'aurais souhaité que ces infos s'implémentent automatiquement sur une page caché, afin que je puisse récupérer les résultats plus tard.
Je souhaiterais donc que dans la première colonne s'implémentent les initiales, et qu'à coté s'implémente la date et l'heure.

Merci d'avance.
 

Fichiers joints

Tirou

XLDnaute Occasionnel
Re : [VBA] Besoin d'aide pour la création d'une macro

Salut Villette,

Voilà pour ton compteur.
Je l'ai séparé en deux parties : celle que tu voulais lors du click utilisateur, l'autre à l'ouverture de l'userform (donc à l'ouverture du fichier)
Cela permet de quand même observer les ouvertures des petits malins qui fermeraient ton userform avec la petite croix. Le tout est sauvegardé automatiquement (à voir si c'est problématique pour tes fichiers)


Par contre, il faut bien que tu aies en tête ceci : ce ne sera pas une preuve en tant que tel que les fichiers ne sont pas utilisés : si l'utilisateur a désactivé les macros, tout ce que nous faisons ici n'aura aucun impact ....
 

Fichiers joints

Discussions similaires


Haut Bas