Erreur 4605 : presse papiers vide ou non valide

Bonjour à tous,

J'ai créé une macro me permettant de copier un grand nombre d'informations contenues dans 2 fichiers Excel pour les coller dans un document Word.

Lorsque je lance ma macro, une erreur s'affiche très souvent à mon écran : "Erreur 4605 : Cette méthode ou propriété n'est pas disponible car le presse papiers est vide ou non valide". Mais des fois, le programme s'effectue parfaitement, sans aucune erreur. J'arrive donc à copier toutes les données que je souhaite aux endroits voulus.

Je me suis donc renseigné a plusieurs reprises pour "vider" ce presse papiers afin que mon programme fonctionne tout le temps sans erreur. Malheureusement aucune de ces solutions ne semble fonctionner (Selection.Clearcontents/Application.cutcopymode=false, etc ...)

J'en viens donc à vous demander votre aide, ayant toujours trouvé ma solution ici ! Voici une version simplifiée de mon code (long mais peu complexe) :

 
Sub ExcelVersWord()

Dim appWord As Word.Application
Dim docWord As Word.Document

Dim k As Integer 'Compteur pour la variable signet située plus bas
Dim L As Integer 'Variable ligne
Dim C As Integer 'Variable colonne
Dim m As Integer 'Autre variable ligne
Dim signet(917) As String
Dim SignetActuel As String

k = 1
L = 5 'On initialise le numéro de ligne à 5
C = 2 'On initialise le numéro de colonne à 2
m = 6 'Compteur utilisé pour la boucle For...Next située plus bas

signet(1) = "PremierSignet"
'tableau de signets ici allant de signet(1) à signet(917)
signet(917) = "DernierSignet"

Set appWord = CreateObject("word.application")
appWord.Visible = True
Set docWord = appWord.Documents.Open("Chemin vers mon fichier ici\Nom de mon fichier", ReadOnly:=False)

Workbooks("MonFichierExcel.xlsm").Worksheets("Page1").Activate

For k = 1 To 197

    SignetActuel = signet(k) 'On affecte à la variable signetActuel le "signet(1)" qui va s'incrémenter à chaque tour de la boucle (signet(2) puis signet(3),etc...)
    Range("C" & m).Copy 'On copie la plage de cellules (Ici au tout premier passage de la boucle on a Range("C6").copy, puis au deuxieme tour Range("C7").copy,etc ...)
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel 'On va au signet enregistré dans la variable SignetActuel du document Word
    appWord.Selection.PasteSpecial 'On colle le contenu de la cellule copiée à l'emplacement du signet
    Selection.ClearContents 'On vide la selection (est-ce vraiment utile ?)
    ViderPressePapier 'Je vais mettre le code de cette fonction dans un autre morceau de code
    m = m + 1 'On incrémente la valeur de m pour pouvoir copier une ligne plus bas à chaque tour de la boucle

Next

'Les boucles suivantes sont très similaires à celle ecrite ci-dessus. Le problème réside donc normalement avant cette ligne

Workbooks("MonFichierExcel.xlsm").Worksheets("Page2").Activate 

For k = 198 To 344

    SignetActuel = signet(k)
    Cells(L, C).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    If C = 8 Then
        L = L + 1
        C = 2
    Else: C = C + 1
    End If
Next

L = 37
C = 2
Workbooks("MonFichierExcel.xlsm").Worksheets("PV Essence 2").Activate

For k = 345 To 547

    SignetActuel = signet(k)
    Cells(L, C).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    If C = 6 Then
        L = L + 1
        C = 2
    Else: C = C + 1
    End If
Next

Workbooks("MonFichierExcel.xlsm").Worksheets("Page1").Activate
m = 219

For k = 548 To 555

    SignetActuel = signet(k)
    Range("C" & m).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    m = m + 1

Next

Workbooks("MonFichierExcel.xlsm").Worksheets("Page2").Activate
L = 5
C = 11

For k = 556 To 702

    SignetActuel = signet(k)
    Cells(L, C).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    If C = 17 Then
        L = L + 1
        C = 11
    Else: C = C + 1
    End If
