Message d'erreur impossible à désactier??? (VBA sur Word, Office 2003) [Résolu]

Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 9 mai 2006 à 10:18 - Dernière réponse : rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention
- 11 mai 2006 à 16:14
En deux mots: j'ai une macro qui met en page des fichiers Word. Dans ces
fichiers se trouve des tableaux Excel que je dois (entre autre) mettre en
tableau Word. Problème il arrive parfois que j'ai des tableaux Excel avec
liaison mais pas le fichier Excel lié! Lorsque j'applique mon code un message
apparait ("C'ette objet est altérer ou n'est plus disponible") et il
me faut alors cliquer sur "OK" or je développe un robot (il ne faut
donc pas avoirs à faires quoi que ce soit pour que le code s'exécute).
Si vous
avez une solution (que se soit pour tester si c’est un objet Excel lié, empêcher
ce message d’apparaître ou n’importe quoi d’autre) faite le mois savoir s’il
vous plaît. J’en ai mare cas fait 3 semaine que j’ai cette erreur (a vrais dire
j’ai plus ou moins léser tomber et je pris pour que qu’un réponde à ma question)

















Pour reproduire ce problème :
-> Ouvrir Word et Excel
-> Mettre des données dans le tableau Excel et le
copier
-> Faire un collage spécial sous Word pour coller le
fichier avec liaison
·
<!--[endif]-->Edition
·
<!--[endif]-->Collage spécial
·
<!--[endif]-->Coller avec liaison
·
<!--[endif]-->Feuille de calcul Microsoft Office Excel Object
-> Fermer Excel

Si vous tenter d’ouvrir cette objet en code
ou avec l’interface ce ù$¤£µ de message apparaît.

P.S. :
"On error resume next" et "Application.DisplayAlerts" ne
sont pas sufisant!



D'oh! Nuts!
Mmmmm...
DONUTS
Afficher la suite 

21 réponses

Meilleure réponse
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 15:59
3
Merci
YYYYYYYAAAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!
Ca marche!!!!!!!!!!!!!!!

Désol pour le temps de réponce mon chef est venue me caser les ...
Bon donc j'ai un "truc" qui marche il y a plus propre mais bon.

Private Function ClaQueCasFaitMal(ByRef MaRange As Range, ByVal CptElementRecu As Integer) As Boolean
On Error GoTo ClaQueCasFaitMalErr
'pas d'argument nommé, il n'y en a qu'un
If Not ClaQueCasFaitMal2(MaRange, CptElementRecu) Then
MaRange.InlineShapes(CptElementRecu).OLEFormat.ConvertTo ClassType:="Excel.Worksheet.8", DisplayAsIcon:=False
End If
MaRange.InlineShapes(CptElementRecu).OLEFormat.DoVerb wdOLEVerbHide
'rapport de succès
ClaQueCasFaitMal = False
Exit Function
ClaQueCasFaitMalErr:
'MsgBox Err.Number & vbCrLf & Err.Description
Err.Clear
'rapport d'échec
ClaQueCasFaitMal = True
End Function

Private Function ClaQueCasFaitMal2(ByRef MaRange As Range, ByVal CptElementRecu As Integer) As Boolean
Dim Test As String
On Error GoTo ClaQueCasFaitMalErr2
Test = MaRange.InlineShapes(CptElementRecu).OLEFormat.Label
ClaQueCasFaitMal2 = False
Exit Function
ClaQueCasFaitMalErr2:
Err.Clear
ClaQueCasFaitMal2 = True
End Function

Ques que tu en pense??

D'oh! Nuts!
Mmmmm...
DONUTS

Merci Polack77 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

clementio 432 Messages postés samedi 18 mai 2002Date d'inscription 17 février 2014 Dernière intervention - 9 mai 2006 à 16:02
0
Merci
Je suis pas très doué en VBA (j'ai laissé tomber depuis longtemps) mais je pense que le plus simple serait de simuler un click pour fermer le message d'erreur.

Déjà il te faut utiliser les API. Déclare ça au début de ton code:

Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


Ensuite à la suite de ton code qui fait apparaître le message, mets ça:

Dim lHwnd As Long

Sleep 1000
Doevents

lHwnd = FindWindow(vbNullString, "AAAA") 'AAA à remplacer par le titre de la fenêtre du message d'erreur

If lHwnd Then
SendKeys "{ENTER}"
End If

Et c'est tout...

Dis-moi si ça marche, Clm.
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscription 10 août 2018 Dernière intervention - 9 mai 2006 à 16:16
0
Merci
Bonjour

Peux-tu mettre ton code (ou la partie qui pose pb si c'est trop long), et éventuellement la ligne qui te génère cette erreur.
Car vu la description, je ne peux pas en dire plus.

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 9 mai 2006 à 17:36
0
Merci
Heeeee, j'ai fini ma journée à demain. J'ai commancer à regarder ta solution [../auteurdetail.aspx?ID=9289 clementio] je fini demain (je pense que ça dois être possible de faire comme tu dit).
Je met le code qui me posse problème :

Function CopyDonnéeExcel(ByVal RangeTravail As Range) As String
Dim CptLigne As Long 'Copteur ligne
Dim CptColone As Long 'Compteur Colone
Dim PremLigne As Long 'Sauvgarde de la position de la "NomVariable"
Dim PremColone As Long 'Sauvgarde de la position de la "NomVariable"
Dim DerLigne As Long 'Sauvgarde de la position de la "NomVariable"
Dim DerColone As Long 'Sauvgarde de la position de la "NomVariable"
Dim ColoneVide As Boolean 'Flag colone vide
Dim TemponPosition As String 'Saugarde de la postion de l'objet excel (pour remplacement)
Dim CptElement As Integer
Dim MyXl As Object ' Variable devant contenir la référence à Microsoft Excel.
Do While CptElement < RangeTravail.InlineShapes.Count
CptLigne = 0
CptColone = 0
PremLigne = 0
PremColone = 0
DerLigne = 0
DerColone = 0
TemponPosition = ""
CptElement = CptElement + 1
On Error Resume Next 'Si une rerrur se produit continuer le code
RangeTravail.InlineShapes(CptElement).OLEFormat.DoVerb VerbIndex:=wdOLEVerbHide 'ouvre excel avec la feille afficher C là que cas fait mal

DoEvents 'Ouvre excel
DoEvents 'Ouvre la feuille
If Err.Number = 0 Then 'Si aucune erreur ne s'est produite lors de l'ouverture de l'élément
On Error GoTo 0
Set MyXl = GetObject(, "Excel.Application") 'Recu de l'adrs d'excel
'MyXl.Application.DisplayAlerts = False 'Excel ne remonte pas d'erreur

Se reposé c important
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 10 mai 2006 à 09:50
0
Merci
Alors pour la solus de [../auteurdetail.aspx?ID= 9289 clementio], ca me marche pas. J'ai fait ca:

[../auteurdetail.aspx?ID=9289 ] On Error Resume Next 'Si une rerrur se produit continuer le code
****RangeTravail.InlineShapes(CptElement).OLEFormat.DoVerb VerbIndex: =wdOLEVerbHide 'ouvre excel avec la feille afficher
'--------------------------------
Sleep 1000
DoEvents

lHwnd = FindWindow(vbNullString, "Microsoft Office Word") 'AAA à remplacer par le titre de la fenêtre du message d'erreur

If lHwnd Then
SendKeys "{ENTER}"
End If
'---------------------------------------
DoEvents 'Ouvre excel
DoEvents 'Ouvre la feuill

Mon execution se stop à la ligne "****" et attend que je click sur "OK" pour continuer son exection soit passer à la ligne "sleep 1000" (ou alors il faut que je mette le sleep avant ma ligne ****, ça ne me parit pas être possible vue que le sleep stop simplement mon exection durant 1s???)



A votre avis passer un PC pare la fenêtre du 3éme est un
motif de licenciement?




D'oh! Nuts!
Mmmmm...
DONUTS
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscription 10 août 2018 Dernière intervention - 10 mai 2006 à 09:57
0
Merci
Bonjour

L'utilisation de OLe avec VBA excel, je ne manipule pas du tout.

Oui, cela peut-être un motif de liscenciement.

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 11:37
0
Merci
Heeeeeeeeeee, ca marche toujours pas et je vais me faire licencier (piouf le PC) car ça commence
à MENERVER voire même à me les brouter menues mais alors menues (désol c un peut
vulgaire comme expression mais c la plus approprié il me semble)


D'oh! Nuts!
Mmmmm...
DONUTS
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 12:56
0
Merci
Salut 727152 Polack77, salut =9289 clementio, salut 68514 NHenry,

bon, =727152 Polack77, je vois que tu traines toujours ce calvaire derrière toi. Il va falloir sortir l'artillerie lourde (rassures-toi, juste en VBA d'abord). Sutout, ne passe pas ton PC par la fenêtre, mais plutôt le patron qui oserait te licencier pour ça :)

Je vais te faire, ici, une réponse que tu n'aurais pas appréciée si je te l'avais faite dès ton 1er post, mais qui passera mieux maintenant.
Dans ton problème se cache un autre problème : ton code est brouillon. Ben oui, il faut bien te le dire. Ca se soigne, mais dans ton cas, avec l'artillerie lourde. Et il faut savoir aussi que cela ne va pas forcément résoudre ton problème initial. Ben oui, ça aussi, il faut le dire.

On commence :

- D'abord, (il me semble que je t'en avais déjà parlé, dans un sujet avec Mortalino) nier une erreur ne la résoud pas (On Error Resume Next = nier une erreur). Je sais bien que tu ne cherches pas à la nier, mais tu la nies quand même.
- Ne mélange pas le bout de code qui te pose problème avec le code qui marche. Ca veut dire, fais une fonction séparée pour la ligne qui pose problème. Exemple (pour reprendre tes mots) :

