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 :

Imbrication de fonction dans VBA [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2016
    Messages : 10
    Par défaut Imbrication de fonction dans VBA
    Bonjour,

    Je me permet de venir vers vous, car je me trouve dans une situation insoluble.
    J'ai crée plusieurs "Function" qui me renvoi, après une validation matriciel, un tableau de valeur. Toutes ces "Function" fonctionne parfaitement indépendamment les unes des autres. Mais quand je crée une "Function" supérieur qui utilise les autres et par,ou sans, un jeu de variable, passe le résultat d'une première "Function" comme paramètre d'une seconde. Cette dernière engendre une erreur. Alors que chaque "Function" est censé renvoyer un résultat de type "Range" et que les paramètres de la seconde "Function" sont aussi définis comme "Range".
    Je présume qu'il s'agit d'un souci sur le type de donnée en entrée ou en sortie mais je n'arrive pas à définir ou, ni comment.

    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en nous montrant tes "sous-fonctions" et la fonction principale, ça devrait déjà faciliter l'aide à la résolution de ton problème

  3. #3
    Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2016
    Messages : 10
    Par défaut
    Pardon

    Bon je suis dessus donc j'ai déjà tenté deux ou trois truc qui marche, ou pas, suivant les expériences.
    Quand j'utilise la fonction "WPtsCommuns2systeme" elle me renvoi bien le bon résultat dans un tableur Excel
    Quand j'utilise la fonction "WCalculParamTrans2D" depuis Excel sur le jeu de donnée généré par la fonction "WPtsCommuns2systeme" ça fonctionne aussi.
    Mais quand j'imbrique le tout dans la fonction "Transfo2D", ça coince

    Fonction principal

    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
    55
    56
    57
    58
    59
     
    Function Transfo2D(DONNESYSTREF() As Variant, DONNESYSTLOCAL() As Variant, Optional FACT As Double = 0) As Variant()
     
    Application.Volatile
    'Transforme un jeu de coordonnées d'un systéme a un autre en fonction des paramètres données et du listing de points(mat,x,y,z)
    Dim K, I, J As Integer
    Dim FACTECH As Double
    Dim DONNECOMMUNEtemp() As Variant
    Dim PARAMtemp(10) As Double
    Dim NEWCOORD()
    Dim NEWCOORDTEMP()
     
    Set DONNECOMMUNE = WPtsCommuns2systeme(DONNESYSTREF, DONNESYSTLOCAL)
    K = UBound(DONNECOMMUNE)
    ReDim DONNECOMMUNEtemp(K, 7)
    For I = 0 To K
        For J = 0 To 7
            DONNECOMMUNEtemp(I, J) = DONNECOMMUNE(I, J)
       Next J
    Next I
     
     
    COORDATRANS = DONNESYSTLOCAL
    If FACT <> 0 Then
        FACTECH = FACT
        Else
        FACTECH = 0
    End If
     
     
    PARAM = WCalculParamTrans2D(DONNECOMMUNE, FACTECH)
    'For I = 0 To 10
            'PARAMtemp(I) = PARAM(I)
    'Next I
     
     
    Transfo2D = PARAM
     
    'K = DONNESYSTLOCAL.Rows.Count
    'ReDim NEWCOORD(K, 2)
    'ReDim NEWCOORDTEMP(K, 4)
     
    'For I = 1 To K
        'NEWCOORDTEMP(I - 1, 0) = COORDATRANS(I, 2) + PARAM(2)
       ' NEWCOORDTEMP(I - 1, 1) = COORDATRANS(I, 3) + PARAM(3)
        'NEWCOORDTEMP(I - 1, 2) = GIS(PARAM(4), PARAM(5), NEWCOORDTEMP(I - 1, 0), NEWCOORDTEMP(I - 1, 1))
        'NEWCOORDTEMP(I - 1, 3) = DIST(PARAM(4), PARAM(5), NEWCOORDTEMP(I - 1, 0), NEWCOORDTEMP(I - 1, 1))
    'Next I
     
    'For I = 1 To K
        'NEWCOORD(I - 1, 0) = COORDATRANS(I, 1)
        'NEWCOORD(I - 1, 1) = WXpol(PARAM(4), NEWCOORDTEMP(I - 1, 2), NEWCOORDTEMP(I - 1, 3))
        'NEWCOORD(I - 1, 2) = WYpol(PARAM(5), NEWCOORDTEMP(I - 1, 2), NEWCOORDTEMP(I - 1, 3))
        'NEWCOORD(I - 1, 3) = COORDATRANS(I, 4)
    'Next I
     
    'Transfo2D = NEWCOORD
     
    End Function
    sous fonction
    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
     
    Function WPtsCommuns2systeme(TabA As Variant, TabB As Variant) As Variant()
     
     
    'renvoi un tableau contenant les points communs contenu dans 2 tableaux de points
    Application.Volatile
    Dim Resultat() As Variant
    Dim K, L, M, I, J, N As Integer
     
    TempA = WTabPtsSansRedondance(TabA)
    TempB = WTabPtsSansRedondance(TabB)
     
    N = 0
    K = UBound(TempA)
    L = UBound(TempB)
     
    For I = 0 To K
        For J = 0 To L
            If TempA(I, 0) = TempB(J, 0) And TempA(I, 0) <> "" And TempB(J, 0) <> "" Then
                N = N + 1
                Exit For
            End If
        Next J
    Next I
     
    N = N - 1
    ReDim Resultat(N, 7)
     
    M = -1
    For I = 0 To K
         For J = 0 To L
            If TempA(I, 0) = TempB(J, 0) And TempA(I, 0) <> "" And TempB(J, 0) <> "" Then
                M = M + 1
                Resultat(M, 0) = TempA(I, 0)
                Resultat(M, 1) = TempA(I, 1)
                Resultat(M, 2) = TempA(I, 2)
                Resultat(M, 3) = TempA(I, 3)
                Resultat(M, 4) = TempB(J, 0)
                Resultat(M, 5) = TempB(J, 1)
                Resultat(M, 6) = TempB(J, 2)
                Resultat(M, 7) = TempB(J, 3)
                Exit For
            End If
        Next J
    Next I
     
    PtsCommuns2systeme = Resultat
     
    End Function

    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
    55
    56
    57
    58
    59
    60
    61
     
    Function WCalculParamTrans2D(JEUCOORD As Variant, Optional FACT As Double = 0) As Double()
    Application.Volatile
    Dim Resultat(10) As Double
    Dim ROTA, XREF, YREF, XTR, YTR, ZREF, ZTR, FACTECH As Double
    Dim I, J, K As Integer
     
    K = JEUCOORD.Rows.Count
     
    XREF = 0
    YREF = 0
    ZREF = 0
    XTR = 0
    YTR = 0
    ZTR = 0
    ROTA = 0
    FACTECH = 0
     
    For I = 1 To K
        XREF = XREF + JEUCOORD(I, 2)
        YREF = YREF + JEUCOORD(I, 3)
        ZREF = ZREF + JEUCOORD(I, 4)
        XTR = XTR + JEUCOORD(I, 6)
        YTR = YTR + JEUCOORD(I, 7)
        ZTR = ZTR + JEUCOORD(I, 8)
    Next I
     
    XREF = XREF / K
    YREF = YREF / K
    ZREF = ZREF / K
    XTR = XTR / K
    YTR = YTR / K
    ZTR = ZTR / K
    For I = 1 To K
        ROTA = ROTA + (GIS(XREF, YREF, JEUCOORD(I, 2), JEUCOORD(I, 3)) - GIS(XTR, YTR, JEUCOORD(I, 6), JEUCOORD(I, 7)))
        FACTECH = FACTECH + (DIST(XREF, YREF, JEUCOORD(I, 2), JEUCOORD(I, 3)) / DIST(XTR, YTR, JEUCOORD(I, 6), JEUCOORD(I, 7)))
     
    Next I
     
    ROTA = ROTA / K
    If FACT <> 0 Then
        FACTECH = FACT
        Else
        FACTECH = FACTECH / K
    End If
     
    Resultat(0) = -ROTA
    Resultat(1) = FACTECH
    Resultat(2) = XREF - XTR
    Resultat(3) = YREF - YTR
    Resultat(4) = ZREF - ZTR
    Resultat(5) = XREF
    Resultat(6) = YREF
    Resultat(7) = ZREF
    Resultat(8) = XTR
    Resultat(9) = YTR
    Resultat(10) = ZTR
     
    WCalculParamTrans2D = Resultat
     
    End Function

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    C'est assez difficile, me concernant, de bien comprendre le but de tes procédures, je dois donc uniquement m'accrocher aux principes universels et à la logique pure VBA. Déjà sur cette base il y a des trucs qui m'interpellent.

    exemples :

    des variables qui ne sont pas déclarées dans ce que tu nous montres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COORDATRANS = DONNESYSTLOCAL
    du coup, des lignes d'instanciation de variables ont l'air assez exotiques, sans pour autant forcément l'être dans la réalité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set DONNECOMMUNE = WPtsCommuns2systeme(DONNESYSTREF, DONNESYSTLOCAL)
    des déclarations maladroites, seul J est un Integer, les autres sont des Variant

    et des tests conditionnels qui semblent superflus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If FACT <> 0 Then
        FACTECH = FACT
        Else
        FACTECH = 0
    End If
    Que FACT soit égal ou non à 0, sa valeur est affectée à FACTECH

    ça veut dire quoi "ça coince" ?
    un message d'erreur ? Lequel ?
    Un résultat inattendu ? Il faut expliquer précisément ce qui est attendu, et ce que finalement tu obtiens actuellement.

  5. #5
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set DONNECOMMUNE = WPtsCommuns2systeme(DONNESYSTREF, DONNESYSTLOCAL)
    me parait inapproprié.
    Set sert pour un objet et WPtsCommuns2systeme retourne une variable tableau, pas un range (range=plage).
    DONNECOMMUNE = ...
    Sans feuille en situation je n'ai pas été plus loin.

    Rien à voir avec ton pb mais pose-toi la question de savoir si tous tes Application.Volatile sont nécessaires.
    Ca ne l'est que si tu as une variable utilisée par la fonction qui n'est pas passée en paramètre. Sinon tu la fais évaluer pour rien à chaque Calculate.

    eric

    edit: ah, on s'est croisés avec Joe, salut.

  6. #6
    Membre du Club
    Homme Profil pro
    Comptable
    Inscrit en
    Juillet 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2016
    Messages : 10
    Par défaut
    Bonjour,
    Merci pour vos réponse je vais en premier lieu essayer d’éclaircir le code sur les points que vous m'avez spécifié.
    Pour répondre à vos question :

    je pensais que cette formulation permettait de déclarer les 3 variable en tant que integer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If FACT <> 0 Then
        FACTECH = FACT
        Else
        FACTECH = 0
    End If
    Pour ce test conditionnel je ne sais pas ce qui se passe si l'opérateur ne rentre pas le paramètre optionnel, donc en prévention des risque j'ai mis ça, mais il est vrais que comme j'ai mis une valeur par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set DONNECOMMUNE = WPtsCommuns2systeme(DONNESYSTREF, DONNESYSTLOCAL)
    ça c'était une expérience qui s'est avéré infructueuse.

    Par ça coince j’entends, que le resultat attendu dans excel ne se fait pas il y a juste #VALEUR

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

Discussions similaires

  1. [XL-2007] Problème de fonctions dans VBA excel & Access via ADO
    Par Djohn92 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/06/2015, 18h35
  2. [XL-2003] Imbriquer des fonctions dans VBA
    Par ADbtr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2010, 12h44
  3. [VBA-E]import de fonction dans vba
    Par vincent.tr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/12/2006, 22h05
  4. [VBA]Atteindre une fonction dans un xla
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/01/2006, 13h13
  5. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 01h18

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