Next

L = 37
C = 11
Workbooks("MonFichierExcel.xlsm").Worksheets("Page2").Activate

For k = 703 To 905

    SignetActuel = signet(k)
    Cells(L, C).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    If C = 15 Then
        L = L + 1
        C = 11
    Else: C = C + 1
    End If
Next

Workbooks("MonFichierExcel.xlsm").Worksheets("Page1").Activate
m = 228

For k = 906 To 910

    SignetActuel = signet(k)
    Range("C" & m).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    m = m + 1

Next

L = 97
C = 2
Workbooks("MonFichierExcel.xlsm").Worksheets("Page2").Activate

For k = 911 To 917

    SignetActuel = signet(k)
    Cells(L, C).Copy
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel
    appWord.Selection.PasteSpecial
    Selection.ClearContents
    ViderPressePapier
    C = C + 1

Next
End Sub
 

Ici j'affiche le code de ma fonction ViderPressePapiers :

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long

Sub ViderPressePapier()
    OpenClipboard 0
    EmptyClipboard
    CloseClipboard
End Sub

Merci pour vos réponses !

Bonjour Arthur,

pour vider le presse-papiers, essaye : Clipboard.Clear

dhany

salut Dhany,

merci pour ta réponse,

je viens d'inclure ta ligne "Clipboard.Clear" à mon code mais j'ai un autre message d'erreur qui s'affiche : "Erreur d'exécution '424' : Objet requis". Il me semble donc que VBA ne reconnaisse pas l'objet "Clipboard". C'est également ce que j'avais cru lire sur internet lorsque je m'étais renseigné.

j'espérais que mon instruction précédente allait marcher ; tant pis !


j'ai lu un article qui utilise la même méthode que la tienne pour vider le presse-papiers, mais c'est bien précisé qu'il faut mettre tout en haut du module standard :

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long

et ensuite ce que j'ai vu dans ton code :

Sub Vider_Presse_Papier()
  OpenClipboard 0
  EmptyClipboard
  CloseClipboard
End Sub

j'ai pas d'autre idée, alors bonne chance !

dhany

Ah je n'avais pas vu qu'il fallait le mettre en haut du module standard !

Malheureusement je viens d'essayer et ça ne change rien..

Merci beaucoup en tout cas pour ton aide Dhany !

Est ce que quelqu'un d'autre aurait une piste pour m'aider ?

bonjour

oui : supprimer VBA

à quoi te sert de "copier", alors que tu peux :

  • exporter
  • ou incruster un objet Excel dans Word
  • ou fusionner
ou autre...

2 questions :

à quoi peut bien servir de copier un tableau dans Word ?

quel est ton BUT ?

bonjour

oui : supprimer VBA

à quoi te sert de "copier", alors que tu peux :

  • exporter
  • ou incruster un objet Excel dans Word
  • ou fusionner
ou autre...

2 questions :

à quoi peut bien servir de copier un tableau dans Word ?

quel est ton BUT ?

Bonjour jmd,

C'est un peu radical comme solution..

Cela me ferait abandonner tous mes efforts actuels et passés alors qu'il ne me reste plus qu'un problème à résoudre..

Mon but est, pour faire simple, de copier un grand nombre d'informations présentes dans plusieurs fichiers Excel pour les coller dans un même document Word, dont la mise en page est déjà bien établie (Il ne reste plus qu'à remplir des champs vides et des tableaux).

Ce document Word est un rapport envoyé par mon entreprise à une autre et constitue une synthèse générale de résultats d'essais.

La raison pour laquelle je pense qu'il est nécessaire de passer par une macro est que je dois effectuer dans un fichier Excel une recherche du style CTRL+F (avec une liste de mots déjà pré-établie) pour copier les informations qui sont associées à ces mots quelques cellules plus à leur droite. (Ces mots-clés ne sont jamais situés au même endroit dans le document).