Private Function ClaQueCasFaitMal(Byref MaRange As Excel.Range, _
Byval CptElementRecu As Integer) As Boolean
On Error Goto ClaQueCasFaitMalErr
'pas d'argument nommé, il n'y en a qu'un
MaRange .InlineShapes(CptElementRecu).OLEFormat.DoVerb wdOLEVerbHide
'rapport de succès
ClaQueCasFaitMal=False
Exit Function
ClaQueCasFaitMalErr:
MsgBox Err.Number & vbCrLf & Err.Description
'rapport d'échec
ClaQueCasFaitMal =True
End Function

Ensuite, appelles la fonction, exemple :

...
CptElement = CptElement + 1
'si ça ne fait pas mal alors
If Not ClaQueCasFaitMal() Then
'fais ce que tu veux
Set MyXl = GetObject(, "Excel.Application") 'Recu de l'adrs d'excel
End If
...

et dis-nous que cela donne (n° erreur et message, s'il y en a, et s'il n'y en a pas, ne t'inquiètes pas, dis-le, et on continue).

Je te fais faire cela, parce que dans ton cas, ça servira toujours pour plus tard, et parce que, pendant ce temps, je peux investiguer de mon côté (et puisque c'est ce que je vais commencer par faire, si tu le fais, tu trouveras peut-être avant moi [comme d'habitude])

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 13:34
0
Merci
bon, déjà, apparemment, erreur 16389, et pour l'instant, impossible d'empêcher l'affichage de la boite de message tant redoutée.

