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 :

Résultats de requête SQL comme paramètres de fonction VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2018
    Messages : 6
    Par défaut Résultats de requête SQL comme paramètres de fonction VBA
    Bonjour,

    J'aimerais avoir votre aide concernant une fonction VBA que j'essaye de développer. J'ai déjà une fonction qui me retourne le prix d'un titre à une date en se basant sur ses caractéristiques passés comme paramètres.

    La fonction est: prix(date, date_emission, date_echeance, taux, methode)

    J'aimerais améliorer cette fonction en la remplaçant par prix(date, code). Le paramètre code sera considéré comme paramètre d'une requette SQL "execute get_parametres(code)" qui me retourne les autres éléments dont j'ai besoin: date_emission, date_echeance, taux, methode.

    Par la suite, ce résultat sera utilisé dans le code VBA déjà développé.

    Est-ce qu'il y a une manière d'utiliser les résultats d'une requête SQL comme paramètres de fonction VBA?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ce lien sera peut-être un peut trop pour toi mais dis moi si c'est ce genre de truc dont tu parle!

    N'essaies pas de comprendre le code regarde l'aspect général de la sub test!

    https://www.developpez.net/forums/d1...a/#post9283354

    Precise ta pensée sur ce que tu entends par paramètres et ce que ta fonction doit retourner?
    Dernière modification par Invité ; 06/02/2018 à 23h46.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2018
    Messages : 6
    Par défaut
    Merci beaucoup pour ta réponse. Je vais essayer de comprendre la logique du code.

    Pour être un peu plus claire, voici une partie de ma fonction VBA (le code est assez long donc je le simplifie):

    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
     Function prix(date, date_émission, date_échéance, taux, maturité)
     
    Dim flux() As Double
    Dim echeancier(), date_flux As Date
    Dim p, cc, di As Double
    Dim i, nbr_flux, jour_inclus As Integer
     
    If maturité = 13 Or maturité = 26 Or maturité = 52 Then
      nbr_flux = 1
      ReDim flux(1 To nbr_flux)
      ReDim echeancier(1 To nbr_flux)
      flux(1) = Round(nominal * (1 + taux * (CDate(date_échéance) - CDate(date)) / 360), 2)
      echeancier(1) = CDate(date_échéance)
    Else flux(1) = Round(nominal * (1 + taux * (CDate(date_échéance) - CDate(date)) / 365), 2)
     
    p = (flux(1) )
     
    prix=p
     
    end function
    Donc d'après ton code, si je veux transformer ma fonction en prix(date, code), je dois ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Cn As New ADODBRD, Sql As String
    Cn.Server = "172.2": Cn.Base = "DBTEST": Cn.TYPEBASE = SQLSERVER2005: Cn.User = "dysorthographi ": Cn.PassWord = "dysorthographie"
    Cn.OpenConnetion
     
    Sql = "execute get_parametres ?"
    mais comment mentionner que code doit être le parametre de ma requete SQL? (c'est à dire "execute get_parametres 'code'" qui va me retourner: date_émission, date_échéance, taux, maturité)

    Merci beaucoup.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Dans l'exemple du lien il est question d'un module de classe qui gère la manipulation de données en lien avec une base de données X!

    Dans cette exemple il s'agit d'une procédure stocké sur Sql Serveur.

    Il faudra donc modifier la connexion en du type de base Access,Excel,Sql serveur.

    Un requet paramétré s'écrit comme çà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sql="select [Champ1],[Champ2] From [Table] Where [Champ3]=?"
    adSmallInt = 2
     adParamInputOutput = 3
      adCmdText = 1
       'Paramètre de type integer de valeur 55
    Set Param1= CreateObject("ADODB.Command").CreateParameter("Champ3", adSmallInt, adParamInputOutput, 4, 55)
    With CreateObject("ADODB.Command")
        Set .ActiveConnection = Connexion
        .CommandType = adCmdText
        .CommandTimeout = 500
            .Parameters.Append Param1
        .CommandText = Sql
        Set CommadExecute = .Execute
      End With
    Dernière modification par Invité ; 07/02/2018 à 09h32.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2018
    Messages : 6
    Par défaut
    Merci pour cette réponse.

    Donc si je veux utiliser le paramètre code de la fonction VBA comme paramètre de la requete SQL, je dois remplacer 55 par code?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui exactement.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2018
    Messages : 6
    Par défaut
    J'essaye d'adapter la fonction mais ça ne marche pas encore.

    Voici une partie de code qui contient les modifications:

    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
    Function prix_titre2(date_liquidation, code, rendement)
     
    Dim Cn As New ADODBRD, Sql As String
    Cn.Server = "ATWMANARPRD": Cn.BASE = "MSAP": Cn.TYPEBASE =SQLSERVER2000
    Cn.OpenConnetion
     
    Dim flux() As Double
    Dim echeancier(), date_flux As Date
    Dim p, cc, di As Double
    Dim i, nbr_flux, jour_inclus As Integer
     
    Sql = "select date_emission, date_echeance, taux, nominal, premier_j, methode_valo, periodicite_cp, maturite, periodicite_cap, base From dbo.get_parametres() where code=code"
    adSmallInt = 2
    adParamInputOutput = 3
    adCmdText = 1
     
    Set Param1 = CreateObject("ADODB.Command").CreateParameter("code", adSmallInt, adParamInputOutput, 4, code)
     
    With CreateObject("ADODB.Command")
        Set .ActiveConnection = Connexion
        .CommandType = adCmdText
        .CommandTimeout = 500
            .Parameters.Append Param1
        .CommandText = Sql
        Set CommadExecute = .Execute
      End With
     
     
     
    If methode_valo = "M" Then
    p = flux(1) / (1 + rendement * (echeancier(1) - CDate(date_liquidation)) / 360)
    End If
    '******************valorisation linéaire******************
     
    If methode_valo = "L" Then
    If periodicite_cap = "F" Then
    p = nominal + cc
    Else
    p = Round((nominal - Round((nominal / maturite), 2) * (maturite - nbr_flux)), 2) + cc
    End If
     
    End If
     
    p = p + (flux(i) / ((1 + rendement) ^ di))
    Next
    End If
     
     
    Else
    p = 0
    End If
     
    prix_titre2 = p
    End Function

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    non ta requête c'est exactement ça!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sql = "select date_emission, date_echeance, taux, nominal, premier_j, methode_valo, periodicite_cp, maturite, periodicite_cap, base From dbo.get_parametres() where code=?"

  9. #9
    Membre à l'essai
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2018
    Messages : 6
    Par défaut
    Je suis désolée mais ça ne marche pas encore.

    Le résultat de la requete SQL doit être stocké dans une variable pour pouvoir l'utiliser ou bien ça marche comme dans mon code?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Déjà as tu un message d'erreur, si oui le quel?

    Le résulta de ta requête est dans CommadExecute {Set CommadExecute = .Execute}

    Après si c'est Ok on verra comment la gérer.

  11. #11
    Membre à l'essai
    Femme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Février 2018
    Messages : 6
    Par défaut
    Je n'ai pas de message d'erreur. Mais quand j'utilise la fonction ça me retourne #VALEUR!

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    En fait, si je comprends bien,tu utilises ta fonction dans une cellule Excel {#VALEUR}!

    Hors CommadExecute c'est un recordSet une sorte te tableau à plusieurs dimensions! L'erreur est inévitable!

    Il faut traiter CommadExecute avant de retourner une valeur à Excel! Que veux tu récupérer dans ta cellule, sachant que tu n'a le droit qu'à une seule valeur?

    Positionnes toi sur la ligne Set CommadExecute = .Execute et appuie sur la touche [F9];
    Exécutes ta formule dans Excel;
    Quand la macro s'arrête sur la ligne Set CommadExecute = .Execute, fait un click droit sur CommadExecute-> ajouter à l'espion;
    Appuies sur [F8] et regardes le résultat dans l'espion.

    Accessoirement fais un imprime écran et poste l!

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/12/2013, 10h01
  2. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 09h30
  3. liste énumérée de const. perso comme paramètre de fonction
    Par batou22003 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/12/2005, 20h37
  4. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05
  5. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33

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