Copier / coller : erreur 1004

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous,

je n'arrive pas à faire un tout bête copier / coller entre 2 logiciels (Flexpro et Excel 2007) utilisant VB6 (VB 6.3 pour les 2).

L'erreur "Run-time error 1004" apparaît => " la méthode PasteSpecial de la classe Range a échoué ".

Ma macro est dans Flexpro, je la lance depuis VB de Flexpro.
Je crée un objet Excel et ouvre le fichier dans lequel je veux faire mon coller :

Création d'un objet Excel
Set oAppExcel = CreateObject("Excel.Application")
' Ouverture du fichier Excel à renseigner
sFichier = InputBox("Sélectionner le fichier Excel à renseigner", File, "H:\macro\toto.xlsx")
oAppExcel.Workbooks.Open (sFichier)


Après avoir sélectionné la donnée que je souhaite copier, j'ai essayé sans succès un collage spécial...

ActiveDatabase.TaskWindows(fpTaskWindowObjectList).Activate
' selection de la donnée 

ActiveDatabase.Selection.SelectObject "Data"
ActiveDatabase.Selection.Copy

' optionnel
oAppExcel.Visible = True

oAppExcel.ActiveWorkbook.Worksheets("Feuil1").Range("B5").PasteSpecial (xlPasteValues)


c'est comme s'il n'y avait rien à coller.

Avez-vous une piste pour m'aider ?
Merci d'avance.

ToM

11 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Dans un premier temps, il faudrait t'assurer que tu as bien des données copiées...

Ensuite, tu pourrais essayer avec .Paste plutôt que .PasteSpecial pour voir si change quelque chose.

NB: je ne connais pas FlexPro...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
oui quand je fais paste après avoir copier cela marche dans Flexpro.
J'ai essayé aussi avec paste, cela ne fonctionne pas.

je ne pense pas que cela vienne de Flexpro. je ne connais pas d'autre appli ayant VBA, mais le principe devrait rester le même à mon avis.

ToM
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
pour y voir vraiment clair :
Que se passe-t-il lorsque après avoir exécuté ces deux lignes :
ActiveDatabase.Selection.Copy

' optionnel
oAppExcel.Visible = True

tu vas dans une cellule du classeur visible et presses les touches CTRL+V ?
Ta réponse précise à ce sujet nous permettra de savoir le plus simplement et le plus clairement du monde si tu as bien quelque-chose de reconnaissable par Excel dans le presse-papier.
Et on verra alors comment procéder différemment, si nécessaire.
Ta réponse après essai ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
J'espère par ailleurs :
1) que le classeur actif est bien celui attendu et qu'il possède bien une feuille nommée "DFeuil1" et qu'elle n'est pas protégée.
2) que tu n'envoies plus de 911 caractères en cellule B5

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
- apres avoir mis Excel visible, je fais ctr+V, cela ne colle rien, donc cela veut dire que j'ai rien dans le copier.
- quand je fais enregistrer une macro dans Flexpro, je fais ctrl+C de ma valeur, je vais dans Excel, je fais ctrl+V, cela colle bien ma valeur.
le code associé est le suivant

    ActiveDatabase.TaskWindows(fpTaskWindowObjectList).Activate
    ActiveDatabase.Selection.SelectObject "Data"
    ActiveDatabase.Selection.Copy

    Databases("\\monchemin\modele.FPD").Activate
    ActiveDatabase.TaskWindows(fpTaskWindowObjectList).Activate


la 2eme partie du code est lorsque je reselectionne mon fichier Flexpro pour faire Stop à l'enregistrement de la macro.

il n'y a pas de protection sur le fichier Excel, la page est bien nommée.
je vais essayé d'etre plus clair dans mes explication:

j'ai enregistré une macro (par le bouton record), en étant sous mon logiciel Flexpro, j'ai fait copier sur Flexpro puis coller dans Excel et ça a marché.

j'ai ensuite fait une manip identique sur Excel, j'ai enregistré une macro, sélectionne une cellule, fait copier puis coller dans une autre cellule.

J'ai ensuite récupéré le code de la sélection/copie dans VBA Flexpro, récupéré le code de coller dans VBA Excel, et j'ai mis tout ça dans Flexpro. C'est lorsque j'arrive à ma ligne de code coller que ça plante.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
ActiveDatabase.Selection.Copy

est donc incriminé !
Je ne connais pas ton Flexpro, mais :
- soit cette syntaxe n'est pas la bonne
- soit elle ne met rien dans le presse-papiers de Windows (et n'alimente qu'un "tampon" Flexpro !
- soit dépassement de 911 caractères
Et tu ne m'as pas répondu en ce qui concerne le nombre de caractères !
C'est important car si dépassement de 911 caractères ===>>> erreur si collage par code alors que pas d'erreur si collage manuel !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

- soit cette syntaxe n'est pas la bonne

c'est celle donnée par la macro en mode enregistrement dans mon appli Flexpro


- soit elle ne met rien dans le presse-papiers de Windows (et n'alimente qu'un "tampon" Flexpro !

je ne pense pas car en le faisant manuellement cela fonctionne

- soit dépassement de 911 caractères

comment je peux le voir ? c'est une valeur du style "123.456"
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Dis-nous ce qui se passe si tu mets ceci dans la partie "générale" (tout en haut de ton module de code) :
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Long, ByVal ByteLen As Long)

et que, dans ton code, tu remplaces cette ligne :
oAppExcel.ActiveWorkbook.Worksheets("Feuil1").Range("B5").PasteSpecial (xlPasteValues)

par :

 Dim hStrPtr As Long, lLength As Long, sBuffer As String
   OpenClipboard 0
   hStrPtr = GetClipboardData(1)
    If hStrPtr <> 0 Then
        lLength = lstrlen(hStrPtr)
        If lLength > 0 Then
            sBuffer = Space$(lLength)
            CopyMemory ByVal sBuffer, ByVal hStrPtr, lLength
            oAppExcel.ActiveWorkbook.Worksheets("Feuil1").Range("B5").Value = sBuffer
        End If
    End If
    CloseClipboard




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Bonjour,

en remplaçant par ton code, cela ne plante plus, mais ça ne passe pas dans le If, donc il n'y a rien à coller si je comprends bien :(

je vais continuer de creuser sur le
ActiveDatabase.Selection.Copy
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Je crois que ton problème est en effet à ce niveau-là, dans ce cas.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