Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA fait crasher excel alors que pas à pas = pas de crash

13 réponses
Avatar
seliana
Bonjour microsoft.public.fr.excel,

Comment se fait il que le code ci dessous fasse crasher Excel quand
ex=E9cut=E9 sans interruption alors que s'il est ex=E9cut=E9 pas =E0 pas to=
ut
fonctionne sans probl=E8me.

j'ai sur ma feuille :

calAgent - objet calendrier (microsoft calendar control 11.0)
VSFlexGrid1 - voila :) VS Flex Grid v7
ComboBox1 - objet combobox
ainsi que un bouton (CommandButton1) et quelques textbox et label mais
qui ne sont pas encore utilis=E9s

Voici le code en question.

--------------------------------------------
Option Explicit

'declaration de variables
Dim cnnConn As ADODB.Connection
Dim rstRecordset As ADODB.recordSet

Dim tempQuery As String

Private Sub CommandButton1_Click()

'definition de variables
Set cnnConn =3D New ADODB.Connection
Set rstRecordset =3D New ADODB.recordSet

tempQuery =3D "SELECT tAgents.AgentName, tAgents.isTemp,
tAgents.percentage, tBEELoginLogout.entryDate,
tBEELoginLogout.entryLoginCET, tBEELoginLogout.entryLogoutCET,
tBEELoginLogout.isValid FROM tAgents INNER JOIN tBEELoginLogout ON
tAgents.AgentName =3D tBEELoginLogout.ptrAgentName WHERE
(((tAgents.AgentName) Like """ & "%" & frmPointage.ComboBox1.value
tempQuery =3D tempQuery & "%" & """) AND ((tBEELoginLogout.entryDate)
=3D#" & calAgent.Month & "/" & calAgent.Day & "/" & calAgent.Year &
"#));"

'V=E9rifie que la connexion est bien ferm=E9e
If cnnConn.State =3D adStateOpen Then cnnConn.Close
'Etabli la connection
cnnConn.ConnectionString =3D CAppConnectionString
cnnConn.Open CAppPathTodB
'Attente que la connexion soit =E9tablie
While (cnnConn.State =3D adStateConnecting)
DoEvents
Wend

'v=E9rifie que le recordset est bien ferm=E9e
If rstRecordset.State =3D adStateOpen Then rstRecordset.Close
'ouvre le recordset
rstRecordset.Open tempQuery, cnnConn
'transpose recordset dans grid
Set VSFlexGrid1.DataSource =3D rstRecordset
'si recordset encore ouvert alors le ferme
If rstRecordset.State =3D adStateOpen Then rstRecordset.Close
'si connection encore ouverte alors la ferme
If cnnConn.State =3D adStateOpen Then cnnConn.Close

'libere objets
Set cnnConn =3D Nothing
Set rstRecordset =3D Nothing

End Sub
--------------------------------------------

ainsi que quelques constantes d=E9finies dans un module

--------------------------------------------
Public Const AppVersion =3D "0.2.9"
Public Const AppInDevMode =3D True
Public Const CAppPathTodB =3D "U:\_\dev\fifo\main.mdb"
Public Const CAppConnectionString =3D "Provider=3DMicrosoft.Jet.OLEDB.
4.0;"
--------------------------------------------


Si je clique sur CommandButton1 et que j'ai un point d'arret sur le
debut du CommandButton1_Click() et qu'ensuite j'execute pas =E0 pas.
nickel sans probl=E9mes les donn=E9es de la base de donn=E9es sont lues et
affich=E9s dans le grid.

mais si je n'ai pas de point d'arret, tout le code est execut=E9 et a la
fin excel crashe (entre "Set rstRecordset =3D Nothing" et "End Sub"
d'apr=E9s quelques debug.print que j'ai mis)

Quelqu'un saurait pourquoi ?

3 réponses

1 2
Avatar
altarboy
Salut isabelle,

Je n'ai pas mis de .RefreshPeriod
Je ne connaissait pas cette commande, j'essayerai dés que possible et
te redirait..

salutations
enoc

On 28 mar, 20:13, isabelle wrote:
re bonjour ,

as tu mis
.RefreshPeriod = 0

isabelle

altarboy a écrit :

> Salut Gilbert,

> Oui, j'ai mis des doevents avant, malheureusement ça apporte plus de
> problémes que ça en resoud car ADO etant asynchrone les methodes se
> melangent et ça crée un gros crash d'excel aussi.

> je crois que ma seule solution est de commencer a gérer les ADO Event s
> mais avec VBA je ne sais pas si c'est possible. Une autre solution
> serait d'utiliser ADO en mode synchrone, chose que je ne sais pas
> encore comment faire car par defaut les objects Connection et
> Recordset de ADO sont asynchrones.

> encore une poignée de cheveux en moins...
> Salutations

> On 28 mar, 17:38, "Gilbert" wrote:

>> Bonjour

>> As-tu essayé de rajouter un Doevents avant les
>> Set cnnConn = Nothing
>> Set rstRecordset = Nothing

>> --
>> Cordialement,

>> Gilbert

>> "altarboy" a écrit dans le message denews:746
>> Salut

>> Effectivement, ça a l'air plus logique, malheureusement ça ne chan ge
>> rien. ça crash toujours quand je set les variables = Nothing.

>> De quoi m'arracher les cheveux. Heureusement que j'en ai plus.

>> On 28 mar, 15:45, isabelle wrote:

>>> bonjour,

>>> oups desolé , la correction est :

>>> While état1 <> adStateClose
>>> état1 = rstRecordset.State
>>> Wend

>>> While état2 <> adStateClose
>>> état2 = cnnConn.State
>>> Wend

>>> isabelle

>>> altarboy a écrit :

>>>> si je le mets la :

>>>> ...

>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
>>>>>>>> 'si connection encore ouverte alors la ferme
>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close

>>>>>>> While état1 = adStateClosed
>>>>>>> état1 = rstRecordset.State
>>>>>>> Wend

>>>>>>> While état2 = adStateClosed
>>>>>>> état2 = cnnConn.State
>>>>>>> Wend

>>>>>>>> 'libere objets
>>>>>>>> Set cnnConn = Nothing
>>>>>>>> Set rstRecordset = Nothing

>>>> ben une fois sur deux ça reste dans la boucle car le state est dej a
>>>> closed

>>>> On 28 mar, 14:49, isabelle wrote:

>>>>> Salut altarboy,

>>>>> juste avant

>>>>> Set cnnConn = Nothing
>>>>> Set rstRecordset = Nothing

>>>>> isabelle

>>>>> altarboy a écrit :

>>>>>> Salut Isabelle,

>>>>>> Je ne vois pas trop ou mettre ces deux boucles.

>>>>>> On 27 mar, 19:17, isabelle wrote:

>>>>>>> bonjour,

>>>>>>> essai en y ajoutant une boucle :

>>>>>>> While état1 = adStateClose
>>>>>>> état1 = rstRecordset.State
>>>>>>> Wend

>>>>>>> While état2 = adStateClose
>>>>>>> état2 = cnnConn.State
>>>>>>> Wend

>>>>>>> isabelle

>>>>>>> altarboy a écrit :

>>>>>>>> Petite précision :

>>>>>>>> Si j'enlève du code la partie suivante tout fonctionne sans
>>>>>>>> problèmes :

>>>>>>>> 'libere objets
>>>>>>>> Set cnnConn = Nothing
>>>>>>>> Set rstRecordset = Nothing

>>>>>>>> Alors soit je deviens trop vieux soit ..... je deviens trop vieu x.
>>>>>>>> Normalement on est pas sensés libérer les variables/objets u ne fois
>>>>>>>> qu'on a plus besoin ?

>>>>>>>> On 27 mar, 17:23, seliana wrote:

>>>>>>>>> Bonjour microsoft.public.fr.excel,

>>>>>>>>> Comment se fait il que le code ci dessous fasse crasher Excel q uand
>>>>>>>>> exécuté sans interruption alors que s'il est exécuté pa s à pas tout
>>>>>>>>> fonctionne sans problème.

>>>>>>>>> j'ai sur ma feuille :

>>>>>>>>> calAgent - objet calendrier (microsoft calendar control 11.0)
>>>>>>>>> VSFlexGrid1 - voila :) VS Flex Grid v7
>>>>>>>>> ComboBox1 - objet combobox
>>>>>>>>> ainsi que un bouton (CommandButton1) et quelques textbox et lab el

>> mais

>>>>>>>>> qui ne sont pas encore utilisés

>>>>>>>>> Voici le code en question.

>>>>>>>>> --------------------------------------------
>>>>>>>>> Option Explicit

>>>>>>>>> 'declaration de variables
>>>>>>>>> Dim cnnConn As ADODB.Connection
>>>>>>>>> Dim rstRecordset As ADODB.recordSet

>>>>>>>>> Dim tempQuery As String

>>>>>>>>> Private Sub CommandButton1_Click()

>>>>>>>>> 'definition de variables
>>>>>>>>> Set cnnConn = New ADODB.Connection
>>>>>>>>> Set rstRecordset = New ADODB.recordSet

>>>>>>>>> tempQuery = "SELECT tAgents.AgentName, tAgents.isTemp,
>>>>>>>>> tAgents.percentage, tBEELoginLogout.entryDate,
>>>>>>>>> tBEELoginLogout.entryLoginCET, tBEELoginLogout.entryLogoutCET,
>>>>>>>>> tBEELoginLogout.isValid FROM tAgents INNER JOIN tBEELoginLogout ON
>>>>>>>>> tAgents.AgentName = tBEELoginLogout.ptrAgentName WHERE
>>>>>>>>> (((tAgents.AgentName) Like """ & "%" & frmPointage.ComboBox1.va lue
>>>>>>>>> tempQuery = tempQuery & "%" & """) AND ((tBEELoginLogout.entr yDate)
>>>>>>>>> =#" & calAgent.Month & "/" & calAgent.Day & "/" & calAgent.Ye ar &
>>>>>>>>> "#));"

>>>>>>>>> 'Vérifie que la connexion est bien fermée
>>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close
>>>>>>>>> 'Etabli la connection
>>>>>>>>> cnnConn.ConnectionString = CAppConnectionString
>>>>>>>>> cnnConn.Open CAppPathTodB
>>>>>>>>> 'Attente que la connexion soit établie
>>>>>>>>> While (cnnConn.State = adStateConnecting)
>>>>>>>>> DoEvents
>>>>>>>>> Wend

>>>>>>>>> 'vérifie que le recordset est bien fermée
>>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
>>>>>>>>> 'ouvre le recordset
>>>>>>>>> rstRecordset.Open tempQuery, cnnConn
>>>>>>>>> 'transpose recordset dans grid
>>>>>>>>> Set VSFlexGrid1.DataSource = rstRecordset
>>>>>>>>> 'si recordset encore ouvert alors le ferme
>>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
>>>>>>>>> 'si connection encore ouverte alors la ferme
>>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close

>>>>>>>>> 'libere objets
>>>>>>>>> Set cnnConn = Nothing
>>>>>>>>> Set rstRecordset = Nothing

>>>>>>>>> End Sub
>>>>>>>>> --------------------------------------------

>>>>>>>>> ainsi que quelques constantes définies dans un module

>>>>>>>>> --------------------------------------------
>>>>>>>>> Public Const AppVersion = "0.2.9"
>>>>>>>>> Public Const AppInDevMode = True
>>>>>>>>> Public Const CAppPathTodB = "U:_devfifomain.mdb"
>>>>>>>>> Public Const CAppConnectionString = "Provider=Microsoft.Jet .OLEDB.
>>>>>>>>> 4.0;"
>>>>>>>>> --------------------------------------------

>>>>>>>>> Si je clique sur CommandButton1 et que j'ai un point d'arret su r le
>>>>>>>>> debut du CommandButton1_Click() et qu'ensuite j'execute pas à pas.
>>>>>>>>> nickel sans problémes les données de la base de données s ont lues

>> et

>>>>>>>>> affichés dans le grid.

>>>>>>>>> mais si je n'ai pas de point d'arret, tout le code est execut é et a

>> la

>>>>>>>>> fin excel crashe (entre "Set rstRecordset = Nothing" et "End Sub"
>>>>>>>>> d'aprés quelques debug.print que j'ai mis)

>>>>>>>>> Quelqu'un saurait pourquoi ?


Avatar
MichDenis
Un petit exemple de code avec ADO

Je t'ai mis une procédure qui "teste" l'état de ta connection
et de ton recordSet. Je me demande cependant à quoi cela
peut bien servir dans ce type de procédure puisque tu as
des commandes du type : Set Conn = New ADODB.Connection
juste avant d'ouvrir la connection... cela signifie que tu crées
une "NOUVELLE INSTANCE" .... comment pourrait-elle déjà
exister puisque tu viens de la créer ! Il en va de même pour
l'objet RecordSet. Ce serait différent si ces 2 objets étaient
des variables publiques appelées par diverses procédures pour
un travail quelconque sur la base de données.

Les procédures qui suivent ne sont là que pour illustrer mon
propos. A toi de les adapter si tu le juges pertinent pour ton application.

'-----------------------------------------------------
Sub Requête_Avec_ADO()
Dim Gestion_Erreur As String
Dim Conn As ADODB.Connection, Rst As ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer

On Error GoTo Gestion_Erreur

'Fichier sur lequel se fera la requête :
File = ThisWorkbook.FullName

'Nom de la feuille du fichier où sont les données
'Dans la requête, j'utilise la variable.
NomFeuille = "denis"

'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil2")
If .Range("A1") = "" Then
Set Rg = .Range("A1")
Else
Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2)
End If
End With

'Tester le statut de la connection

If Not Conn Is Nothing Then
Connection_Statut Conn
End If

Set Conn = New ADODB.Connection

'Valeur par défaut est de 15 secondes
'Une erreur est générée si par exemple ça
'prend plus de 30 secondes à se connecter à
'la base de donnée
Conn.ConnectionTimeout = 30 ' À TOI DE LE DÉTERMINER

Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & File & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'La requête qui sera exécutée.
Requete = "SELECT * From [" & NomFeuille & "$]"

'Tester le Statut du RecordSet
If Not Rst Is Nothing Then
Recordset_Statut Rst
End If

Set Rst = New ADODB.Recordset
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie les étiquettes du recordset vers Excel
Do
Rg.Offset(, C) = Rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).CopyFromRecordset Rst
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing
Exit Sub
Gestion_Erreur:
MsgBox Err.Number & " , " & Err.Description
Set Rst = Nothing: Set Conn = Nothing
End Sub
'-----------------------------------------------


'-------------------------------------------------------------
Sub Connection_Statut(Conn As ADODB.Connection)

Select Case Conn.State
Case 0 'Constante texte :adStateClosed
Debug.Print "The object is closed."
Case 1 'Constante texte :adStateOpen
Debug.Print "The object is open"
Case 2 'Constante texte :adStateConnecting
Debug.Print "The object is connecting"
Case 4 'Constante texte :adStateExecuting
Debug.Print "The object is executing a command"
Case 8 'Constante texte :adStateFetching
Debug.Print "The rows of the object are being retrieved"
End Select
End Sub
'-------------------------------------------------------------
Sub Recordset_Statut(Rst As ADODB.Recordset)

Select Case Rst.State
Case Is = adStateClosed
Debug.Print "The rst object is currently closed."
Case Is = adStateConnecting
Debug.Print "The rst object is currently connecting."
Case Is = adStateExecuting
Debug.Print "The rst object is currently executing."
Case Is = adStateFetching
Debug.Print "The rst object is currently fetching."
Case Is = adStateOpen
Debug.Print "The rst object is currently open."
End Select
End Sub
'-------------------------------------------------------------











"altarboy" a écrit dans le message de groupe de discussion :

Salut isabelle,

Je n'ai pas mis de .RefreshPeriod
Je ne connaissait pas cette commande, j'essayerai dés que possible et
te redirait..

salutations
enoc

On 28 mar, 20:13, isabelle wrote:
re bonjour ,

as tu mis
.RefreshPeriod = 0

isabelle

altarboy a écrit :

> Salut Gilbert,

> Oui, j'ai mis des doevents avant, malheureusement ça apporte plus de
> problémes que ça en resoud car ADO etant asynchrone les methodes se
> melangent et ça crée un gros crash d'excel aussi.

> je crois que ma seule solution est de commencer a gérer les ADO Events
> mais avec VBA je ne sais pas si c'est possible. Une autre solution
> serait d'utiliser ADO en mode synchrone, chose que je ne sais pas
> encore comment faire car par defaut les objects Connection et
> Recordset de ADO sont asynchrones.

> encore une poignée de cheveux en moins...
> Salutations

> On 28 mar, 17:38, "Gilbert" wrote:

>> Bonjour

>> As-tu essayé de rajouter un Doevents avant les
>> Set cnnConn = Nothing
>> Set rstRecordset = Nothing

>> --
>> Cordialement,

>> Gilbert

>> "altarboy" a écrit dans le message
>> denews:
>> Salut

>> Effectivement, ça a l'air plus logique, malheureusement ça ne change
>> rien. ça crash toujours quand je set les variables = Nothing.

>> De quoi m'arracher les cheveux. Heureusement que j'en ai plus.

>> On 28 mar, 15:45, isabelle wrote:

>>> bonjour,

>>> oups desolé , la correction est :

>>> While état1 <> adStateClose
>>> état1 = rstRecordset.State
>>> Wend

>>> While état2 <> adStateClose
>>> état2 = cnnConn.State
>>> Wend

>>> isabelle

>>> altarboy a écrit :

>>>> si je le mets la :

>>>> ...

>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
>>>>>>>> 'si connection encore ouverte alors la ferme
>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close

>>>>>>> While état1 = adStateClosed
>>>>>>> état1 = rstRecordset.State
>>>>>>> Wend

>>>>>>> While état2 = adStateClosed
>>>>>>> état2 = cnnConn.State
>>>>>>> Wend

>>>>>>>> 'libere objets
>>>>>>>> Set cnnConn = Nothing
>>>>>>>> Set rstRecordset = Nothing

>>>> ben une fois sur deux ça reste dans la boucle car le state est deja
>>>> closed

>>>> On 28 mar, 14:49, isabelle wrote:

>>>>> Salut altarboy,

>>>>> juste avant

>>>>> Set cnnConn = Nothing
>>>>> Set rstRecordset = Nothing

>>>>> isabelle

>>>>> altarboy a écrit :

>>>>>> Salut Isabelle,

>>>>>> Je ne vois pas trop ou mettre ces deux boucles.

>>>>>> On 27 mar, 19:17, isabelle wrote:

>>>>>>> bonjour,

>>>>>>> essai en y ajoutant une boucle :

>>>>>>> While état1 = adStateClose
>>>>>>> état1 = rstRecordset.State
>>>>>>> Wend

>>>>>>> While état2 = adStateClose
>>>>>>> état2 = cnnConn.State
>>>>>>> Wend

>>>>>>> isabelle

>>>>>>> altarboy a écrit :

>>>>>>>> Petite précision :

>>>>>>>> Si j'enlève du code la partie suivante tout fonctionne sans
>>>>>>>> problèmes :

>>>>>>>> 'libere objets
>>>>>>>> Set cnnConn = Nothing
>>>>>>>> Set rstRecordset = Nothing

>>>>>>>> Alors soit je deviens trop vieux soit ..... je deviens trop vieux.
>>>>>>>> Normalement on est pas sensés libérer les variables/objets une fois
>>>>>>>> qu'on a plus besoin ?

>>>>>>>> On 27 mar, 17:23, seliana wrote:

>>>>>>>>> Bonjour microsoft.public.fr.excel,

>>>>>>>>> Comment se fait il que le code ci dessous fasse crasher Excel quand
>>>>>>>>> exécuté sans interruption alors que s'il est exécuté pas à pas tout
>>>>>>>>> fonctionne sans problème.

>>>>>>>>> j'ai sur ma feuille :

>>>>>>>>> calAgent - objet calendrier (microsoft calendar control 11.0)
>>>>>>>>> VSFlexGrid1 - voila :) VS Flex Grid v7
>>>>>>>>> ComboBox1 - objet combobox
>>>>>>>>> ainsi que un bouton (CommandButton1) et quelques textbox et label

