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

Macros et VBA Excel Discussion :

Problème de représentations de booléens Excel dans Access [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingénieur essai
    Inscrit en
    Juin 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur essai
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 35
    Par défaut Problème de représentations de booléens Excel dans Access
    Bonsoir,

    j'ai une table dans base de données sous access que je lis et souhaite mettre à jour à partir d'un userform dans excel 2016.

    Un des champs de cette table est un booléen. Access les stocke avec les valeurs -1 (Vrai ou oui) et 0 (Faux ou non).

    Lorsque j'enregistre ce booléen dans une variable avec VBA Excel, il me les représente par Vrai et Faux: ce qui ne me choque pas.

    Par contre, lorsque je fais une requête SQL pour enregistrer ou updater un enregistrement avec cette variable booléenne, VBA garde la valeur Vrai ou Faux.
    ma requête est donc du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            requete = " UPDATE [T_Contact] SET Actif= Vrai WHERE Id = 3"
    Et ça access ou du moins ODBC ne sais pas l'interpréter et m'affiche une jolie erreur.

    Mes données à enregistrer proviennent d'un formulaire créer dans Excel.

    Je voulais savoir si vous aviez déjà rencontré ce problème et comment vous l'aviez résolu.

    Cordialement,

    Guillaume Chevallier.

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete= "UPDATE [T_Contact] SET Actif =" & abs( true)*-1 & " WHERE Id = 3"

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    à tout hasard, tu as essayé avec =True ?
    eric

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Moi j'ai vérifier avec true , et oui ça donne "vrai" d'où ma réponse!

  5. #5
    Membre averti
    Homme Profil pro
    ingénieur essai
    Inscrit en
    Juin 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur essai
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 35
    Par défaut
    Bonjour,

    Tout est codé avec True et False. La conversion linguistique d'office remplace par Vrai et Faux.

    Thumb, j'essaierai ta solution lundi.

    C'est quand même louche que ça fonctionne dans le sens Access vers Excel mais pas l'inverse.

    Bon weekend,
    Guillaume

  6. #6
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    En fait tu concatènes un string avec un booléen! Avec le paramètre régional le True devient "Vrai" il y a une certaine logique la dedans.

    "Set Actif =" & True devient "set Actif = Vrai".

    En revanche un objet Command pour Ado ou querydef pour Access n'aurait pas posé de problème.

  7. #7
    Membre averti
    Homme Profil pro
    ingénieur essai
    Inscrit en
    Juin 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur essai
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 35
    Par défaut
    Bonjour,

    Ah,

    Tu m'intéresses avec Command pour Ado. Peux-tu m'en dire plus ou mettre un lien vers un tuto ou une explication?

    J'utilise une connection adodb avec une commande execute il me semble (je n'ai pas mon pc devant les yeux). C'est ce qui revient le plus souvent sur le web quand tu cherches comment faire une connection entre Excel et Access.

    Hier soir, je suis tombé sur un sujet en 4 articles de Pierre Fauconnier qui parle justement de connection et d'alimenter un formulaire Excel avec les données. Je le lirai en profondeur lundi.🙂

    Guillaume

  8. #8
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    bonsoir,
    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
    Sub test()
    Dim Cn As New ADODB.Connection
    With Cn
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\Thumb down\OneDrive\Documents\Base de données1.accdb';"
        With New ADODB.Command
            .ActiveConnection = Cn
            .CommandType = adCmdText
            Set prm = .CreateParameter("Actif", adBoolean): prm.Value = True: .Parameters.Append prm
            Set prm = .CreateParameter("ID", adInteger): prm.Value = 3: .Parameters.Append prm
            .CommandText = "UPDATE [T_Contact] SET [Actif]=? WHERE ID = ?"
            .Execute
        End With
        .Close
    End With
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    ingénieur essai
    Inscrit en
    Juin 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur essai
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 35
    Par défaut
    Bonjour,

    Avec ce type de commande, les paramètres doivent être ajoutés dans l'ordre d'apparition? ou le fait de les nommer permet de les ajouter dans l'ordre que l'on veut?
    ça ressemble aux requêtes préparées en PHP.

    Merci pour les infos.

    Bon dimanche pluvieux.
    tant pis pour la cueillette les champignons, ce sera crêpes.

    Guillaume.

  10. #10
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Non chaque point d'interrogation doit être remplacer par le nom du champ concerné.

  11. #11
    Membre averti
    Homme Profil pro
    ingénieur essai
    Inscrit en
    Juin 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur essai
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 35
    Par défaut
    Bonjour,

    je reviens vers vous après une absence de quelques semaines pendant lesquelles je n'ai pas pu bosser sur mon projet.

    J'ai modifié mon application pour avoir des requêtes paramétrées comme suggéré pour éviter le problème avec mes booléens. C'est vrai que d'un point de vue code, c'est plus propre et plus compréhensible que les concaténations de chaines de caractères.

    Par contre, j'ai un message d'erreur:
    "Erreur d'exécution '-214727900 (80040e14)':
    Erreur de syntaxe dans l'instruction UPDATE"
    J'ai la même chose avec le Insert.

    Y ' a t'il un moyen de visualiser la requête avec ses paramètres?


    Mon code est le suivant:
    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
     
    ' fonction Update TOP
     
    Private Function Update(Item As CsModelTop) 
        Dim Requete As String
        Dim Parameters As New Collection
     
        Requete = "UPDATE T_TOP SET CreationDate =?, Requester =?, Project =?, Input =?, Facility =?, Truck =?, " & _
            "Test_description =?, Protocol =?, PR =?, CE =?, LT =?, Responsible =?, Duration =?, Progress =?, " & _
            "Results_Ok =?, Comments =?, Test_report =? WHERE Id = ?"
     
        With Item
            Parameters.Add Me.Connection.getParameter("CreationDate", adDBDate, adParamInput, 8, .CreationDate)
            Parameters.Add Me.Connection.getParameter("Requester", adInteger, adParamInput, 4, .RequesterId)
            Parameters.Add Me.Connection.getParameter("Project", adInteger, adParamInput, 4, .ProjectId)
            Parameters.Add Me.Connection.getParameter("Input", adInteger, adParamInput, 4, .InputTypeId)
            Parameters.Add Me.Connection.getParameter("Facility", adInteger, adParamInput, 4, .FacilityId)
            Parameters.Add Me.Connection.getParameter("Truck", adVarChar, adParamInput, 100, .Truck)
            Parameters.Add Me.Connection.getParameter("Test_description", adLongVarChar, adParamInput, 1000, .TestDescription)
            Parameters.Add Me.Connection.getParameter("Protocol", adInteger, adParamInput, 4, .ProtocolId)
            Parameters.Add Me.Connection.getParameter("PR", adBoolean, adParamInput, 2, .PR)
            Parameters.Add Me.Connection.getParameter("CE", adBoolean, adParamInput, 2, .CE)
            Parameters.Add Me.Connection.getParameter("LT", adBoolean, adParamInput, 2, .LT)
            Parameters.Add Me.Connection.getParameter("Responsible", adInteger, adParamInput, 4, .ResponsibleId)
            Parameters.Add Me.Connection.getParameter("Duration", adInteger, adParamInput, 4, .Duration)
            Parameters.Add Me.Connection.getParameter("Progress", adInteger, adParamInput, 4, .ProgressId)
            Parameters.Add Me.Connection.getParameter("Results_Ok", adBoolean, adParamInput, 2, .ResultOk)
            Parameters.Add Me.Connection.getParameter("Comments", adLongVarChar, adParamInput, 255, .Comments)
            Parameters.Add Me.Connection.getParameter("Test_report", adVarChar, adParamInput, 100, .TestReport)
            Parameters.Add Me.Connection.getParameter("Id", adInteger, adParamInput, 4, .Id)
        End With
     
        Me.Connection.Execute Requete, Parameters
     
    End Function
    Item (classe CsModelTop) est l'objet que je visualise dans mes tableaux excel ou formulaires
    Me (Classe CsDAOTop) est l'objet qui gère les interactions avec la base de données Access pour l'objet Item.
    Connection est un objet attribut de la classe CsDAOTop et qui gère la connection et les requêtes vers la base.

    Cordialement,

    Guillaume.

  12. #12
    Membre averti
    Homme Profil pro
    ingénieur essai
    Inscrit en
    Juin 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ingénieur essai
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2017
    Messages : 35
    Par défaut
    re-bonjour,

    je viens de trouver mon erreur.

    J'ai un champ de table qui s'appelle "Input" et qui semble être un mot réservé par sql. J'aurais dû me méfier en le créant.
    Si je le remplace par [Input], plus de soucis.

    Guillaume.

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

Discussions similaires

  1. [AC-2002] Import de donnée Excel dans Access : problème de valeur
    Par shakapouet dans le forum VBA Access
    Réponses: 3
    Dernier message: 27/06/2012, 11h40
  2. Problème Import de données Excel dans Access
    Par francoisd dans le forum Access
    Réponses: 1
    Dernier message: 08/09/2006, 17h46
  3. problème d'importation excel dans access
    Par Badboy62cfp dans le forum Access
    Réponses: 6
    Dernier message: 09/05/2006, 16h17
  4. problème pour importer données excel dans Access
    Par sarah67 dans le forum Access
    Réponses: 8
    Dernier message: 20/02/2006, 08h17
  5. Réponses: 7
    Dernier message: 23/11/2005, 18h20

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