Problème de copier/collage Spécial en VBA [débutant]

Astrobal

XLDnaute Nouveau
Bonjour,
J'ai trouvé un modèle de facture (sur Excelabo) qui correspond à mes besoins.
J'ai voulu le personnaliser à ma façon, mise en page et quelques détails d'enregistrement des historiques.
Mais maintenant alors qu'il ne me semble pas avoir modifié cette partie du code.
Lors du lancement de la macro d'enregistrement au lieu de copier et de faire un collage des données (valeurs) seules.
J'ai les formules qui sont copiées avec, très gênant pour les champs date et numéro de facture.
Je suis vraiment un utilisateur d'Excel occasionnel et mon niveau est nul en BVA.
Si vous pouviez-voir mon fichier et me dire ce où sont les erreurs.
Ce qui m’embête le plus c'est que le fichier original n'a pas ce problème et que même après trois jours passé dessus, je suis incapable de voir où se situe le problème.

Merci aux bonnes âmes de ce forum.

-- Alain
 

Pièces jointes

  • Essais Factures.zip
    40.5 KB · Affichages: 73
Dernière édition:

Astrobal

XLDnaute Nouveau
Re : Problème de copier/collage Spécial en VBA [débutant]

Bonjour Roland_M,

Oui j'ai bien les valeurs comme ça.
Mais je perds toute la mise en forme et je voudrais garder la copie exacte de la facture pour si besoin la réimprimer.
Il me faudrait les valeurs et la mise en forme.
?
 

Roland_M

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

re

oui ! c'est pour cela que je l'ai supprimé

mais voir ton classeur modifié !
j'ai rajouté ceci
'Suppression des formules
 

Pièces jointes

  • Essais-facture.xls
    47 KB · Affichages: 435
  • Essais-facture.xls
    47 KB · Affichages: 431
  • Essais-facture.xls
    47 KB · Affichages: 448

Roland_M

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

re

alors si ça marche, tu peux mettre simplement comme ceci
(car pastespecial est devenu inutile)

Code:
    Workbooks("Essais-facture.xls").Sheets("facture").Activate
    Cells.Select: Selection.Copy
    Windows(ClassDest).Activate
    Sheets.Add.Name = Onglet
    ActiveSheet.Paste
    'Suppression des formules
    Cells.Select: Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False: Cells(1, 1).Select
    '--------------------------------------------------
 

Staple1600

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

Bonjour à tous


