Macro coller depuis presse-papier

Résolu
touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   -  
Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour le forum

J'ai un petit souci que je n'arrive pas à expliquer.
J'ai fait une macro qui colle ce qui se trouve dans le presse-papiers dans une feuille particulière de mon classeur :
Sub Collage1()

Application.CutCopyMode = True
Sheets("MESS1").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub


Avant de lancer ma macro, je copie un tableau depuis un autre fichier (son nom est variable).
Mon souci : la macro me renvoie une erreur "La méthode PasteSpecial de la classe Range a échoué" : je pense avoir trouvé pourquoi : le fait de lancer ma macro enlève ma sélection dans le fichier source.

Puis-je vous demander de l'aide ?
D'avance merci

17 réponses

  1. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    Bonjour,
    En principe vous copier et coller depuis la macro qui se trouve sur le classeur 2.
    Le code suivant ou vous adaptez les noms selon vos besoins :
    Sub copiercl1colllercl2()
    ' copier le tableau du classeur 1
        Windows("nomcla1.xlsx").Activate
        Sheets(1).Range("plage du tableau").Copy
    ' coller dans classeur 2 sur feuille "MESS1" dès [A1]
        Windows("nomcla2.xlsm").Activate
        Sheets("MESS1").Range("A1").Select
        Sheets("MESS1").Paste
    End Sub
    

    0
  2. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Bonjour Le Pingou

    Merci pour le bout de code, mais ça ne peut pas fonctionner dans mon cas, car comme mentionné dans le premier message, le nom de la feuille à copier est variable, et le nom de fichier variable.
    Une autre idée ?

    Merci d'avance
    0
  3. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    Bonjour,
    Eh bien sans référence précise pour le tableau à copier il n'est pas possible de réaliser une macro, vous devez donc le faire manuellement.
    Ou trouver un point commun pour que la macro détecte le tableau !

    0
  4. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Bonjour

    Merci de votre réponse.

    Malheureusement, le nom de fichier source est généré par un .EXE et je ne peux pas le fixer.
    Je ne comprends pas pourquoi la macro annule le contenu de mon presse-papiers. Pardon d'insister, mais n'y a-t-il vraiment aucun moyen de fixer son contenu en mémoire ou dans une feuille Excel ?

    Merci pour votre aide en tout cas
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Bonjour Le Pivert

    Merci bien pour cette solution.
    Cependant, j'obtiens une erreur "erreur de compilation - type défini par l'utilisateur non défini".
    D'après mes recherches ce message est lié à "Microsoft ActiveX Data Objects 2.0 Library".
    Est-ce quelque chose à installer en plus, ou à activer ?
    Google ne m'a pas apporté de réponse compréhensible ..; vous connaissez ça ?
    En tout cas merci beaucoup
    0
  7. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Voici les références que j'ai:



    0
  8. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Il me manquait "Microsoft Forms 2.0", je l'ai installé depuis Développeur > Visual Basic > Outils > Références > Parcourir > FM20.DLL

    Ceci m'a débarrassé du message.
    Je sens que je suis pas loin du bout, mais rien ne se colle (j'ai du faire une erreur dans la macro).
    Puis-je vous demander de faire un essai chez vous ?
    Voici la macro :

    Sub Collage1()
    Dim MyData As New DataObject
    Dim strClip As String
    On Error GoTo NotText
    MyData.GetFromClipboard
    strClip = MyData.GetText
    Sheets("COLG1").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    NotText:
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    End Sub


    Je vous en remercie par avance !
    0
  9. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    Bonjour,
    Votre procédure doit être comme suit :
    Sub Collage1()
     Dim MyData As New DataObject
     Dim strClip As String
     On Error GoTo NotText
     MyData.GetFromClipboard
     strClip = MyData.GetText
     Sheets("COLG1").Range("A1").PasteSpecial Paste:=xlValues, Operation:=xlNone, _
     SkipBlanks:=False, Transpose:=False
    NotText:
     End Sub
    


    Salutations.
    Le Pingou
    0
  10. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Bonjour

    Merci pour ce code simplifié et propre.
    J'ai compris ce matin pourquoi ce code ne fonctionnait pas, même avec ce code :
    En réalité, le fichier source n'est pas un fichier Excel, mais un fichier CSV, et le presse-papier ne s'importe pas depuis un 'copier' effectué sur un CSV.

    Je peux changer d'avis ?
    Y aurait-il moyen, par macro, de faire appel à une boîte de dialogue avec un 'Parcourir' pour montrer à Excel où se trouve le CSV, et de demander à la macro de copier la feuille1 (Sheet1) dans la feuille COLLG1 du fichier qui contient la macro ?

    Pardon pour ce revirement, mais j'essaie de m'adapter.

    Merci encore pour votre bonne volonté
    0
    1. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      Bonjour,
      Eh bien si c'est un fichier d'extension [csv] alors remplacer la ligne :
      Sheets("COLG1").Range("A1").PasteSpecial Paste:=xlValues, Operation:=xlNone, _
      SkipBlanks:=False, Transpose:=False

      Par la suivante et cela fonctionne :
      Sheets("COLG1").Range("A1").PasteSpecial Paste:=xlValues


      Note: pourquoi vouloir absolument utiliser une macro alors que le simple Copier (Ctrl+C) et le coller (Ctrl+V) et nettement plus rapide....!
      Salutations
      Le Pingou
      0
    2. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
       
      @ Le Pingou : c'est parce que derrière le copier/coller il y a tout un tas d'autres opérations que je n'ai pas mentionné parce qu'elles ne me posent pas de problème.
      Et aussi parce qu'il y a de nombreux utilisateurs et qu'il faut uniformiser ...
      Merci @ plus
      0
  11. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    voici une macro pour rechercher le chemin d'un classeur. Il suffit de changer xls en csv et remplacer A1 par une variable:

    Dim Fichier As Variant
        'Affichage de la la boîte de dialogue standard "Ouvrir" pour sélectionner un fichier
        'sur le disque dur.
        'GetOpenFilename permet de lire le nom du fichier sélectionné par l'utilisateur sans
        'réellement ouvrir le fichier.
    Fichier = Application.GetOpenFilename("Fichiers (*.xls;*.xla),*.xls;*.xla")
        [A1] = Fichier 'inscrire le chemin du fichier sur la feuille 1
         'Vérifie si l'utilisateur a cliqué sur le bouton "Annuler" ou sur la croix de fermeture.
        If Fichier = False Then
            MsgBox "Opération Annulée"
            'pour sortir de la procédure
            Exit Sub
        End If

    0
    1. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      Bonjour cs_Le Pivert,
      Bonne solution sauf qu'il doit traiter un fichier d'extension [csv] et dans se cas il ne le verra pas .......(*.xls;*.xla),*.xls;*.xla")...!
      Salutations
      Le Pingou
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Tu n'as pas tout lu!

      Il suffit de changer xls en csv et remplacer A1 par une variable:


      @+
      0
    3. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
       
      Remplacement XLS par CSV : c'était fait et ça a fonctionné.
      C'est la variable qui m'a posé problème, car le chemin d'accès n'était pas fixe.
      Donc je n'ai pas pu remplacer Fichier par c:\Exemple\Fichier.xls

      @ plus
      0
  12. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Salut

    Je suis en train d'adapter le code.
    Ca a l'air de fonctionner.
    Je vous fais un reply dès que j'ai fini ou si je coince vraiment.
    A plus, merci à vous
    0
  13. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Et bien ça y est, je coince et je vais devoir à nouveau vous demander le coup de patte final.
    Dommage, j'y étais presque.

    J'ai essayé d'adapter votre code, mais le
    [A1] = Fichier
    m'a bloqué.
    Je suis tombé sur un autre bout de code que j'ai adapté et que voici :
    Sub ImportCSV()

    Dim FichierCSV1
    FichierCSV1 = Application.GetOpenFilename("Fichiers (*.csv), *.csv")
    If FichierCSV1 <> False Then
    With Worksheets("COLLG1")
    .UsedRange.ClearContents
    With .QueryTables.Add(Connection:="TEXT;" & FichierCSV1 & "", Destination:=.Range("A1"))
    .PreserveFormatting = False
    .TextFileSemicolonDelimiter = True
    .Refresh BackgroundQuery:=False
    .Delete
    End With
    End With
    End If
    Sheets("COLLG1").Select
    Cells.Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    End Sub


    De cette façon, ma feuille source s'importe bien dans le fichier qui contient la macro, et dans la bonne feuille.
    Le problème, c'est que les valeurs sont alors considérées comme du texte et non des nombres (sauf la colonne L car elle ne contient pas de décimales).
    C'est cette partie qui ne fonctionne pas :
        Sheets("COLLG1").Select
    Cells.Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

    Je l'ai obtenu à partir de l'enregistreur de macros, mais si je fais "à la main" exactement la même chose que pendant l'enregistrement, aucun problème mes valeurs sont bien considérées comme des nombres.
    Mais qu'est-ce que je fais de travers ???
    Si vous avez des idées ...
    0
  14. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Laissez tomber !
    J'ai trouvé :
    Il faut taper
    Selection.Replace What:=".", Replacement:=","

    et non Selection.Replace What:=".", Replacement:="."
    A plus
    0
    1. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
       
      Non c'est l'inverse, désole :
      Ne pas taper :
      Selection.Replace What:=".", Replacement:=","
      Mais plutôt :
      Selection.Replace What:=".", Replacement:="."
      Même si c'est étonnant, ça fonctionne ainsi
      0
  15. touroul Messages postés 526 Date d'inscription   Statut Membre Dernière intervention   17
     
    Tout est nickel

    Merci encore pour votre aide.

    Je marque en résolu ...

    Bonne journée !
    0
  16. paqmarc
     
    Bonjour,
    J'ai ce bout de code:
    Worksheets("Retour").QueryTables.Add("TEXT;" & Frecent, [H2]).Refresh

    Le résultat est qu'il insère une nouvelle colonne A avec le résultat voulu

    Comment je peux corriger ce code afin qu'il colle à A2 le texte au lieu de l'insérer ds une nouvelle colonne A2 ?

    Merci de vos réponses.
    0
  17. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    Bonjour paqmarc,
    Ce poste est comme RESOLU depuis plus d’une année. Je pense que vous aurez plus de chance d’avoir une réponse en créant un nouveau poste en expliquant votre problème qui n’est certainement pas le même que pour ce poste.
    0
  18. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    Cette macro récupère la plage de cellule qui a été copiée et mise dans le presse papier. Bien entendu, il ne faut rien mettre ensuite dans le presse papier. Il suffit alors de sélectionner l'endroit où l'on veut mettre la plage et d'appeler la macro:

    Sub Format_Sheet()
     Dim MyData As New DataObject
     Dim strClip As String
     On Error GoTo NotText
     MyData.GetFromClipboard
     strClip = MyData.GetText
     Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
     SkipBlanks:=False, Transpose:=False
    NotText:
     End Sub


    -1