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 :

Erreur 'Type mismatch' + Copie range vers listbox [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
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut Erreur 'Type mismatch' + Copie range vers listbox
    Bonjour,

    Je crée un formulaire avec VBA que je connecte avec une DB access, en permettant d'insérer les données d'employés du formulaire directement sur la DB access. Je recontre cependant deux problèmes:

    Lookup Matricule existant

    Lorsque j'insère les données employés vers la table Employé dans access, je donne la possibilité de spécifier le matricule du manager de la personne mais ce matricule doit déjà exister dans la table access EMPLOYE. Voici le code que j'utilise:

    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
    Private sub creer_click ()
    Dim conn as object
    Dim rs as Object
    Dim strconn as String
    Dim qry as String
    Dim msg
     
    Set conn = createobject("ADODB.connection")
    set rs = createobject("ADODB.recordset")
     
    strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data source = C:\MyPath\MyDB.accdb"
    qry = "select * from employesTB"
     
    with rs
    .adnew
    if isnumeric(superviseurID) = false then
    msgbox "Superviseur ID invalide"
    exit sub
    elseif application.worksheetfunction.dcount("matricule","employesTB","actif='Yes' and matricule='"  & [EmployesForm.superviseurID] & "'") = 0 then
    msgbox "Superviseur n'existe pas"
    exit sub
    else 
    . fields("superviseur_id").value = superviseurID
    end if
    end with
     
    rs.update
    with employes
    .superviseurID.value = ""
    rs.close
    set rs = nothing
    conn.close
    set conn = nothing
     
    msgbox "Collaborateur rajouté"
    end sub ()
    l'éxécution de ce code me ramène une erreur 'Type mismatch'. J'ai fait le tour du web et je comprends que cela pourrait venir du fait que le champ superviseurID du formulaire est un textbox (donc de type string je suppose) tandis que le champ Superviseur_ID de la table Access est un nombre. J'ai tenté toutes les modifications trouvées sur le net mais cela ne marche pas, d'où mon désarroi :'(. Aide svp...

    Copie des donées d'une range vers une liste box

    Sur le même formulaire, j'ai crée une listbox sur lequel je veux copié le résultat d'une recherche. Le processus que j'ai établi est que je copie les données présentes dans la table Access vers une feuille excel dans la dynamique range 'OutputSource' dont la formule est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     OutputSource = OFFSET(EMPLOYES!$A$1;0;0;COUNTA(EMPLOYES!$A:$A);19)
    Le code que j'utilise est:

    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
    Private sub recherche_click ()
    Dim conn as object
    Dim rs as Object
    Dim strconn as String
    Dim qry as String
    Dim var1
     
    Set conn = createobject("ADODB.connection")
    set rs = createobject("ADODB.recordset")
     
    strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data source = C:\MyPath\MyDB.accdb"
     
    var1 = me.matricule
     
    if actif = true then
    qry = "select * from employesTB where actif = 'Yes' and matricule =" & var1
    else 
    qry = "select * from employesTB where  matricule =" & var1
    end if
     
    application.Screenupdating = false
    thisworkbook.worksheets("employes").range("a2:s10000").clearcontents
     
    conn.open(strconn)
    rs.open qry, conn
     
    if rs.eof and rs.bof then
    rs.close
    conn.close
    set rs = nothing
    set conn= nothing
    application.Screenupdating = true
    msgbox "aucun résultat"
    exit sub
    end if
    thisworkbook.worksheets("employes").range("a2").copyfromrecordset rs
     
    rs.close
    conn.close
    set rs = nothing
    set conn = nothing
     
    application.screenupdating = true
     
    me.listbox1.rowsources = "OutputSource"
     
    end sub
    Le code ne ramène aucune erreur mais le problème est que le résultat de la recherche dans la listbox ne fait appraître que la première colonne et pourtant j'ai bien vérifié que le range "OutputSource" était bien établi.

    Petite aide sur ce point-ci également

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 440
    Par défaut
    Bonjour,

    Pour le premier point, en ligne 9,
    - superviseurID étant un numérique, il faut supprimer les ' en fin de condition,
    - si actif est un champ Oui/Non (Booléen), il faut remplacer le 'Yes' par True ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif application.worksheetfunction.dcount("matricule","employesTB","actif=True and matricule="  & [EmployesForm.superviseurID]) = 0 then
    Pour le 2e point, reste à voir.
    Bonne continuation.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Pour le premier point, j'ai fait le changement de Actif = True et enelever les '' mais ca ne marche toujours pas. Même erreur.

    En fait, le champ Actif est une colonne dans access prenant la valeur 'Yes/No' c'est pour ça que j'ai mis 'Yes' explicitement.

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 440
    Par défaut
    Je crois que ce qui ne va pas c'est que DCount dans Excel n'utilise pas du tout la même présentation que dans Access. Très brièvement:
    Excel: DCount(Range("MyTable");Range("ColIndex");Range("Criteria")).
    Access: DCount(NomChamp, NomTable, ConditionSQL).
    A vous de savoir si vous l'appliquez à rs, donc Access, ou à ce qui a été chargé dans Excel.
    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    J'applique le Dcount sur le recordset que j'ai extrait de Access donc j'utilise la première formule que vous avez indiqué.

    J'ai vu sur un autre forum une question similaire qui dit que la fonction Dcount est une fonction Access et qu'il vaudrait mieux que j'applique une query sur ma table. Alors j'ai fait une nouvelle extraction de rs de la sorte
    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
     
    dim sql as string
    dim rs2 as Object
    dim conn as object
    dim rs2 as object
     
    Set conn = CreateObject("ADODB.connection")
    Set rs2 = CreateObject("ADODB.Recordset")
    sql = "select * from employes where actif='Yes' and matricule=" & Employes.superviseurID
     
    strconn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data source = C:\MyPath\MyDB.accdb"
     
    conn.Open (strconn)
    rs2.Open sql, conn
     
    with rs2
    .addNew
    If IsNumeric(superviseurID) = False Then
           MsgBox "Superviseur ID invalide", vbOKOnly + vbCritical
        Exit Sub
        ElseIf rs2.EOF And rs2.BOF Then
    MsgBox "Ce superviseur ID n'existe pas", vbOKOnly + vbInformation
        Exit Sub
        Else
     
         .Fields("superviseur_id").Value = superviseurID
     
        End If
     
    End With
    Cette méthode ci par contre me donne une erreur 'Syntax error in query expression 'actif = 'Yes' and matricule='.

    Je suis perdu!

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 440
    Par défaut
    La requête se faisant sur le recordset, il faut voir de quel type est le champ [actif].
    S'il est du type booléen, la condition doit s'écrire "actif=True AND ...".
    S'il est du type texte, il faut sans doute écrire "actif='oui' AND ..."
    Vous pourriez aussi poser en ligne 10 un Debug.Print sql puis tester la requête dans Access pour voir ce qu'elle donne.
    Cordialement.

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

Discussions similaires

  1. copy/paste erreur type mismatch
    Par nianko dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/01/2013, 16h09
  2. Erreur type mismatch
    Par bugland dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/03/2007, 19h54
  3. Erreur : Type mismatch !
    Par Interruption13h dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/01/2007, 21h21
  4. Erreur type Mismatch
    Par bov13 dans le forum Access
    Réponses: 7
    Dernier message: 25/09/2006, 11h22
  5. Erreur : Type Mismatch
    Par ekinoxe dans le forum ASP
    Réponses: 1
    Dernier message: 17/02/2006, 10h51

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