Une autre façon de faire (qui permet d'éviter le Copier/Coller)
Code:
Sub a()
Dim sWBK As Workbook, dWBK As Workbook
Set sWBK = Workbooks("Classeur3")
Set dWBK = Workbooks("Classeur4")
sWBK.Sheets("factures").Copy After:=dWBK.Sheets(dWBK.Sheets.Count)
With dWBK.ActiveSheet
    .Name = "TEST": .UsedRange = .UsedRange.Value
End With
End Sub

PS: Adapter le noms des classeurs selon vos besoins et remplacer TEST par le nom adéquat.

TEST Ok sur mon PC (Je garde le format et les formules sont remplacées par les valeur seules)
 

Astrobal

XLDnaute Nouveau
Re : Problème de copier/collage Spécial en VBA [débutant]

Bon en fait je reviens.

La copie se fait très bien, ça incrémente le classeur Factures-"mmmyy".xls.
Mais la mise en page ne suis pas et le document n'est pas à ce niveau la copie exacte du premier.
J'ai essayé avec le code de Staple1600, mais je n'arrive pas à l’implémenter correctement.
Je n'ai plus le nom des Onglets et je galère !
ET apparemment avec mes essais la mise en page est aussi modifiée.
Donc si vous pouvez me donner des tuyaux supplémentaires.
Ou Staple1600 me guider un peu plus pour correctement appliquer ton code dans ma feuille existante ?

Merci à vous.

-- Alain
 

Roland_M

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

bonjour à tous

Salut à toi Staple !

voir ci-joint ton classeur modifié pour avoir une copie exacte
avec mise en page, mise en forme et tout ...
et bien entendu sans les formules !

rem: dans la page codes le no de facture peut être changé suite à des essais !?
 

Pièces jointes

  • Essais-facture.xls
    53.5 KB · Affichages: 79
  • Essais-facture.xls
    53.5 KB · Affichages: 78
  • Essais-facture.xls
    53.5 KB · Affichages: 99
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

Bonjour à tous
[EDITION: Bonjour Roland_M]

Astrobal
La différence entre mon code et celui de Misange c'est que son code sélectionne les cellules pour les copier dans une feuille créée pour l'occasion alors que mon code copie la feuille (donc toute la feuille) directement dans le classeur DE DESTINATION (Je me sers de cette possibilité qu'offre Excel ;), voir copie d'écran

xlcop.png
Ce qui donne en VBA:
Code:
Sub Macro1()
' Macro1 Macro
' Macro enregistrée le 01/07/2012 par l'enregistreur de macros
    Sheets("facture").Select
    Sheets("facture").Copy Before:=Workbooks("Classeur1").Sheets(1)
End Sub
C'est sur cette base que j'ai fait le code de mon précédent message en ajoutant avec:
Code:
With dWBK.ActiveSheet
    .Name = "TEST": .UsedRange = .UsedRange.Value
End With
la possibilité d'éviter l'emploi du copier/coller qui peut être gourmand en ressource.


PS: Je viens d'ouvrir ta pièce jointe et vais essayer de trouver le temps de te proposer un code mixé de celui de Misange, de Roland_M et du mien.
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

re

re salut staple...
en fait tout est là dans le Module1 (attention aux dernières modif ! celui-ci c'est le dernier qui est ok !)

Code:
Sub Validation()
Dim ClassDest As String, Onglet As String, Msg As String
Dim ReponseMsgbox As Variant, NumFact As Integer

ThisWorkbook.Activate
Msg = "Voulez vous valider cette facture ?" & Chr(10) & "Le numéro de la prochaine facture sera incrémenté de 1"
ReponseMsgbox = MsgBox(Msg, vbYesNoCancel, "Validation")
If ReponseMsgbox = vbCancel Then Exit Sub

If ReponseMsgbox = vbYes Then
   NumFact = [codes!A2]
   Onglet = Format(Now(), "YY-MM") & "-" & NumFact

   'existe-t-il dans le répertoire un classeur factures-févr05.xls si on est en février ?
   'détermination du nom de ce classeur en fonction de mois-Année en cours
   ClassDest = "Factures-" & Format(Now(), "mmmyy") & ".xls"
   'activer le fichier
   On Error Resume Next: Err.Clear
   Workbooks(ClassDest).Activate
   'si le classeur n'est pas déjà ouvert, l'ouvrir
   If Err <> 0 Then
      On Error Resume Next: Err.Clear
      Workbooks.Open (ThisWorkbook.Path & "\" & ClassDest)
      'si le classeur n'existe pas, le créer en utilisant le modèle "modèlemensuel"
      If Err <> 0 Then Workbooks.Add(ThisWorkbook.Path & "\modèlemensuel").SaveAs (ThisWorkbook.Path & "\" & ClassDest)
   End If
   
   'on exporte la facture validée dans le classeur mensuel, en faisant un copier-coller valeurs
   'ce qui fige la date, le numéro de facture et les montants facturés
    On Error Resume Next: Err.Clear
    Workbooks("Essais-facture.xls").Sheets("facture").Copy _
    After:=Workbooks(ClassDest).Sheets(Workbooks(ClassDest).Worksheets.Count)
    ActiveSheet.Name = Onglet
    'Suppression des formules
    Cells.Select: Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False: Cells(1, 1).Select
    ActiveSheet.Shapes("CmdSuite").Delete
    Sheets("récap").Range("A6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("G12")
    Sheets("récap").Range("B6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("E14")
    Sheets("récap").Range("C6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("E15")
    Sheets("récap").Range("D6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("G52")
    Sheets("récap").Range("E6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("G9")
    Workbooks(ClassDest).Save
    
    'sur le classeur Essais-factures, on efface la saisie précédente, on incrémente le numéro et on le sauve
    With Workbooks("Essais-facture.xls")
     .Activate
     .Sheets("codes").Range("A2") = .Sheets("codes").Range("A2") + 1
     .Save
    End With
       
Else
    
    'Si la facture n'est pas validée (incomplète par exemple)
    'elle peut cependant être conservée sous forme d'un document temporaire
    'Mais pour éviter des erreurs (deux factures avec le même numéro...)
    'le numéro de facture est remplacé par la dénomination "en attente"
    ' et le fichier est sauvegardé avec un nom temporaire comportant la date et l'heure
    Sheets("Facture").Copy
    ActiveWorkbook.Sheets("facture").Range("G12") = "En attente"
    Msg = "Attention, le numéro de facture a été effacé. Le document sera enregistré sous un nom temporaire" & Chr(10) & _
    "et le numéro de facture ne sera pas incrémenté à la prochaine création de facture."
    MsgBox (Msg)

    'on enregistre le classeur actif avec la date et l'heure dans le nom
    strDate = Format(Date, "ddmmyy") & "-" & Format(Time, "hmm")
    With ActiveWorkbook
      .SaveAs Filename:=ThisWorkbook.Path & "\factureTemp-" & strDate & ".xls"
      .Close
    End With
End If

    Workbooks("Essais-facture.xls").Activate
    Application.Goto Reference:="ZoneSaisie"
    Selection.ClearContents
    Range("facture!A1").Select
    ReponseMsgbox = MsgBox("Voulez vous saisir une autre facture ?", vbYesNoCancel, "Suite")
    If ReponseMsgbox = vbNo Then Workbooks("Essais-facture.xls").Close
    
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Problème de copier/collage Spécial en VBA [débutant]

Re,



Puisque Roland_M avait déjà fait ce que j'allais faire, je vais m'en servir pour ce qui d'éviter le copier/coller ;)

Merci Roland_M, cela m'a permis de boire mon café chaud ;)

Astrolab: Vous n'avez plus que l'embarras du choix ;

PS: Remplacer cette partie du code initial pour voir si vous obtenu le même résultat que Roland_M
VB:
' au dessus code VBA ne change pas
Workbooks("Essais-facture.xls").Sheets("facture").Copy _
    After:=Workbooks(ClassDest).Sheets(Workbooks(ClassDest).Worksheets.Count)
    ActiveSheet.Name = Onglet
    'Suppression des formules et du bouton
    With ActiveSheet
    .UsedRange = .UsedRange.Value
    .Shapes("CmdSuite").Delete
    End With
 
        With Sheets("récap")
            .Range("A6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("G12")
            .Range("B6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("E14")
            .Range("C6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("E15")
            .Range("D6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("G52")
            .Range("E6553").End(xlUp).Offset(1, 0) = Sheets(Onglet).Range("G9")
        End With
    Workbooks(ClassDest).Save
'au dessous code VBA ne change pas
 

Astrobal

XLDnaute Nouveau
Re : Problème de copier/collage Spécial en VBA [débutant]

Merci à vous deux !

Ce coup-ci c'est parfait :D
J'ai finalement utilisé le code de Staple1600 avec celui de Roland_M ça écrasait la feuille de saisie "facture".
Bon c'est peut être moi qui est mal recopié le code, avec tout mes essais je me suis un peu perdu !
Mais là vraiment de crois que c'est bon.
Ca fait tout ; Copie dans le Classeur de destination et enregistrement dans l'onglet "recap"

Les gars bravo pour votre disponibilité.
Je vous souhaite un excellent dimanche.

-- Alain
:D
 

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 510
Membres
103 572
dernier inscrit
hamzahaha