>> mais

>>>>>>>>> qui ne sont pas encore utilisés

>>>>>>>>> Voici le code en question.

>>>>>>>>> --------------------------------------------
>>>>>>>>> Option Explicit

>>>>>>>>> 'declaration de variables
>>>>>>>>> Dim cnnConn As ADODB.Connection
>>>>>>>>> Dim rstRecordset As ADODB.recordSet

>>>>>>>>> Dim tempQuery As String

>>>>>>>>> Private Sub CommandButton1_Click()

>>>>>>>>> 'definition de variables
>>>>>>>>> Set cnnConn = New ADODB.Connection
>>>>>>>>> Set rstRecordset = New ADODB.recordSet

>>>>>>>>> tempQuery = "SELECT tAgents.AgentName, tAgents.isTemp,
>>>>>>>>> tAgents.percentage, tBEELoginLogout.entryDate,
>>>>>>>>> tBEELoginLogout.entryLoginCET, tBEELoginLogout.entryLogoutCET,
>>>>>>>>> tBEELoginLogout.isValid FROM tAgents INNER JOIN tBEELoginLogout ON
>>>>>>>>> tAgents.AgentName = tBEELoginLogout.ptrAgentName WHERE
>>>>>>>>> (((tAgents.AgentName) Like """ & "%" & frmPointage.ComboBox1.value
>>>>>>>>> tempQuery = tempQuery & "%" & """) AND ((tBEELoginLogout.entryDate)
>>>>>>>>> =#" & calAgent.Month & "/" & calAgent.Day & "/" & calAgent.Year &
>>>>>>>>> "#));"

>>>>>>>>> 'Vérifie que la connexion est bien fermée
>>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close
>>>>>>>>> 'Etabli la connection
>>>>>>>>> cnnConn.ConnectionString = CAppConnectionString
>>>>>>>>> cnnConn.Open CAppPathTodB
>>>>>>>>> 'Attente que la connexion soit établie
>>>>>>>>> While (cnnConn.State = adStateConnecting)
>>>>>>>>> DoEvents
>>>>>>>>> Wend

>>>>>>>>> 'vérifie que le recordset est bien fermée
>>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
>>>>>>>>> 'ouvre le recordset
>>>>>>>>> rstRecordset.Open tempQuery, cnnConn
>>>>>>>>> 'transpose recordset dans grid
>>>>>>>>> Set VSFlexGrid1.DataSource = rstRecordset
>>>>>>>>> 'si recordset encore ouvert alors le ferme
>>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
>>>>>>>>> 'si connection encore ouverte alors la ferme
>>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close

>>>>>>>>> 'libere objets
>>>>>>>>> Set cnnConn = Nothing
>>>>>>>>> Set rstRecordset = Nothing

>>>>>>>>> End Sub
>>>>>>>>> --------------------------------------------

>>>>>>>>> ainsi que quelques constantes définies dans un module

>>>>>>>>> --------------------------------------------
>>>>>>>>> Public Const AppVersion = "0.2.9"
>>>>>>>>> Public Const AppInDevMode = True
>>>>>>>>> Public Const CAppPathTodB = "U:_devfifomain.mdb"
>>>>>>>>> Public Const CAppConnectionString = "Provider=Microsoft.Jet.OLEDB.
>>>>>>>>> 4.0;"
>>>>>>>>> --------------------------------------------

>>>>>>>>> Si je clique sur CommandButton1 et que j'ai un point d'arret sur le
>>>>>>>>> debut du CommandButton1_Click() et qu'ensuite j'execute pas à pas.
>>>>>>>>> nickel sans problémes les données de la base de données sont lues

>> et

>>>>>>>>> affichés dans le grid.

>>>>>>>>> mais si je n'ai pas de point d'arret, tout le code est executé et a

>> la

>>>>>>>>> fin excel crashe (entre "Set rstRecordset = Nothing" et "End Sub"
>>>>>>>>> d'aprés quelques debug.print que j'ai mis)

>>>>>>>>> Quelqu'un saurait pourquoi ?


Avatar
altarboy
Excellent MichDenis, j'ai suivi ton conseil... et du coup j'ai trouvé
l'erreur.

Dans certains cas, le code tel que je l'ai mis en place libérait
l'objet connection avant de libérer le recordset ce qui faisait
planter Excel. j'ai revu tout le code et bingo, ça fonctionne.

Comme quoi, VB c'est pas comme le vélo. Si on ne fait plus pendant un
temps on oublie certaines choses.

Merci à tous pour votre aide.
Enoc


On 29 mar, 15:37, "MichDenis" wrote:
Un petit exemple de code avec ADO

Je t'ai mis une procédure qui "teste" l'état de ta connection
et de ton recordSet. Je me demande cependant à quoi cela
peut bien servir dans ce type de procédure puisque tu as
des commandes du type : Set Conn = New ADODB.Connection
juste avant d'ouvrir la connection... cela signifie que tu crées
une "NOUVELLE INSTANCE" .... comment pourrait-elle déjà
exister puisque tu viens de la créer ! Il en va de même pour
l'objet RecordSet. Ce serait différent si ces 2 objets étaient
des variables publiques appelées par diverses procédures pour
un travail quelconque sur la base de données.

Les procédures qui suivent ne sont là que pour illustrer mon
propos. A toi de les adapter si tu le juges pertinent pour ton applicatio n.

'-----------------------------------------------------
Sub Requête_Avec_ADO()
Dim Gestion_Erreur As String
Dim Conn As ADODB.Connection, Rst As ADODB.Recordset
Dim Requete As String, NomFeuille As String, Rg As Range
Dim File As String, C As Integer

On Error GoTo Gestion_Erreur

'Fichier sur lequel se fera la requête :
File = ThisWorkbook.FullName

'Nom de la feuille du fichier où sont les données
'Dans la requête, j'utilise la variable.
NomFeuille = "denis"

'Défini la première cellule où seront copiées les
'données des requêtes ADO
With Worksheets("Feuil2")
    If .Range("A1") = "" Then
        Set Rg = .Range("A1")
    Else
        Set Rg = .Range("A" & .Range("A65356").End(xlUp).Row)(2 )
    End If
End With

'Tester le statut de la connection

If Not Conn Is Nothing Then
    Connection_Statut Conn
End If

Set Conn = New ADODB.Connection

'Valeur par défaut est de 15 secondes
'Une erreur est générée si par exemple ça
'prend plus de 30 secondes à se connecter à
'la base de donnée
Conn.ConnectionTimeout = 30 ' À TOI DE LE DÉTERMINER

Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & File & ";" & _
    "Extended Properties=""Excel 8.0;HDR=YES;"""

'La requête qui sera exécutée.
Requete = "SELECT * From [" & NomFeuille & "$]"

'Tester le Statut du RecordSet
If Not Rst Is Nothing Then
    Recordset_Statut Rst
End If

Set Rst = New ADODB.Recordset
Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie les étiquettes du recordset vers Excel
Do
    Rg.Offset(, C) = Rst.Fields(C).Name
    C = C + 1
    x = x + 1
Loop Until x = Rst.Fields.Count
Rg.Offset(1).CopyFromRecordset Rst
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing
Exit Sub
Gestion_Erreur:
    MsgBox Err.Number & " , " & Err.Description
    Set Rst = Nothing: Set Conn = Nothing
End Sub
'-----------------------------------------------

'-------------------------------------------------------------
Sub Connection_Statut(Conn As ADODB.Connection)

Select Case Conn.State
    Case 0 'Constante texte :adStateClosed
        Debug.Print "The object is closed."
    Case 1 'Constante texte :adStateOpen
        Debug.Print "The object is open"
    Case 2 'Constante texte :adStateConnecting
        Debug.Print "The object is connecting"
    Case 4 'Constante texte :adStateExecuting
        Debug.Print "The object is executing a command"
    Case 8 'Constante texte :adStateFetching
        Debug.Print "The rows of the object are being retrieved"
End Select
End Sub
'-------------------------------------------------------------
Sub Recordset_Statut(Rst As ADODB.Recordset)

Select Case Rst.State
    Case Is = adStateClosed
        Debug.Print "The rst object is currently closed."
    Case Is = adStateConnecting
        Debug.Print "The rst object is currently connecting."
    Case Is = adStateExecuting
        Debug.Print "The rst object is currently executing."
    Case Is = adStateFetching
        Debug.Print "The rst object is currently fetching."
    Case Is = adStateOpen
        Debug.Print "The rst object is currently open."
End Select
End Sub
'-------------------------------------------------------------

"altarboy" a écrit dans le message de groupe de discussion :

Salut isabelle,

Je n'ai pas mis de .RefreshPeriod
Je ne connaissait pas cette commande, j'essayerai dés que possible et
te redirait..

salutations
enoc

On 28 mar, 20:13, isabelle wrote:

> re bonjour ,

> as tu mis
> .RefreshPeriod = 0

> isabelle

> altarboy a écrit :

> > Salut Gilbert,

> > Oui, j'ai mis des doevents avant, malheureusement ça apporte plus d e
> > problémes que ça en resoud car ADO etant asynchrone les methodes se
> > melangent et ça crée un gros crash d'excel aussi.

> > je crois que ma seule solution est de commencer a gérer les ADO Eve nts
> > mais avec VBA je ne sais pas si c'est possible. Une autre solution
> > serait d'utiliser ADO en mode synchrone, chose que je ne sais pas
> > encore comment faire car par defaut les objects Connection et
> > Recordset de ADO sont asynchrones.

> > encore une poignée de cheveux en moins...
> > Salutations

> > On 28 mar, 17:38, "Gilbert" wrote:

> >> Bonjour

> >> As-tu essayé de rajouter un Doevents avant les
> >> Set cnnConn = Nothing
> >> Set rstRecordset = Nothing

> >> --
> >> Cordialement,

> >> Gilbert

> >> "altarboy" a écrit dans le message
> >> denews: .com...
> >> Salut

> >> Effectivement, ça a l'air plus logique, malheureusement ça ne ch ange
> >> rien. ça crash toujours quand je set les variables = Nothing.

> >> De quoi m'arracher les cheveux. Heureusement que j'en ai plus.

> >> On 28 mar, 15:45, isabelle wrote:

> >>> bonjour,

> >>> oups desolé , la correction est :

> >>> While état1 <> adStateClose
> >>> état1 = rstRecordset.State
> >>> Wend

> >>> While état2 <> adStateClose
> >>> état2 = cnnConn.State
> >>> Wend

> >>> isabelle

> >>> altarboy a écrit :

> >>>> si je le mets la :

> >>>> ...

> >>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
> >>>>>>>> 'si connection encore ouverte alors la ferme
> >>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close

> >>>>>>> While état1 = adStateClosed
> >>>>>>> état1 = rstRecordset.State
> >>>>>>> Wend

> >>>>>>> While état2 = adStateClosed
> >>>>>>> état2 = cnnConn.State
> >>>>>>> Wend

> >>>>>>>> 'libere objets
> >>>>>>>> Set cnnConn = Nothing
> >>>>>>>> Set rstRecordset = Nothing

> >>>> ben une fois sur deux ça reste dans la boucle car le state est d eja
> >>>> closed

> >>>> On 28 mar, 14:49, isabelle wrote:

> >>>>> Salut altarboy,

> >>>>> juste avant

> >>>>> Set cnnConn = Nothing
> >>>>> Set rstRecordset = Nothing

> >>>>> isabelle

> >>>>> altarboy a écrit :

> >>>>>> Salut Isabelle,

> >>>>>> Je ne vois pas trop ou mettre ces deux boucles.

> >>>>>> On 27 mar, 19:17, isabelle wrote:

> >>>>>>> bonjour,

> >>>>>>> essai en y ajoutant une boucle :

> >>>>>>> While état1 = adStateClose
> >>>>>>> état1 = rstRecordset.State
> >>>>>>> Wend

> >>>>>>> While état2 = adStateClose
> >>>>>>> état2 = cnnConn.State
> >>>>>>> Wend

> >>>>>>> isabelle

> >>>>>>> altarboy a écrit :

> >>>>>>>> Petite précision :

> >>>>>>>> Si j'enlève du code la partie suivante tout fonctionne sans
> >>>>>>>> problèmes :

> >>>>>>>> 'libere objets
> >>>>>>>> Set cnnConn = Nothing
> >>>>>>>> Set rstRecordset = Nothing

> >>>>>>>> Alors soit je deviens trop vieux soit ..... je deviens trop vi eux.
> >>>>>>>> Normalement on est pas sensés libérer les variables/objets une fois
> >>>>>>>> qu'on a plus besoin ?

> >>>>>>>> On 27 mar, 17:23, seliana wrote:

> >>>>>>>>> Bonjour microsoft.public.fr.excel,

> >>>>>>>>> Comment se fait il que le code ci dessous fasse crasher Excel quand
> >>>>>>>>> exécuté sans interruption alors que s'il est exécuté pas à pas tout
> >>>>>>>>> fonctionne sans problème.

> >>>>>>>>> j'ai sur ma feuille :

> >>>>>>>>> calAgent - objet calendrier (microsoft calendar control 11.0)
> >>>>>>>>> VSFlexGrid1 - voila :) VS Flex Grid v7
> >>>>>>>>> ComboBox1 - objet combobox
> >>>>>>>>> ainsi que un bouton (CommandButton1) et quelques textbox et l abel

> >> mais

> >>>>>>>>> qui ne sont pas encore utilisés

> >>>>>>>>> Voici le code en question.

> >>>>>>>>> --------------------------------------------
> >>>>>>>>> Option Explicit

> >>>>>>>>> 'declaration de variables
> >>>>>>>>> Dim cnnConn As ADODB.Connection
> >>>>>>>>> Dim rstRecordset As ADODB.recordSet

> >>>>>>>>> Dim tempQuery As String

> >>>>>>>>> Private Sub CommandButton1_Click()

> >>>>>>>>> 'definition de variables
> >>>>>>>>> Set cnnConn = New ADODB.Connection
> >>>>>>>>> Set rstRecordset = New ADODB.recordSet

> >>>>>>>>> tempQuery = "SELECT tAgents.AgentName, tAgents.isTemp,
> >>>>>>>>> tAgents.percentage, tBEELoginLogout.entryDate,
> >>>>>>>>> tBEELoginLogout.entryLoginCET, tBEELoginLogout.entryLogoutCET ,
> >>>>>>>>> tBEELoginLogout.isValid FROM tAgents INNER JOIN tBEELoginLogo ut ON
> >>>>>>>>> tAgents.AgentName = tBEELoginLogout.ptrAgentName WHERE
> >>>>>>>>> (((tAgents.AgentName) Like """ & "%" & frmPointage.ComboBox1. value
> >>>>>>>>> tempQuery = tempQuery & "%" & """) AND ((tBEELoginLogout.en tryDate)
> >>>>>>>>> =#" & calAgent.Month & "/" & calAgent.Day & "/" & calAgent. Year &
> >>>>>>>>> "#));"

> >>>>>>>>> 'Vérifie que la connexion est bien fermée
> >>>>>>>>> If cnnConn.State = adStateOpen Then cnnConn.Close
> >>>>>>>>> 'Etabli la connection
> >>>>>>>>> cnnConn.ConnectionString = CAppConnectionString
> >>>>>>>>> cnnConn.Open CAppPathTodB
> >>>>>>>>> 'Attente que la connexion soit établie
> >>>>>>>>> While (cnnConn.State = adStateConnecting)
> >>>>>>>>> DoEvents
> >>>>>>>>> Wend

> >>>>>>>>> 'vérifie que le recordset est bien fermée
> >>>>>>>>> If rstRecordset.State = adStateOpen Then rstRecordset.Close
> >>>>>>>>> 'ouvre le recordset
> >>>>>>>>> rstRecordset.Open tempQuery, cnnConn

...

plus de détails »


1 2