cs_LeTech
Messages postés9Date d'inscriptionjeudi 8 avril 2004StatutMembreDernière intervention 4 mars 2006
-
13 août 2004 à 11:49
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 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.
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 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.
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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 ....
cs_LeTech
Messages postés9Date d'inscriptionjeudi 8 avril 2004StatutMembreDerniè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.
cs_LeTech
Messages postés9Date d'inscriptionjeudi 8 avril 2004StatutMembreDerniè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.
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 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
cs_LeTech
Messages postés9Date d'inscriptionjeudi 8 avril 2004StatutMembreDerniè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
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 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