IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Erreur (object variable or with block variable not set), Aide ADODB


Sujet :

VBA

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Erreur (object variable or with block variable not set), Aide ADODB
    Bonjour à tous,

    j'ai longtemps hésité à venir poster, mais la je suit vraiment bloquer :s

    Donc voila j'ai une bdd en ms sql serveur 2005 et je programme une interface en vb6.

    J'ai déjà fait quelques programmes qui communiquent entre les 2 logiciel pas de problème et là j'ai voulu faire une boucle pour la copie de champs, d'habitude dans ma boucle j'avais une seul valeur a récuperer (while not eof etc...) ici je récupere 5 collone par ligne et dès que j'arrive sur une autre commande de récupération de champs sa plante.

    Bon voici mon code sa sera plus clair !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    ' VARIABLE
    
    ' Pour recherche du PV
    Public Date_PV1 As String
    Public Date_PV As String
    Public NbrePV As Integer
    Public TabPV() As String
    Public IDPerso As Integer
    Public NomPerso As String
    
    'Declaration d'objet pour la BDD
    Public ConnecDB As ADODB.Connection
    Public rst As ADODB.Recordset
    Public rst1 As ADODB.Recordset
    
    
    ' PROGRAMME
    
    Public Sub RecherchePV() 'Recherche le PV selon les critères
    '   (1)
     Set ConnecDB = New ADODB.Connection
     ConnecDB.Provider = "SQLOLEDB.1"
     ConnecDB.ConnectionString = "Persist Secutity Info= False;User ID= user;Password= X;Initial Catalog= TEST;Data Source= X\SQLEXPRESS;"
     ConnecDB.Open
    '   (2)
     Set rst = New ADODB.Recordset
    '   (3)
    rst.Open "SELECT * From PV_DMS Where (DateCreationPV >= " & Date_PV & ") And (DateCreationPV < " & Date_PV1 & ") And (IDProduit = " & choixidproduit & ") And (IDPresse = " & choixidpresse & ")", ConnecDB
    '   (4)
     If rst.EOF = False Then
        rst.MoveFirst
        NbrePV = 0
        While Not rst.EOF
            NbrePV = NbrePV + 1
            rst.MoveNext
        Wend
        ReDim TabPV(1 To NbrePV)
        NbrePV = 0
        rst.MoveFirst
        While Not rst.EOF
            NbrePV = NbrePV + 1
            IntRecupData = rst("IDPV")
            TabPV(NbrePV) = IntRecupData
            Frm_Page_Principale.MSFlexGrid1.AddItem (IntRecupData)
            Frm_Page_Principale.MSFlexGrid1.Row = NbrePV
            
            IDPerso = rst("Monteur1")
            RecupNomPerso
            Frm_Page_Principale.MSFlexGrid1.Col = 1
            Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
            
            IDPerso = rst("Monteur2") 'JE PLANTE ICI
            RecupNomPerso
            Frm_Page_Principale.MSFlexGrid1.Col = 2
            Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
            
            IDPerso = rst("Regleur")
            RecupNomPerso
            Frm_Page_Principale.MSFlexGrid1.Col = 3
            Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
            
            IDPerso = rst("GapLeader")
            RecupNomPerso
            Frm_Page_Principale.MSFlexGrid1.Col = 4
            Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
            
            rst.MoveNext
        Wend
        For x = LBound(TabPV) To UBound(TabPV)
            Frm_Page_Principale.Combo7.AddItem (TabPV(x))
        Next x
        Frm_Page_Principale.Combo7.Text = ""
    Else
    
     End If
    '   (5)
     ConnecDB.Close
     Set rst = Nothing
     Set ConnecDB = Nothing
    End Sub
    NB j'ai mit en rouge l'endroit ou sa plante.

    Donc j'ai déjà éssayé pas mal de chose et la je désespère....

    Merci d'avance pour vos réponses !!

  2. #2
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    mettre le message complet pour avoir plus de chances de réponses, erreur 91 ne parle pas à tout le monde

    je suppose que Monteur2 est bien un champ de la table PV_DMS?

    que contient RecupNomPerso?
    quelque chose qui pourrait expliquer la perte du recordset?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Arkham46 Voir le message
    bjr,

    mettre le message complet pour avoir plus de chances de réponses, erreur 91 ne parle pas à tout le monde

    je suppose que Monteur2 est bien un champ de la table PV_DMS?

    que contient RecupNomPerso?
    quelque chose qui pourrait expliquer la perte du recordset?
    Super la rapidité de réponse

    Donc Monteur2 est bien un champs de la table PV_DMS

    RecupNomPerso est une procédure car dans la table PV_DMS je récupère un ID et avec recup nom perso je fait une autre requete sql pour obtenir le nom associé à l'ID.

    Quand a la perte du recordset c'est bien sa mon problème j'arrive pas à comprendre, il pourrait y avoir un conflit avec la procédure RecupNomPerso (qui utilise aussi une connexion avec la bdd)

  4. #4
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par Louis.Gruhn Voir le message
    Quand a la perte du recordset c'est bien sa mon problème j'arrive pas à comprendre, il pourrait y avoir un conflit avec la procédure RecupNomPerso (qui utilise aussi une connexion avec la bdd)
    oui c'est possible, c'est pour ça que je demandais le contenu de la procédure
    il y a peut-être une petite erreur, genre une fermeture de rst au lieu de rst1...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Arkham46 Voir le message
    oui c'est possible, c'est pour ça que je demandais le contenu de la procédure
    il y a peut-être une petite erreur, genre une fermeture de rst au lieu de rst1...
    Je viens de tilter et j'ai modifier le code de RecupNomPerso

    J'y ai rajouter rst1 (avant j'avais rst)

    Public Sub RecupNomPerso() 'Récupéré le nom de la presse selon l'id (conversion du id en nom)
    ' (1)
    Set ConnecDB = New ADODB.Connection
    ConnecDB.Provider = "SQLOLEDB.1"
    ConnecDB.ConnectionString = "Persist Secutity Info= False;User ID= user;Password= Password1;Initial Catalog= TEST;Data Source= FRBLHWDT8042\SQLEXPRESS;"
    ConnecDB.Open
    ' (2)
    Set rst1 = New ADODB.Recordset
    ' (3)
    rst1.Open "SELECT Nom_Prenom FROM personnel WHERE IDPersonnel =" & IDPerso, ConnecDB
    ' (4)
    If rst1.EOF = False Then
    rst1.MoveFirst
    NomPerso = rst1("Nom_Prenom")
    End If
    ' (5)
    ConnecDB.Close
    Set rst1 = Nothing
    Set ConnecDB = Nothing
    End Sub
    Faut il aussi que je crée un ConnecDB1 ? car j'ai encore le même problème sur le ConnecDB.close a la fin de RecherchePV. (Mais en tout cas j'ai récup tout mes données et msflexgried est à jour)


    Finalement j'ai retirer le ConnecDB.close à la fin de RecherchePV vu que de toute facon la connexion sera fermé dans le RecupNomPerso.

    En tout cas merci beaucoup !! Je pense que le problème est clos

    Bonne journée !!

  6. #6
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    Effectivement il ne faut pas utiliser la même connection.

    La variable ConnecDB étant public au niveau module, c'est la même variable ConnecDB qui est utilisée partout.
    Et donc RecupNomPerso ferme cette connection qui n'est plus utilisable par la suite de RecherchePV.
    (En plus la cible n'est pas la même, donc il faut bien 2 connections distinctes.)

    L'inconvénient c'est que tu ouvres et fermes la connection à chaque appel de la procédure RecupNomPerso.
    Si tu as 1000 entrées dans ta table et que tu appelles 4 fois RecupNomPerso pour chaque entrée, tu fais 4000 ouvertures et fermeture de la connection.
    Cela peut peut-être être un peu long si la base est en réseau?

    Tu peux éventuellement déclarer une variable public ConnectDBNom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ConnectDBNom as ADODB.Connection
    Tu ouvres cette connection au début de RecherchePV (une seule fois avant la boucle While) et tu la fermes à la fin (une seule fois après le Wend).
    Dans RecupNomPerso tu utilises cette connection mais tu ne l'ouvres et fermes pas, c'est déjà fait dans RecherchePV.
    Comme ça tu ne fais qu'une seule ouverture et fermeture.

    Il faut juste être bien carré dans con code pour faire les ouvertures et fermetures au bon moment.

    Pour les connections et recordset utilisés uniquement par une seule procédure, il faut mieux les mettre en privé dans cette procédure.
    Par exemple rst1 qui est utilisé par RecupNomPerso, le déclarer au début la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private rstNom as ADODB.Recordset
    Comme ça on n'est sûr de ne pas l'utiliser par erreur dans une autre procédure.

    Au passage, j'évite les variables genre rst et rst1, on ne sait plus ensuite qui fait quoi.

    Et une dernière chose :
    NomPerso est public et garde donc sa valeur entre chaque exécution de RecupNomPerso.
    Il faudrait l'initialiser au début de la procédure, sinon s'il n'est pas trouvé il gardera la valeur précédente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub RecupNomPerso() 'Récupéré le nom de la presse selon l'id (conversion du id en nom)
    ' (0)
    NomPerso = "" ' Initialise le nom au cas où non trouvé
    Ou mieux utiliser une fonction au lieu d'une procédure et une variable public.

    Pour finir, un tuto pratique pour débuter en VBA et comprendre les variables, fonctions, ... :
    Initiation au VBA Office

    Bon courage.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Effectivement cette application est en réseau, j'ai donc suivi tous tes conseils.

    Merci pour l'attention apporté à mon problème.

    Je vais pouvoir continuer

    Merci beaucoup arkham.

    Bonne journée,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur 91 : "Object variable or With block variable not set" VBA
    Par Paulart dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/06/2014, 15h45
  2. Run time error 91 in vb:object variable or with block variable not set
    Par azzouz90 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/09/2011, 01h40
  3. Réponses: 4
    Dernier message: 14/04/2011, 16h32
  4. Error 91 :object variable or with block variable not set
    Par Eausport dans le forum Installation, Déploiement et Sécurité
    Réponses: 13
    Dernier message: 06/06/2009, 04h09
  5. [VBA-E] Erreur "Object variable or With block variable not set"
    Par @lex(is) dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/06/2006, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo