MsgBox et error '91'

cs_LeTech Messages postés 9 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 4 mars 2006 - 13 août 2004 à 11:49
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 17 août 2004 à 16:04
Mes respects à tous,
Comme le titre l'indique, j'ai un problème avec une MSgBox lorsque le projet est compilé en .exe (placé sur la même racine que le projet). Je tiens à préciser que ce phénomène n'apparait pas lorsque je RUN le projet. Donc lorsque je lance le .exe, j'obtiens ce message d'erreur au démarrage ensuite plus rien ne se passe:

Run-time error '91'
Objet variable or With block variable not set.

J'ai lu le HELP et j'ai essayé plein de choses (Dim object / Public object as string / forme Message.frm...) mais rien n'y fait et, chose étrange, j'ai une autre MsgBOX plus loin dans le programme et elle fonctionne sans problème (lorsque j'ai annulé la première MsgBox en défaut).
Voici le code qui pose problème. Il consiste à contrôler la présence d'un fichier ACCESS "IPDATAstat.mdb" et s'il est absent, de le remplacer par un fichier "IPDATA.mdb" sur la même racine du .exe.

...
If ... Then
....
Else
Version = " Network Analyser V3.5Light "
Db = Chaine + "IPDATAstat.mdb"
Set fDB = CreateObject("Scripting.FileSystemObject")
If fDB.FileExists(Db) = False Then 'contrôle si fichier présent
MsgBox "Updated file not found, check the path (in file Path.txt)."
Db = "IPDATA.mdb"
End If
fDB.CopyFile Db, "IPDATA.mdb" 'faire une copie de IPDATAstat sur le répertoire en cours
OptArch = " * Recording: OFF "
OptCopy = ""
PingArch = False
End If
...

Donc si je supprime la ligne MsgBox, l' .exe tourne sans problème.
Où est mon erreur? J'ai cherché sur le forum, j'ai regardé les sources en exemple mais sans succès.

Merci pour votre aide
LeTech
toujours débutant

8 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
13 août 2004 à 14:47
La seule chose que je vois ds ton code c que si fDB.FileExists(Db) retourne false, tu change la valeur de DB (Db= "IPDATA.mdb") ce qui fait qu'ensuite, tu tentes de recopier une base sur elle-même : fDB.CopyFile Db, "IPDATA.mdb" qui devient : fDB.CopyFile "IPDATA.mdb", "IPDATA.mdb".

Sinon, je ne vois pas pourquoi ton msgbox provoquerait cette erreur.

Cordialement

CanisLupus
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
14 août 2004 à 00:07
Je dirais même plus : Il est RIGOUREUSEMENT IMPOSSIBLE que cette ligne de code
MsgBox "Updated file not found, check the path (in file Path.txt)."

génère une erreur 91, qui est une erreur qui ne peut se produire que lors de l'appel à un objet non instancié. Or je ne vois pas l'ombre du point d'un seul objet dans cette ligne de code.
De plus je trouve étrnage que cette erreur ne se produise qu'àprès compilation !!
Excuses-moi de remettre ta parole en doute LeTech, mais la, je crois pouvoir dire que ce n'est pas possible. Tu dois avoir autre chose ....
Les deux ligne qui pourrait causer une err 91 sont les suivante :
Set fDB = CreateObject("Scripting.FileSystemObject")
If fDB.FileExists(Db) = False Then 'contrôle si fichier présent

Et puis ta variable Db, elle est déclarée en tant que quoi ? Si elle est déclaré ?
As-tu un "Option Explicit" en haut de ton module ? Si non, ajoute le, et relance ton code, tu vas peut-être lever un lièvre ....

Christophe R.
0
cs_LeTech Messages postés 9 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 4 mars 2006
14 août 2004 à 08:39
Merci pour vos réactions,

réponse à CanisLupus
la copie de sauvegarde du fichier ne se fait que si le fichier est présent, la ligne se trouve après une boucle If - End If.

réponse à crenaud76
je suis d'accord pour le rigoureusement impossible (impossible qui n'est pas français, haha), mais comme je l'ai écrit, si je supprime la ligne dans cette seconde partie de la boucle cela fonctionne et les lignes

Set fDB ...
If fDB.FileExists(Db) ...

pourraient être en défaut mais lequel?? Db est bien déclaré.

Option Explicit
...
Public Db As Variant
...

Je précise que ce phénomène ne se passe qu'avec l'.exe et avec les OS Win98 et NT4.

merci pour vos recherches
@+
LeTech
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
14 août 2004 à 11:18
Et comment déclares-tu fDB ?
dim fDB as filesystemobject ou dim fDB as object ?

Sur ton poste, l'exe fonctionne ? si oui, c peut être qu'il manque une DLL (scrrun.dll ds le cas du filesystemobject) sur les autres postes.

Cordialement, CanisLupus
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_LeTech Messages postés 9 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 4 mars 2006
16 août 2004 à 15:31
à CanisLupus
comme j'avais écrit précédemment, j'avais essayé plein de chose.

SCRRUN.DLL est bien présent dans \WINDOWS\SYSTEM.

Voici, pour mieux vous guider, des extraits de la source avec les constatations sur chaque ajout de code (Dim et Public) mis en remarque car cela n'a pas amélioré la situation.

extrait de la forme display.frm
=============================

Dim Chaine As String
Dim Pass As String
Open "Path.txt" For Input As #1 'Ouverture
Chaine = "" 'Vide la zone de texte
Pass = ""
Input #1, Chaine
Input #1, Pass
Close #1 'Fermeture
If Pass = "Full" Then
Version = " Network Analyser V3.5Full "
OptArch = " * Recording: ON "
OptCopy = "* Copy Screen: OFF "
Display.MArchiving.Enabled = True
Display.MCopEcran.Enabled = True
MStRecord.Enabled = False 'bouton start recording
MStopRec.Enabled = True 'bouton stop recording
MSetUp.Enabled = True PingArch True 'Enregistrement Pings car False par défaut
Db = "IPDATA.mdb"
Else
Version = " Network Analyser V3.5Light "
Db = Chaine + "IPDATAstat.mdb"
'Dim fDb As FileOpenConstants 'DONNE UNE ERREUR object required
'Dim fDb As Object 'PAS D'EFFET
'Dim fDb As FileSystemObject 'DONNE UNE ERREUR User-defined type not defined
'Dim fDb As Scripting.FileSystemObject 'DONNE UNE ERREUR User-defined type not defined
Set fDb = CreateObject("Scripting.FileSystemObject")
If fDb.FileExists(Db) = False Then 'contrôle si fichier présent
Message.Show

'MsgBox "Updated file not found, check the path (in file Path.txt)."

Db = "IPDATA.mdb"
End If
fDb.CopyFile Db, "IPDATA.mdb" 'faire une copie de IPDATAstat sur le répertoire en cours
OptArch = " * Recording: OFF "
OptCopy = ""
PingArch = False
End If
Set W = Workspaces(0)
Set Dbf = W.OpenDatabase(Db)
Set T13 = Dbf.OpenRecordset("SetUp")
T13.MoveFirst
Passw = Pass
ScrDir = T13![DirCopieEcran]
BakDbDir = T13![DirBakIPDATA]
'PingArch = T13![ArchivePing]
Display.Caption = Version + " (" + Db + ")" + OptArch + OptCopy

Extrait du module
===============

Public ScrDir As String
Public BakDbDir As String
Public PingArch As Boolean
Public StartCopy As Boolean
Public OptArch As String
Public OptCopy As String
Public Version As String
Public Passw As String
'Public fDb As Variant 'PAS D'EFFET
'Public fDb As String 'PAS D'EFFET
'Public fDb As FileOpenConstants 'DONNE UNE ERREUR object required

***********************************************

désolé pour cette surcharge.
Pour info, j'ai contourné le problème avec une forme Message.frm (une zone texte + bouton de commande) mais je voudrais comprendre ce qui se passe lorsque j'active cette MsgBox. Je rappelle que j'en ai une autre plus loin dans le programme qui fonctionne bien.