mais on avance.

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 13:41
0
Merci
Tout pareil.
En tout cas mille fois merci de t'intéresser à mon problème
(je m'apprêtait à balancer l'écran lol)


D'oh! Nuts!
Mmmmm...
DONUTS
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 13:53
0
Merci
Si non si on peut tester l'objet (avec ou sans liaison) alors on n'aurait pas à gérer l'erreur d'ouverture et temps pi si un tableau excel avec liaison mais sans problémes apparait.
Moi je n'ai pas trouver commant tester l'objet non plus, si tu sait?
P.S. : T'inquiéte quant tu dit "ton code est brouillon" il en faut plus (bbbbiiiiieeeennnn plus pour me vexer). Seul sujet un peut tabou est de se moquer de mon orthographe (je suis dysorthographique et dislecsique alors pas facile de
s’exprimer à l’écrit)

D'oh! Nuts!
Mmmmm...
DONUTS
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 14:07
0
Merci
Chez Microsoft, ils ont répertorié plusieurs bugs de différents contextes qui amènent à la même erreur interne. Ils ont un correctif, mais ils précisent bien qu'il ne corrige que les bugs répertoriés. Or, le tien n'y est pas (je confirme, il existe pourtant bel et bien, mais il n'a visiblement pas été rapporté), donc je ne te conseille pas ce correctif.

Néanmoins (on respire plus difficilement :) ), je te propose de tester quelque chose (ce n'est pas vraimment une solution, mais un moyen de différencier les 2 cas possibles de liaison du tableau). Si tu as fait la petite fonction dont je te parlais (ben oui, tu l'as fait, quelle question!), ajoute la ligne suivante, avant la ligne de la mort :

MaRange.InlineShapes(CptElementRecu).OLEFormat.ConvertTo ClassType:="Excel.Worksheet.8" DisplayAsIcon:=False

avec un tableau généré tel que tu l'as décrit, elle déclenche une erreur n°5360, que l'on peut "attrapper" sans que Word n'affiche de boite de message, alors qu'avec un tableau enregistré, elle passe bien.