Je dois également transférer les valeurs de plusieurs tableaux d'un autre fichier Excel dans mon document Word. Pour cette partie je pense qu'il est effectivement plus utile d'incruster les objets Excel dans Word (donc transférer le tableau en entier) que de copier les valeurs cellule par cellule du tableau avec une boucle (j'avais a la base évité cette première solution de peur de "casser" toute la mise en page du document Word, mais elle paraît tout de même beaucoup plus efficace).

A l'heure actuelle, si mon programme ne se bloque pas à cause du presse-papiers, ma macro est réalisée en une trentaine de secondes. J'y vois donc un avantage majeur, sachant que le remplissage manuel prend plusieurs heures.

Je tiens à apprendre la programmation et c'est pourquoi même si VBA n'est pas la solution la plus performante à vos yeux, j'ai envie de réussir a créer cette macro. J'ai déjà beaucoup appris et souhaite continuer sur cette voie pour le moment.

Bonjour Arthur,

Tu a écrit :

Je tiens à apprendre la programmation et c'est pourquoi même si VBA n'est pas la solution la plus performante à vos yeux, j'ai envie de réussir a créer cette macro. J'ai déjà beaucoup appris et souhaite continuer sur cette voie pour le moment.

félicitations pour ta persévérance dans l'apprentissage du VBA : c'est une très bonne qualité !

dhany

re

salut dhany

quand on veut apprendre la programmation, je déconseille formellement VBA. Dur mais justifié.

aujourd'hui, il faut préférer Python ou C++ par exemple.