Amitiés et encore merci
LeTech
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
16 août 2004 à 16:20
Salut,

D'abord, je n'ai pu tester ton code qu'en supprimant certains appels et en simulant d'autres mais g 2 remarques :

1 - "'Dim fDb As FileSystemObject 'DONNE UNE ERREUR User-defined type not defined" ça veut dire que tu n'as pas coché "Microsoft Scripting Runtime" ds Projet/références...

2 - Open "Path.txt" et fDb.CopyFile Db, "IPDATA.mdb", ça ne peut pas marcher chez moi. En debug (prog non compilé), si tu ne spécifies pas le chemin complet ça va lire ou écrire dans "C:\Program Files\Microsoft Visual Studio\VB98". Donc, essaie de donner à chaque fois le chemin complet. Par ex, si c dans le dossier de l'appli exécutable : app.path & "\tonfichier", sinon DB = "c:\dossier" & nomfichier.

Cordialement, CanisLupus

Tous les glands ne deviennent pas des chênes mais tous les chênes ont été des glands
0
cs_LeTech Messages postés 9 Date d'inscription jeudi 8 avril 2004 Statut Membre Dernière intervention 4 mars 2006
17 août 2004 à 14:08
A CanisLupus,

Voilà, j'ai activé MicrosoftScripting Runtime (SCRRUN.DLL) et plus d'erreur en Debug mais toujours l'error'91' en .exe avec ceci;
....
Dim fDb As FileSystemObject 'plus d'ERREUR User-defined type not defined
'Dim fDb As Scripting.FileSystemObject 'DONNE UNE ERREUR User-defined type not defined
Set fDb = CreateObject("Scripting.FileSystemObject")
If fDb.FileExists(Db) = False Then 'contrôle si fichier présent
'Message.Show
MsgBox "Updated file not found, check the path (in file Path.txt)."
Db = "IPDATA.mdb"
End If
....

Source utilisant (create objects sans Dim ... Public...) qui fonctionne (sans message d'erreur en .exe)

Private Sub Timer1_Timer() 'mettre 60 Sec
If (Minute(Now)) = 0 Then 'chercher le passage à l'heure suivante
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CopyFile "IPDATA.mdb", BakDbDir + "\IPDATAstat.mdb" 'faire une copie de IPDATA sur l'adresse BakDbDir
'End If If Day(Now) 1 And (Hour(Time)) 6 And MAutoArch.Checked = True Then 'début du mois à 05h et AutoArch activé
ddd = DateAdd("yyyy", -1, Now) 'calculer une année en moins
TabNr = 1
Do While TabNr < 201
DoEvents
On Error Resume Next
Set T6 = Dbf.OpenRecordset(TABLE(TabNr))
On Error Resume Next
T6.Move First
Do While Not T6.EOF

If T6![DAT] < ddd Then
T6.Delete
End If

T6.MoveNext
Loop
TabNr = TabNr + 1
Loop
T6.Close
'Beep
End If
End If
End Sub

Source MsgBox dans le même projet qui fonctionne (sans message d'erreur en .exe).

Private Sub MDraw_Click() 'Menu Dessin
OK = MsgBox("Would you really go to drawing mode ?", vbYesNo + vbExclamation, " Warning !")
If OK = 6 Then
Timer0.Enabled = False
Grille.Visible = True
SetDra = True
Model.Show
MDraw.Visible = False
MPing.Visible = True
End If
End Sub

Nous, avec de l'aide de tous, vaincrons la machine

@+
LeTech
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
17 août 2004 à 16:04
As tu regardé du côté du point 2 de mon précédent post ?
Parce que là, je ne comprend plus.

Essaie d'exécuter le prog en debug après avoir posé un point d'arrêt à la ligne "If fDb.FileExists(Db) = False Then ".
Ensuite, tu exécutes pas à pas (touche f8) et tu regardes la valeur de tes variables à chaque pas.

Cordialement, CanisLupus

Tous les glands ne deviennent pas des chênes mais tous les chênes ont été des glands
0
Rejoignez-nous