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 :

Arrondi automatique requête sql dans une boucle [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Arrondi automatique requête sql dans une boucle
    Bonjour,

    J'ai un problème en vba, avec une macro excel. Le principe de la macro est le suivant : le programme doit me retourner des valeurs récupérées dans une base de données et les stockés dans certaines cellules sur plusieurs feuilles.

    Le problème : Lorsque je met une variable dans ma requête sql ou bien dans la fonction Worksheets(), le résultat est automatiquement arrondi. (soit au supérieur si plus x,5 soit au chiffre inférieur si moins de x,5)

    Exemple avec un extrait de mon code :
    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
     
    sub requetesql()
     
    'Les variables de connexion odbc
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Set cnx = New ADODB.Connection
    Set rst = New ADODB.Recordset
    Dim NomDuDSN As String
    Dim NomUtilisateur As String
    Dim MotDePasse As String
    'variables des requêtes
    Dim noWs As Integer
    Dim nomFeuille As String
    Dim celluleD As String
    Dim var2 As Integer
     
    'identifiant
    NomDuDSN = "MySQL"
    NomUtilisateur = "toto"
    MotDePasse = "toto"
     
    'chaine de connexion
    cnx.ConnectionString = "DSN=" & NomDuDSN & ";UID=" & NomUtilisateur & ";PWD=" & MotDePasse & ";"
     
    'ouverture de la bdd
    cnx.Open
     
    For noWs = 1 To 32
    nomFeuille = Worksheets(noWs).Name
    'Définir les variables de requête
    table = nomFeuille          'NOTE : le nom de la table sql corresponds au nom de la feuille
    var2 = 0
    var3 = "'D342J'"
    celluleD = "F45"
    'Exécution de la requête SQL
    rst.Open "SELECT SUM(colonne1) AS montant1 FROM " & table & " WHERE colonne2 = " & var2 & " AND colonne3 = " & var3 & "", cnx
    'on insère la requête SQL dans la bonne case
    Worksheets(noWs).Range("" & celluleD & "").Offset(1, 0) = rst("montant1")
    rst.Close
    Next
     
    'pour revenir sur la première feuille...
    Worksheets(1).Activate
    End Sub
    Sur cet extrait le résultat affiché dans la cellule est du genre 124,00

    Alors que si je modifie les deux lignes suivantes comme ceci, en imaginant que "tfg" est le nom réel de ma table et de ma feuille de calcul.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rst.Open "SELECT SUM(colonne1) AS montant1 FROM tfg WHERE colonne2 = " & var2 & " AND colonne3 = " & var3 & "", cnx
    Worksheets(tfg).Range("" & celluleD & "").Offset(1, 0) = rst("montant1")
    Le résultat sera bon c'est à dire du genre 123,75

    Le problème c'est que j'ai 32 feuilles à parcourir... je me vois mal créer 32 requêtes sql juste pour avoir les arrondis.

    J'ai essayé avec sans succès, le comportement n'est pas modifié.
    Avez-vous une idée, s'il vous plait ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open "SELECT ROUND(SUM(colonne1))  AS montant1 FROM " & table & " WHERE colonne2 = " & var2 & " AND colonne3 = " & var3 & "", cnx
    '

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre réponse.

    Malheureusement après avoir testé votre proposition avec ROUND(SUM(colonne1)) ça m’arrondis toujours le résultat. J'ai également tenté ROUND(SUM(colonne1),2) même topo.
    En fait pour que ça fonctionne, je dois écrire en dur le nom de la table dans ma requête SQL et le nom de ma feuille dans Worksheets(). Dans ce cas là, ça n’arrondit plus. Dans tous les autres cas j'ai un arrondi

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open "SELECT ROUND(SUM([" & table & "].colonne1))  AS montant1 FROM [" & table & "] WHERE [" & table & "].colonne2 = " & var2 & " AND  [" & table & "].colonne3 = " & var3 & "", cnx

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci encore pour votre proposition. Cette fois j'ai une erreur SQL, comme c'est du MySQL les [ ] ne passent pas. J'ai essayé sans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open "SELECT ROUND(SUM(" & table & ".colonne1))  AS montant1 FROM " & table & " WHERE " & table & ".colonne2 = " & var2 & " AND  " & table & ".colonne3 = " & var3 & "", cnx
    Ça fonctionne sans erreur mais ça arrondi.

    Avec le ,2 en plus ça arrondi toujours...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open "SELECT ROUND(SUM(" & table & ".colonne1),2)  AS montant1 FROM " & table & " WHERE " & table & ".colonne2 = " & var2 & " AND  " & table & ".colonne3 = " & var3 & "", cnx

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je ne suis pas sur de bien comprendre,round arrondi c'est si métier!

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    Bonjour,
    Je ne suis pas sur de bien comprendre,round arrondi c'est si métier!
    Oui je vais essayer de vous éclaircir mon problème.Un round est censé arrondir on est d'accord. Mais là en l’occurrence je ne veux pas d'arrondi.
    A la limite, je veux bien un arrondi au centième (exemple: 4,75). Mais je ne veux pas d'arrondi à l'entier (exemple: 5).

    Or pour le moment je n'ai que des arrondis à l'entier. Que je mettes ROUND() ou bien ROUND(,2) ou pas de ROUND, j'en arrive toujours à un résultat arrondi à l'entier (exemple: 5,00 au lieu de 4,75...)

    Comme je vous le disais un peu plus haut, c'est quand j'utilise des un nom de table en variable et un nom de feuille en variable que mon problème ce déclenche.

    Si j'utilise FROM tfg dans ma requête SQL et Worksheets(1) pour utiliser la feuille 1, ça va fonctionner, j'aurai pas d'arrondi.

    Si j'utilise des variables:
    table = tfg
    noWs = 1
    FROM " & table & " dans ma requête SQL et Worksheets(noWs) pour le nom de la feuille, ça ne va pas fonctionner, j'aurai un arrondi à l'entier forcément.

    Bon j'espère avoir été assez précis, sinon n'hésitez pas à me demander d'autres infos.

  8. #8
    Invité
    Invité(e)
    Par défaut
    bonjour,
    regardes avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.Open "SELECT Format(SUM(" & Table & ".colonne1), '#0.00')  AS montant1 FROM " & Table & " WHERE " & Table & ".colonne2 = " & var2 & " AND  " & Table & ".colonne3 = " & var3 & "", cnx

  9. #9
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Super il y a du mieux !

    En résultat il m'affiche les nombres après la virgule en tant que nombre entier. C'est à dire, pour un résultat qui devrait être 24010,27 il m'affiche 27,00.
    Il faudrait juste transformer le format pour avoir le nombre entier puis les deux décimales après la virgule.

    Je regarde si j'arrive à trouver la solution en modifiant un peu ton code.

    [edit] J'ai essayé plusieurs format mais ça m'affiche toujours la même chose. C'est uniquement les nombres après la virgule.
    J'ai essayé tout ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Format(SUM(" & Table & ".colonne1), '#0.00')
    résultat => 27,00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FORMAT(SUM(" & table & ".colonne1), '#')
    résultat => 27,00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FORMAT(SUM(" & table & ".colonne1), '#,##')
    résultat => 27,00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FORMAT(SUM(" & table & ".colonne1), '0,00')
    résultat => 27,00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FORMAT(SUM(" & table & ".colonne1), 'N', 'fr-FR')
    résultat => 27,00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FORMAT(SUM(" & table & ".colonne1), 'C', 'fr-FR')
    résultat => 27,00

    Note : 27 est ce qu'il faudrait avoir après la virgule, mais pas avant...

  10. #10
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Est-ce que vous avez d'autres pistes ?

    Je n'arrive toujours pas à obtenir de résultat avec deux chiffres après la virgules.

  11. #11
    Invité
    Invité(e)
    Par défaut
    bonjour,
    chez moi ces 2 requêtes fonctionnent!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT round(sum(toto),2) titi FROM `new_table`
    SELECT sum(round(toto,2)) titi FROM `new_table`
    es tu sur qu'il s'agit bien de DECIMAL dans ta table?
    (sur un champ en vachar j’obtiens le même résultat que toi!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sum(convert(`toto`, DECIMAL(5,2))) titi FROM `new_table`
     
    SELECT round(sum(convert(`toto`, DECIMAL(5,5))),2) titi FROM `new_table`
    convert Marche
    Dernière modification par Invité ; 26/01/2015 à 13h14.

  12. #12
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2015
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est bon j'ai solutionné mon problème. En fait j'ai multiplié par 100 le résultat de la requête SQL, et je la divise par 100 au moment de copier dans la cellule.
    J'avais également un problème avec un module qui recalculait derrière une somme avec une variable de type long, j'ai donc changé en type double pour avoir les décimales... Le problème se situait donc ailleurs dans mon code !
    Mais le mystère persiste sur le fait que ça fonctionnait sans utiliser de variable dans ma requête...

    Merci Mr rdurupt pour vos réponses et votre patience.

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

Discussions similaires

  1. [MySQL] Requête SQL dans une boucle : optimisation
    Par guiom056 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/05/2010, 12h09
  2. Problème de requête SQL dans une boucle While
    Par Astraya dans le forum VB.NET
    Réponses: 3
    Dernier message: 21/01/2009, 17h18
  3. [MySQL] Requetes SQL dans une boucle PHP
    Par Siteac dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2006, 14h35
  4. Comment stocker une requête sql dans une variable ?
    Par innova dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/10/2006, 10h01
  5. Requête sql dans une clause Where
    Par PrinceMaster77 dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/07/2006, 11h30

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