note que vouloir continuer à développer ton fichier "parce que je suis presque arrivé au bout" va se heurter à un problème : les difficultés à modifier de multiples macros dans un fichier Excel sont exponentielles, elles grandissent comme le carré de la longueur totale du code cumulé. VBA ne permet pas de bien structurer le code (il y a des experts qui savent le faire, mais c'est leur vie).

VBA est un langage que Microsoft ne fait plus gère évoluer.

ce n'est que mon avis.

dans un cadre professionnel il faut faire simple. Pour son plaisir, on fait ce qu'on veut.

amitiés excelliennes à tous

j'espérais que mon instruction précédente allait marcher ; tant pis !


j'ai lu un article qui utilise la même méthode que la tienne pour vider le presse-papiers, mais c'est bien précisé qu'il faut mettre tout en haut du module standard :

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long

et ensuite ce que j'ai vu dans ton code :

Sub Vider_Presse_Papier()
  OpenClipboard 0
  EmptyClipboard
  CloseClipboard
End Sub

j'ai pas d'autre idée, alors bonne chance !

dhany

Salut Dhany, je reviens vers toi pour te dire qu'en plaçant les lignes de codes

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function CloseClipboard Lib "user32" () As Long

tout en haut du module standard le presse-papiers se vide bien ! Donc merci beaucoup pour tes précisions !

Malheureusement j'ai toujours le même message d'erreur qui s'affiche.

Mon problème vient donc apparemment d'un autre endroit. Je vais essayer de voir où.

re

salut dhany

quand on veut apprendre la programmation, je déconseille formellement VBA. Dur mais justifié.

aujourd'hui, il faut préférer Python ou C++ par exemple.

note que vouloir continuer à développer ton fichier "parce que je suis presque arrivé au bout" va se heurter à un problème : les difficultés à modifier de multiples macros dans un fichier Excel sont exponentielles, elles grandissent comme le carré de la longueur totale du code cumulé. VBA ne permet pas de bien structurer le code (il y a des experts qui savent le faire, mais c'est leur vie).

VBA est un langage que Microsoft ne fait plus gère évoluer.

ce n'est que mon avis.

dans un cadre professionnel il faut faire simple. Pour son plaisir, on fait ce qu'on veut.

amitiés excelliennes à tous

Re JMD,

Je pense également qu'il est préférable d'apprendre avec les langages Python ou C++.

Il s'est avéré que mon entreprise ma demandé pour mon stage de créer des macros sous Excel et c'est pourquoi je me suis tourné vers VBA. On m'a donc un peu forcé la main et ensuite j'y ai pris goût

J'acquière à l'heure actuelle un certain nombre de connaissances et je comprends petit à petit les rouages de la programmation, ce qui me sera certainement utile pour utiliser plus tard ce langage plus puissant qu'est le C++.

Merci pour vos conseils !

Arthur a écrit :

tout en haut du module standard le presse-papiers se vide bien ! Donc merci beaucoup pour tes précisions !

merci pour ton retour ! d'autre part, comme ton code VBA initial est assez long, peux-tu préciser sur quelle ligne d'instruction se produit l'erreur qui persiste ?

dhany

@Arthur

lis d'abord mon message précédent ; ajout : tu as réussi à vider le presse-papiers ➯ le presse-papiers est bien vide !

cette lapalissade est pour te démontrer que dans c'cas, c'est tout à fait normal que tu aies l'erreur que tu as décrite :

« Erreur 4605 : presse-papiers vide ou non valide »

j'sais pas sur quelle ligne de code VBA ton erreur se produit (j'ai pas cherché car ton code VBA est plutôt long).

juste une piste : la partie de code où ça se produit, fait en sorte qu'elle ne soit pas exécutée quand le presse-papiers est vide ; au besoin, remonte cette partie de code au-dessus des instructions qui vident ton presse-papiers.

si ces infos t'ont permis de résoudre ton problème : ok ; merci de passer le sujet en résolu.

sinon, ce serait plus facile de t'aider si tu joins ton fichier (sans données confidentielles)

dhany

Re Dhany !

La ligne d'instruction où se situe l'erreur est :

appWord.Selection.PasteSpecial

Ce qui est bizarre par contre c'est que le programme bloque sur cette ligne parfois dans la boucle "For k = 1 To 197 ... Next", parfois sur la même ligne d'instruction mais dans les autres boucles ("For k= 398 To 344 ... Next"/ "For k = 345 To 547 ... Next", etc ...) et de temps en temps, le programme s'effectue totalement sans erreur.

J'ai effectivement mal identifié mon problème ! Lorsque le programme se bloque c'est parceque le presse-papiers est vide et qu'il n'a donc rien a coller. Mais à mon avis pas à cause de la procédure "ViderPressePapiers" car elle s'effectue en fin de boucle et quand on passe au "k" suivant, on repart au début de la boucle, on copie un nouvel élément dans le presse-papiers qui passe donc de l'état vide à l'état complété d'un élément et normalement le programme à quelque chose à coller ? Je remets la boucle ici pour que ce soit plus clair :

For k = 1 To 197

    SignetActuel = signet(k) 'On affecte à la variable signetActuel le "signet(1)" qui va s'incrémenter à chaque tour de la boucle (signet(2) puis signet(3),etc...)
    Range("C" & m).Copy 'On copie la plage de cellules (Ici au tout premier passage de la boucle on a Range("C6").copy, puis au deuxieme tour Range("C7").copy,etc ...)
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel 'On va au signet enregistré dans la variable SignetActuel du document Word
    appWord.Selection.PasteSpecial 'On colle le contenu de la cellule copiée à l'emplacement du signet
    ViderPressePapier 
    m = m + 1 'On incrémente la valeur de m pour pouvoir copier une ligne plus bas à chaque tour de la boucle

Next

Je vais essayer de suivre ta piste, je n'y avais pas pensé mais ça me semble être une très bonne idée !

Si ça résout mon problème je marquerai le sujet comme résolu.

Malheureusement oui mon fichier ne doit pas être rendu publique, mais je vais essayer de fournir un exemplaire ressemblant et sans données confidentielles

Merci beaucoup !

même si tu trouves une solution, je compte te proposer quelque chose qui devrait te plaire (mais ça va me prendre du temps).

dhany

@Arthur

juste une piste : la partie de code où ça se produit, fait en sorte qu'elle ne soit pas exécutée quand le presse-papiers est vide ; au besoin, remonte cette partie de code au-dessus des instructions qui vident ton presse-papiers.

dhany

Encore moi Dhany ! Problème résolu !!! Je viens de placer l'instruction

On Error Resume Next

dans ma boucle et le programme tourne jusqu'au bout à chaque fois maintenant ! Bien évidemment ça ne résout pas complètement l'erreur, mais sur 917 signets je n'en ai que 4 en moyenne qui ne se remplissent pas ! Donc je suis déjà très content.

Par contre je ne comprend toujours pas pourquoi ces signets là ne se remplissent pas. J'ai remarqué à l'instant que j'avais quelques cellules vides dans certains tableaux ce qui aurait pu être la source du problème (dans ce cas de figure le programme copie le contenu de la cellule (inexistant) dans le presse-papiers qui est donc vide à l'emplacement associé, et quand le programme essaie ensuite de coller le dernier élément enregistré dans le presse-papiers, il ne trouve rien à cet emplacement et bloque ..).

