Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Contribuez
Contribuez Placez ici vos codes, sources, trucs et astuces que vous souhaitez partager avec les membres du club.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2011, 22h32   #1
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Par défaut Eviter les références Manquantes

Salut
Voila que dites vous de ce code, j’espère en l'utilisant pouvoir éviter les problèmes lié à l'utilisation des références.
En effet si vous utilisez un code utilisant une référence à l'application Powerpoint par exemple, si vous déployez votre fichier sur un ordinateur ne possédant pas la référence nécessaire ou du moins de la bonne version, le code VBA plante.

J'attend vos commentaires
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim RefIsBroken As Boolean
On Error Resume Next
Err.Clear
'On recherche si la ref PowerPoint est active
RefIsBroken = ThisWorkbook.VBProject.References("PowerPoint").IsBroken
If Err.Number <> 0 Then RefIsBroken = True
On Error GoTo 0
 
#If RefIsBroken Then
    Dim objPPT As Object
    Dim objPres As Object
    Dim objSld As Object
    Dim objShape As Object
    Dim objShape2 As Object
#Else
    Dim objPPT As PowerPoint.Application
    Dim objPres As PowerPoint.Presentation
    Dim objSld As PowerPoint.Slide
    Dim objShape As PowerPoint.Shape
    Dim objShape2 As PowerPoint.Shape
#End If
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2011, 06h12   #2
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 609
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 609
Points : 30 959
Points : 30 959
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Salut

Il faudrait ajouter un complément à ton code.

En effet, dans le cas où tu es dans ta première condition, ton code risque de planter en cas d'utilisation de constantes PPT(par exemple ppBorderBottom) si tu n'as pas fait une déclaration de ces constantes avec leurs valeurs par exemple.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2011, 06h56   #3
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut Philippe
Merci, pour cette remarque, je compléterais ce soir

[Edit]
J'ai bien peur de lettre un peu trop emballé pour cette idée...
Si on prend un cas plus simple pour faciliter les écritures, je vais donc prendre le cas d'Internet Explorer.

1ere possibilité d’écriture

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Option Explicit
Sub TesteIE()
'Activer les refs M$ Internet controle et M$ Html Object Library
Dim RefIsBroken As Boolean 'initialisé a False
 
On Error Resume Next
Err.Clear
'On recherche si la ref Internet Explorer et Html Object Library sont actives
RefIsBroken = Not ThisWorkbook.VBProject.References("SHDocVw").IsBroken
If CBool(Err.Number <> 0) Then RefIsBroken = True
On Error GoTo 0
 
 
#If RefIsBroken Then
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
#Else
    Dim IE As New InternetExplorer
#End If
 
IE.Visible = True
 
End Sub
Lors de la conception, si la Ref Internet est activé, pas de soucis, on a bien l'autocomplétion, la ref est prise en compte et la déclaration
Code :
Dim IE As New InternetExplorer
est prise en compte car RefIsBroken est initialisé à False et est donc interpreté à False ici
.
Donc jusque la c'est bon, on peut également exécuter le code sans problème.

Maintenant, supprimons la ref Internet Controle.
En mode conception, pas d’autocomplétion, normal puisque le ref n'est plus active.
Par contre au lancement ... il plante sur
Code :
Dim IE As New InternetExplorer
Logique étant donnée que VB A interprète le code une première fois pour les déclarations et on a toujours RefIsBroken initialisé a False....

2eme possibilité
Qu'à cela ne tienne! Il suffit d'ecrire ainsi
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Option Explicit
Sub TesteIE()
'Activer les refs M$ Internet controle et M$ Html Object Library
Dim RefIsBroken As Boolean 'initialisé a False
 
On Error Resume Next
Err.Clear
'On recherche si la ref Internet Explorer et Html Object Library sont actives
RefIsBroken = ThisWorkbook.VBProject.References("SHDocVw").IsBroken 
If CBool(Err.Number <> 0) Then RefIsBroken = False'<-Changement ici
On Error GoTo 0
 
'Inversion des terme ici
#If RefIsBroken Then
    Dim IE As New InternetExplorer
#Else
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
#End If
 
IE.Visible = True
 
End Sub
Cette fois Sans la ref a IE, impec, ça se lance, RefIsBroken est toujours initialisé a False, donc il déclare un Object ...
Et du coup en mode conception... vu que (je vous le donne en mille) RefIsBroken est initialisé a False... l'autocomplétion ne fonctionne pas...