Reste à voir si tu accèdes toujours à ce que tu souhaites, une fois la conversion réussie.

à toi de jouer.
à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 14:24
0
Merci
Heeeee, j'ai mit "MaRange.InlineShapes(CptElementRecu).OLEFormat.ConvertTo ClassType:="Excel.Worksheet.8" DisplayAsIcon:=False" avant la ligne qui fait mal mais du coup même les tableau Excel sans liaison plante
Erreur :
N° 5360
"Application serveur, fichier source, ou élément introuvable.
Assurez-vous que l'application est correctement installée, et qu'elle n'a pas été supprimée, déplacée ou renommée."
C normal?????
Cette ligne converti le tableau excel en quois???

D'oh! Nuts!
Mmmmm...
DONUTS
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 14:33
0
Merci
bon, d'abord : elle les convertit en "Excel.Worksheet.8", doux nom interne d'une feuille de classeur Excel :)

ensuite, l'erreur 5360, c'était prévu, mais sur mon poste, elle ne se déclenche pas avec un tableau résultant d'un collage avec liaison d'une feuille de calcul Excel enregistrée (ée, parce que c'est la feuille, que j'enregistre).

D'où ma question :
Que veux-tu dire par "les tableau Excel sans liaison"?

à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 14:39
0
Merci
Comme d'ab dans excel (soit des données puis copier) puis dans word
edition
colage spésial
coller (et non pas coller avec liaison)
feuille de calcul ms office excel object

La tu à un tableau excel sans liaison.

Mais en tout cas enor merci je commance à voir le bout! Je n'y croyait

plus.

D'oh! Nuts!
Mmmmm...
DONUTS
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 14:43
0
Merci
bon je teste, pendant ce temps, si tu as d'autres cas prévus que tu n'aurais pas cités, cites-les, STP.

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 15:07
0
Merci
J'ai peut être une solution (mais qui ne me parait pas trés propre).
Deux fonction celle que tu m'a donnée et une qui fait ça :
"MaRange.InlineShapes(CptElementRecu).OLEFormat.Label"
si l'objet n'est pas lier alors erreur N° 6006 (permet donc de tester si l'objet excel est avec liaison ou non)

D'oh! Nuts!
Mmmmm...
DONUTS
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 15:08
0
Merci
il y a mieux, leur type est différent :
MaRange.InlineShapes(CptElementRecu).Type vaut wdInLineShapeEmbeddedOLEObject si "sans liaison"

MaRange.InlineShapes(CptElementRecu).Type vaut wdInLineShapeLinkedOLEObject si "avec liaison"

donc il faut tester le type avant d'exécuter ma ligne.

Si tu me dis qu'il y a :
- Collage spécial avec liaison, classeur enregistré (ok, pas d'erreur)
- Collage spécial sans liaison, classeur enregistré (erreur 5360, mais pas 16389)
- Collage spécial avec liaison, classeur non enregistré (erreur 5360, ma "solution")
- Collage spécial sans liaison, classeur non enregistré (erreur 5360, ma "solution")

on peut résumer en disant :

Si Linked Alors
Si erreur 5360 Alors
pas enregistré '(on couvre ce cas)
Sinon
enregistré ' (pas de problème)
Fin Si
SinonSi Embedded
Si erreur 5360 Alors
enregistré ou pas enregistré '(on ne sait pas encore distinguer ces 2 cas)
Fin Si
Fin Si

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 11 mai 2006 à 16:05
0
Merci
Qu'il ne faut jamais baisser les bras! ou qu'il y a toujours plus profond qu'le fond!

enfin, je m'apprêtais à te dire que je ne trouvait pas de moyen direct, propre (en énumérant toutes les propriétés et sous-propriétés des 2 cas), de distinguer les 2 cas, et qu'il fallait chercher un indirect. Je suis rassuré, tu l'as trouvé.

Gardons à l'esprit que ce n'est qu'un indirect, et qu'il ne résistera peut-être pas à de nouveaux cas, voire même à une nouvelle version d'Excel.

Mais au moins, tu as réussi à isoler le problème dans une fonction, et ça, c'est du bénéfice, du vrai, à long terme.

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 11 mai 2006 à 16:12
0
Merci
Dans tout les cas merci de ton aide je n'aurais pas trouver sans ton coup de pouce.
Meric encor

D'oh! Nuts!
Mmmmm...
DONUTS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.