Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
9 mai 2006 à 10:18
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 2012
-
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 cest un objet Excel lié, empêcher
ce message dapparaître ou nimporte quoi dautre) faite le mois savoir sil
vous plaît. Jen ai mare cas fait 3 semaine que jai cette erreur (a vrais dire
jai plus ou moins léser tomber et je pris pour que quun 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 douvrir cette objet en code
ou avec linterface ce ù$¤£µ de message apparaît.
P.S. :
"On error resume next" et "Application.DisplayAlerts" ne
sont pas sufisant!
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 mai 2006 à 15:59
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
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 9 mai 2006 à 16:02
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
NHenry
Messages postés15116Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 9 mai 2024159 9 mai 2006 à 16:16
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
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 9 mai 2006 à 17:36
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 10 mai 2006 à 09:50
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?
NHenry
Messages postés15116Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 9 mai 2024159 10 mai 2006 à 09:57
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
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 mai 2006 à 11:37
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)
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>
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 mai 2006 à 13:53
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
sexprimer à lécrit)
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 11 mai 2006 à 14:07
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 :
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
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 mai 2006 à 14:24
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???
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 11 mai 2006 à 14:33
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
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 mai 2006 à 14:39
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
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 11 mai 2006 à 15:07
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)
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 11 mai 2006 à 15:08
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
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 11 mai 2006 à 16:05
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>