Mais bizarrement ce n'est pas pour les signets associés aux cellules vides que le programme bloque. Et plus étrange encore, les signets non remplis changent d'un lancement de la macro à un autre. Cela restera donc un mystère.

Dans tous les cas merci infiniment pour ton aide Dhany, tu m'as apporté le feu.

Pour les personnes intéressées par cette solution, je place l'aspect final de ma boucle ci-dessous. J'ai donc enlevé la procédure ViderPressePapiers qui ne m'est plus utile.

For k = 1 To 197

    SignetActuel = signet(k) 'On affecte à la variable signetActuel le "signet(1)" qui va s'incrémenter à chaque tour de la boucle (signet(2) puis signet(3),etc...)
    Range("C" & m).Copy 'On copie la plage de cellules (Ici au tout premier passage de la boucle on a Range("C6").copy, puis au deuxieme tour Range("C7").copy,etc ...)
    appWord.Selection.Goto what:=wdGoToBookmark, Name:=SignetActuel 'On va au signet enregistré dans la variable SignetActuel du document Word
    On Error Resume Next
    appWord.Selection.PasteSpecial 'On colle le contenu de la cellule copiée à l'emplacement du signet
    m = m + 1 'On incrémente la valeur de m pour pouvoir copier une ligne plus bas à chaque tour de la boucle

Next

Je marque le topic comme résolu

Bonjour Arthur,

Tu a écrit :

Dans tous les cas merci infiniment pour ton aide Dhany, tu m'as apporté le feu.

merci pour ton retour, j'en suis positivement ravi !

Problème résolu !!!

parfait ! mais tiens-toi bien : TOUT ton LONG code VBA initial peut être réduit à ceci :

Option Explicit

Dim appWord As Word.Application
Dim signet(917) As String, lig&

Private Sub Job(FX$, A%, B%, col1%, col2%)
  Dim col%, k%: col = col1
  With Workbooks("MonFichierExcel.xlsm").Worksheets(FX)
    For k = A To B
      appWord.Selection.Goto what:=wdGoToBookmark, Name:=signet(k)
      .Cells(lig, col).Copy: appWord.Selection.PasteSpecial
      If col = col2 Then
        lig = lig + 1: col = col1
      Else
        col = col + 1
      End If
    Next k
  End With
End Sub

Sub ExcelVersWord()

  Dim docWord As Word.Document

  signet(1) = "PremierSignet"
  'tableau de signets ici allant de signet(1) à signet(917)
  signet(917) = "DernierSignet"

  Set appWord = CreateObject("word.application")
  appWord.Visible = True
  Set docWord = appWord.Documents.Open("Chemin vers mon fichier ici\Nom de mon fichier", ReadOnly:=False)

  lig = 6  ' à partir de la ligne  6

  Job "Page1", 1, 197, 3, 3    ' signets   1 à 197, colonnes C à C
  Job "Page2", 198, 344, 2, 8  ' signets 198 à 344, colonnes B à H

  lig = 37: Job "PV Essence 2", 345, 547, 2, 6
  lig = 219: Job "Page1", 548, 555, 3, 3
  lig = 5: Job "Page2", 556, 702, 11, 17
  lig = 37: Job "Page2", 703, 905, 11, 15
  lig = 228: Job "Page1", 906, 910, 3, 3
  lig = 97: Job "Page2", 911, 917, 2, 8

End Sub

normalement, ça devrait être bon du 1er coup ; mais sans ton fichier réel, et donc sans avoir pu tester, comment être sûr ?