Hooo le beau cercle vicieux, j'ai beau tourner ça dans tous les sens, je suis pas sur que ce soit possible, je ré-essaierai peut être demain.

[/Edit= Dur d'aller se coucher sur un échec :p]

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/02/2011, 23h18   #4
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonsoir Quaz.

C'est bien vicieux ce truc. Et ça?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub TesteIE()
'Activer les refs M$ Internet controle et M$ Html Object Library
Dim RefIsBroken As Boolean 'initialisé a False
 
On Error Resume Next
    Err.Clear
    'On recherche si la ref Internet Explorer et Html Object Library sont actives
    RefIsBroken = ThisWorkbook.VBProject.References("SHDocVw").IsBroken
    If CBool(Err.Number <> 0) Then RefIsBroken = True
On Error GoTo 0
 
#If Not RefIsBroken Then
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
#Else
    Dim IE As New InternetExplorer
#End If
 
IE.Visible = True
 
End Sub
Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 19h14   #5
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Héhé, pas d'autocomplétion du code
Lors du développement VBA considère que RefIsBroken est initialisé à False, et donc il fait la déclaration en tant qu'objet...

Merci de ta participation
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/02/2011, 08h14   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Bon cette fois je décrète que c'est vraiment pas possible

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Explicit
Public RefIsBroken As Boolean 'initialisé a False
Sub TesteIE()
 
#If RefIsBroken Then
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
#Else
    Dim IE As New InternetExplorer
#End If
 
IE.Visible = True
 
End Sub
 
Sub TestBrokenRef()
On Error Resume Next
Err.Clear
'On recherche si la ref Internet Explorer et Html Object Library sont actives
RefIsBroken = ThisWorkbook.VBProject.References("SHDocVw").IsBroken
If CBool(Err.Number <> 0) Then RefIsBroken = True
On Error GoTo 0
 
End Sub
Ici je lance d'abord TestBrokenRef, il passe RefIsBroken à True. Donc on pourrait se dire, bingo, quand on va lancer TesteIE, RefIsBroken étant à True, il va faire la déclaration en Object.... que nenni... vba interprète avant même de tenir compte des variables.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/02/2011, 14h27   #7
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Bon !! Alors une autre astuce qui permet de faire la même chose, mais non automatiquement

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Option Explicit
#Const WithRef = False
 
Sub TesteIE()
 
#If WithRef Then
    Dim IE As New InternetExplorer
#Else
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
#End If
 
IE.Visible = True
 
End Sub
Du coup, lors de la distribution de votre fichier, pour ne pas être embête avec les références, vous passez WithRef à False.

Comme le faisait remarquer Philippe J., il faudra bien sur penser au constantes utiliser qui se trouve dans les références et les ajouter dans la déclaration #Else.


++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/02/2011, 15h25   #8
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Héhé, cette fois c'est automatique

Code Module2 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit
#Const WithRef = False
 
Sub TesteIE()
 
#If WithRef Then
    Dim IE As New InternetExplorer
#Else
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    Const READYSTATE_COMPLETE = 4
#End If
 
IE.Visible = True
 
End Sub
 
Sub TestRef()
Dim RefIsBroken As Boolean
Dim lLineModule As Long
On Error Resume Next
Err.Clear
'On recherche si la ref Internet Explorer et Html Object Library sont actives
RefIsBroken = ThisWorkbook.VBProject.References("SHDocVw").IsBroken Or ThisWorkbook.VBProject.References("MSHTML").IsBroken
If CBool(Err.Number <> 0) Then RefIsBroken = True
'On recherche la ligne contenant la déclaration de la constante conditionnelle
With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
    For lLineModule = 1 To .CountOfLines
        If InStr(1, .Lines(lLineModule, 1), "#Const WithRef = ") <> 0 Then
            'On modifie la ligne en fonction de RefIsBroken
            .ReplaceLine 2, "#Const WithRef = " & IIf(RefIsBroken, "False", "True")
        End If
    Next
End With
On Error GoTo 0
 
End Sub
A l'ouverture du classeur on exécute TestRef


Par contre encore un soucis, lors d'une déclaration de procédure ou function contenant ou retournant un type Internet Explorer, il n'est pas possible à ma connaissance de mettre une déclaration conditionnelle... il faudrait donc mettre des Object à la place, ce qui retire beaucoup d’intérêt a ce système... à suivre...

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h49.


 
 
 
 
Partenaires

Hébergement Web