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 :

Le "&" d'une instruction sql vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Mars 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 316
    Par défaut Le "&" d'une instruction sql vba
    Bonjour,

    Question concernant le "&"

    Il y a celui qui sépare bien l'instruction et le critère séparé par des quotes ou guillemets.
    Mais comment différencier le & à l'intérieur d'un critère

    car je suis à peu près certain que le code suivant qui ne fonctionne pas est lié à ce fameux & (& du critère :"Heures Improd Fixe & Polyvalence")

    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
    Public Function xHpoly(Optional ByVal Etb As Double, _
                                        Optional ByVal Semaine As Double)
     
        Dim rec As New ADODB.Recordset
        Dim strSQL As String
     
     
        'Redaction du SQL
        strSQL = "SELECT Sum(T_MPHImprod.Heures) AS  Montant " & _
                 "FROM T_Base INNER JOIN (T_NatureHeuresImprod INNER JOIN T_MPHImprod ON T_NatureHeuresImprod.Nature = T_MPHImprod.[Nature Improd]) ON T_Base.Ets = T_MPHImprod.Base" & _
                 "WHERE (((T_MPHImprod.[Service Origine] Like '" & "*variable" & "' )AND (T_NatureHeuresImprod.AgrégatFormulaireRH ='" & "Heures Improd Fixe & Polyvalence" & "')"
     
        If Semaine > 0 Then
            strSQL = strSQL & " And (MPHImprod.Semaine = " & Replace(CStr(Semaine), ",", ".") & ")"
        End If
     
        If Etb > 0 Then
            strSQL = strSQL & " And (T_Base.Ets = 955000+" & Etb & "))"
        End If
     
            strSQL = strSQL & "OR ((T_MPHImprod.[Service Origine]='" & "zur" & "' )And (T_MPHImprod.[Service Origine]<>'" & "Distribution variable" & "' )And (T_NatureHeuresImprod.AgrégatFormulaireRH='" & "Heures Improd Fixe & Polyvalence" & "')"
     
        If Semaine > 0 Then
            strSQL = strSQL & " And (MPHImprod.Semaine = " & Replace(CStr(Semaine), ",", ".") & ")"
        End If
     
        If Etb > 0 Then
            strSQL = strSQL & " And (T_Base.Ets = 955000+" & Etb & ")))"
        End If
     
        Dim rst As New ADODB.Recordset
     
        rst.Open strSQL, cnx
     
        On Error GoTo errH01
        rst.MoveFirst
     
        xHpoly = CDbl(rst("Montant"))
     
        rst.Close
        Set rst = Nothing
        Exit Function
     
    errH01:
     
        Err.Clear
        xHpoly = 0
        rst.Close
        Set rst = Nothing
     
     
    End Function

    Ligne 11 et 21
    Merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    en principe par d'impact

    Regarde plutot l'espace entre ) et AND (ligne 11)
    devant se transformer en
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    une simble :
    te montrera le texte que contient ta requête :
    crois-tu vraiment que la chaîne de caractères :
    'Heures Improd Fixe & Polyvalence'
    peut être un critère de recherche ?
    Ton problème n'est avant toute autre chose rien d'autre que la construction, par concaténation, de la chaine de caractères qu'est ta variable strSQL.

  4. #4
    Invité
    Invité(e)
    Par défaut
    bonjour,
    car je suis à peu près certain que le code suivant qui ne fonctionne pas est lié à ce fameux &
    et mois car je suis à peu près certain que ta requête c'est n'importe quoi!
    (T_MPHImprod.[Service Origine] Like '" & "*variable" & "'

    le Like en DAO (comme dans Access) c'est Like '*valeur', en ADO c'est Like '%valeur'!

    ici (
    "*variable") nous n'avons pas une variable mais une string!

    (T_MPHImprod.[Service Origine] Like '%" & variable & "' que représente zur et Distribution variable et "Heures Improd Fixe & Polyvalence?
    si ce sont des champs de ta table!

    "WHERE (((T_MPHImprod.[Service Origine] Like '%" & variable & "' )AND (T_NatureHeuresImprod.AgrégatFormulaireRH = [Heures Improd Fixe] & [Polyvalence])"




    strSQL = strSQL & "OR ((T_MPHImprod.[Service Origine]=[zur] ) And (T_MPHImprod.[Service Origine]<>[Distribution variable]
    Dernière modification par Invité ; 23/11/2016 à 13h48.

  5. #5
    Membre éclairé
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Mars 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 316
    Par défaut
    dysorthographie

    Ci joint le SQL de la requête Access

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_MPHImprod.Semaine, T_MPHImprod.[Nature Improd], T_MPHImprod.Heures, T_Base.Ets
    FROM T_Base INNER JOIN (T_NatureHeuresImprod INNER JOIN T_MPHImprod ON T_NatureHeuresImprod.Nature = T_MPHImprod.[Nature Improd]) ON T_Base.Ets = T_MPHImprod.Base
    WHERE (((T_MPHImprod.Semaine)=45) AND ((T_MPHImprod.[Service Origine]) Like "*variable") AND ((T_Base.Ets)=955059) AND ((T_NatureHeuresImprod.AgrégatFormulaireRH)="Heures Improd Fixe & Polyvalence")) OR (((T_MPHImprod.Semaine)=45) AND ((T_MPHImprod.[Service Origine])="zur" And (T_MPHImprod.[Service Origine])<>"Distribution variable") AND ((T_Base.Ets)=955059) AND ((T_NatureHeuresImprod.AgrégatFormulaireRH)="Heures Improd Fixe & Polyvalence"));

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    strSQL = "SELECT T_MPHImprod.Semaine, T_MPHImprod.[Nature Improd], T_MPHImprod.Heures, T_Base.Ets"
    strSQL = strSQL & " FROM T_Base INNER JOIN (T_NatureHeuresImprod INNER JOIN T_MPHImprod "
    strSQL = strSQL & " ON T_NatureHeuresImprod.Nature = T_MPHImprod.[Nature Improd]) "
    strSQL = strSQL & " ON T_Base.Ets = T_MPHImprod.Base"
    strSQL = strSQL & " WHERE (((T_MPHImprod.Semaine)=45) AND "
    strSQL = strSQL & " ((T_MPHImprod.[Service Origine]) Like '%variable')"
    strSQL = strSQL & "  AND ((T_Base.Ets)=955059) "
    strSQL = strSQL & " AND ((T_NatureHeuresImprod.AgrégatFormulaireRH)='Heures Improd Fixe & Polyvalence')) "
    strSQL = strSQL & " OR (((T_MPHImprod.Semaine)=45) AND ((T_MPHImprod.[Service Origine])='zur' "
    strSQL = strSQL & " And (T_MPHImprod.[Service Origine])<>'Distribution variable') AND ((T_Base.Ets)=955059) "
    strSQL = strSQL & " AND ((T_NatureHeuresImprod.AgrégatFormulaireRH)='Heures Improd Fixe & Polyvalence'));"
    tu peux simplifier ta close where!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    strSQL = strSQL & " WHERE T_MPHImprod.Semaine=45 "
    strSQL = strSQL & " AND T_Base.Ets=955059 "
    strSQL = strSQL & " AND T_NatureHeuresImprod.AgrégatFormulaireRH='Heures Improd Fixe & Polyvalence' "
    strSQL = strSQL & " AND (T_MPHImprod.[Service Origine] Like '%variable' "
    strSQL = strSQL & "     OR T_MPHImprod.[Service Origine]='zur'   "
    strSQL = strSQL & "     OR T_MPHImprod.[Service Origine]<>'Distribution variable'"
    strSQL = strSQL & "     ) "
    note cependant que '%variable' c'est bien déferrant de 'Distribution variable'
    Dernière modification par Invité ; 23/11/2016 à 14h38.

  7. #7
    Membre éclairé
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Mars 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 316
    Par défaut
    note cependant que '%variable' c'est bien déferrant de 'Distribution variable'
    Oui on est bien d'accord car il y a trois critères :
    Terrain (Fixe/Variable)
    Distribution (Fixe/Variable)
    Structure (Fixe)

    J'essaye de reprendre ta réponse mais en incluant les variables

    xHpoly(Optional ByVal Etb As Double, _
    Optional ByVal Semaine As Double)


    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSQL = strSQL & " ON T_Base.Ets = T_MPHImprod.Base"
    strSQL = strSQL & " WHERE (((T_MPHImprod.Semaine)=45) AND "
    J'obtiens valeur


    Je vais trouver la solution

    mais voici ce que j'ai rectifié au cas où

    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
    Public Function xHpoly(Optional ByVal Etb As Double, _
                                        Optional ByVal Semaine As Double)
     
        Dim rec As New ADODB.Recordset
        Dim strSQL As String
     
     
        'Redaction du SQL
        strSQL = "SELECT Sum(T_MPHImprod.Heures) AS  Montant " & _
                 "FROM T_Base INNER JOIN (T_NatureHeuresImprod INNER JOIN T_MPHImprod On T_NatureHeuresImprod.Nature = T_MPHImprod.[Nature Improd]) On T_Base.Ets = T_MPHImprod.Base WHERE ( 1=1"
     
     
     
     
     
        If Semaine > 0 Then
            strSQL = strSQL & " And (MPHImprod.Semaine = " & Replace(CStr(Semaine), ",", ".") & ")"
        End If
     
        If Etb > 0 Then
            strSQL = strSQL & " And (T_Base.Ets = 955000+" & Etb & ")"
        End If
     
        strSQL = strSQL & " AND (T_NatureHeuresImprod.AgrégatFormulaireRH = '" & "Heures Improd Fixe & Polyvalence" & "')"
        strSQL = strSQL & " AND ((T_MPHImprod.[Service Origine] Like '" & "%variable" & "')"
        strSQL = strSQL & " OR (T_MPHImprod.[Service Origine] = '" & "zur" & "')"
        strSQL = strSQL & " OR (T_MPHImprod.[Service Origine] <> '" & "Distribution variable" & "'))"
     
     
        MsgBox strSQL
     
        Dim rst As New ADODB.Recordset
     
        rst.Open strSQL, cnx
     
        On Error GoTo errH01
        rst.MoveFirst
     
        xHpoly = CDbl(rst("Montant"))
     
        rst.Close
        Set rst = Nothing
        Exit Function
     
    errH01:
     
        Err.Clear
        xHpoly = 0
        rst.Close
        Set rst = Nothing
     
     
    End Function

Discussions similaires

  1. récupérer une instruction sql
    Par oracliste dans le forum Oracle
    Réponses: 2
    Dernier message: 09/11/2006, 11h41
  2. Remplacer l'instruction GO par une instruction SQL
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 06/04/2006, 09h28
  3. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44

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