donc y'aura p't'être un ou deux p'tits ajustements à faire par-ci par-là ; à toi de tout contrôler soigneusement.

n'oublie pas de me donner ton avis.

dhany

normalement, ça devrait être bon du 1er coup ; mais sans ton fichier réel, et donc sans avoir pu tester, comment être sûr ?

donc y'aura p't'être un ou deux p'tits ajustements à faire par-ci par-là ; à toi de tout contrôler soigneusement.

n'oublie pas de me donner ton avis.

dhany

Désolé Dhany, je viens de voir ton message ! Merci beaucoup pour ton aide

Effectivement ça à l'air beaucoup plus rapide !

Par contre je n'ai pas bien compris les lignes de code :

Private Sub Job(FX$, A%, B%, col1%, col2%)
  Dim col%, k%: col = col1
  With Workbooks("MonFichierExcel.xlsm").Worksheets(FX)
    For k = A To B

la suite j'ai compris mais pour cette partie est-ce que tu pourrais m'expliquer un peu ?

Bonjour Arthur,

Private Sub Job(FX$, A%, B%, col1%, col2%)

c'est la sub privée Job() : elle ne peut pas être appelée directement par l'utilisateur ; elle est appelée uniquement par la sub ExcelVersWord() (qui est publique par défaut) ; la sub Job() fait toujours le même travail, mais selon les 5 paramètres qui lui sont envoyés en arguments de la fonction :


FX$ est le nom de la feuille, utilisé dans With Workbooks("MonFichierExcel.xlsm").Worksheets(FX)

lors de l'appel, c'est "Page1", "Page2", ou "PV Essence 2"


A% : c'est le 1er signet ; B% : c'est le 2ème signet ; utilisés dans : For k = A To B

lors de l'appel, c'est les paramètres n° 2 et 3 ; donc pour Job "PV Essence 2", 345, 547, 2, 6

c'est du signet A au signet B ➯ du signet 345 au signet 547 ; car note bien son utilisation :

appWord.Selection.Goto what:=wdGoToBookmark, Name:=signet(k)

bien sûr, k est déclaré avec le même type que A et B : Dim k% (donc k est un Integer)

Dim col%, k% est un abrégé de : Dim col As Integer, k As Integer


col1% : c'est la colonne début ; col2% : c'est la colonne fin ; donc pour l'exemple précédent

Job "PV Essence 2", 345, 547, 2, 6 : c'est de la colonne B à la colonne F ; après F, ça ira à

la ligne suivante et en colonne B.

dans cet autre exemple : Job "Page1", 548, 555, 3, 3 : c'est de la colonne C à la colonne C ;

donc pour une seule colonne, la colonne C ; après C, ça ira à la ligne suivante, colonne C.


note bien que j'ai pas mis le n° de ligne lig& en paramètre mais comme une variable globale de niveau module ; pourquoi ? uniquement car pour les signets 198 à 344 (donc pour le 2ème appel), tu n'as pas précisé explicitement quelle est sa valeur, et donc la valeur de lig est celle qu'elle avait à la fin du 1er appel.

sauf pour ce 2ème appel, lig est initialisé partout avant l'appel de la sub Job(), y compris pour le 1er appel ; si, si, regarde

un peu au-dessus, y'a : lig = 6 ' à partir de la ligne 6

si t'étais absolument sûr de pouvoir indiquer explicitement la valeur de lig avant chaque appel de Job(), on pourrait simplifier le programme en mettant lig non plus comme une variable globale du module mais comme un paramètre à envoyer à Job().

dans le cas présent, faudrait qu'tu dises quelle doit être la valeur de lig pour le 2ème appel de Job(), donc pour les signets

198 à 344 ; et plus tard, après modif du code VBA, tu devras indiquer lig pour chaque futur nouvel appel de Job().


voilà, j'espère qu'avec toutes ces infos, ce sera plus clair pour toi (et pour d'autres lecteurs).

ça va ? c'était pas trop rébarbatif ? t'as l'droit d'faire une longue pause !

dhany

Rechercher des sujets similaires à "erreur 4605 presse papiers vide valide"