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 :

Fonction et Tableaux


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut Fonction et Tableaux
    Bonjour à tous,

    Après avoir tenté de résoudre ce problème moi même désespérément, je me permets de vous solliciter de l'aide.


    Je veux utiliser la fonction suivante ( ce n'est pas la fonction finale, c'est une simplification pour les besoins de l'explication, je reproduirais ensuite vos explications, merci d'avance)

    J'ai deux tableaux de doubles et je souhaiterai remplir via la fonction un troisième tableau, (MyTabA) .
    J'ai réussi en incluant une fonction directement dans la sub, sans passer par la fonction, uniquement en appliquant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabResult(i, j) = (MyTabK(i, 1) * MyTabS(1, j)) * 2
    et en remplissant le range.

    Là, je souhaiterai que les deux tableaux MyTabSpot et MyTabK puissent alimenter la fonction et ensuite seulement, que de là, je puisse obtenir un output qui puisse me permettre de remplir le tableau MyTabA.
    Et là, je suis largué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public Function Calcul(S As Double, K As Double, Z As Double) As Double
     
        Rfinal = (S * K) / Z
     
    End Function

    30 31 32 33 34 35
    40
    41
    42
    43
    44
    45



    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
    Sub TraitementA()
     
    Dim ThisWorkbook As Workbook
    Set ThisWorkbook = ActiveWorkbook
    Dim MySheet2 As Worksheet
    Set MySheet2 = ThisWorkbook.Worksheets("Sheet2")
     
    Dim i, j  As Integer
    Dim Z As Double
     
    Dim MyTabA(6, 6)
    Dim MyTabSpot(1, 6)
    Dim MyTabK(6, 1)
     
    Z = MySheet2.Range("A2")
    For i = 1 To UBound(MyTabSpot, 1)
      MyTabSpot(i, j) = MySheet2.Cells(3, j + 1)
     
       For j = 1 To UBound(MyTabK, 2)
     
          MyTabK(i, j) = MySheet2.Cells(i + 3, 1)
     
        Next j
     
    Next i
     
     
     
      MyTabA = MySheet2.Range("B4: G9")
     
     
     'MySheet2.Range("B4:G9") = MyTabA(i, j)
     
     
    End Sub
    Encore merci de votre aide, j'ai vainement cherché quelque chose de ressemblant , je n'ai pas trouvé parmi les tutoriaux sur les Tableaux
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Si j'ai bien compris, tu veux simplement utiliser une fonction pour faire le calcul suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabResult(i, j) = (MyTabK(i, 1) * MyTabS(1, j)) * 2
    Je te propose donc la simple fonction suivante (à placer après ton module) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function Calcul(S As Double, K As Double)
     
        Calcul = (S * K) * 2
     
    End Function
    Je ne sais pas si j'ai bien compris ta demande. Tiens moi au courant !

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Je suppose que c'est ce résultat que tu souhaite. La fonction n'est pas utilse mais si tu veux absolument cette dernière fait le savoir. Exécute cette proc avec F5 ou le bouton lecture :
    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
     
    Sub TraitementA()
     
        Dim MySheet2 As Worksheet
        Dim I  As Integer
        Dim J  As Integer
        Dim Z As Double
        Dim MyTabSpot()
        Dim MyTabK()
     
        Set MySheet2 = Worksheets("Sheet2")
     
        Z = MySheet2.Range("B1")
     
        With MySheet2
     
            MyTabSpot = .Range(.Cells(3, 2), .Cells(3, 7)) 'ligne 3 de B3 à G3
            MyTabK = .Range(.Cells(4, 1), .Cells(9, 1)) 'colonne A de A4 à A9
     
        End With
     
     
        For I = 1 To UBound(MyTabSpot, 2)
     
            For J = 1 To UBound(MyTabK, 1)
     
                MySheet2.Cells(J + 3, I + 1) = MyTabSpot(1, I) * MyTabK(J, 1) * Z
     
            Next J
     
        Next I
     
    End Sub
    Hervé.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une piste avec le code suivant à copier dans un module standard

    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
    '### Constante à adapter ####
    Const CELL_Z As String = "B1"
    '############################
     
    Sub Traitement_pmo()
    If TypeName(Selection) <> "Range" Then Exit Sub
    Call Calcul_pmo(Selection, Range(CELL_Z))
    End Sub
     
    Sub Calcul_pmo(Plage As Range, Z As Range)
    Dim i&
    Dim j&
    Dim var
    If Not IsNumeric(Z) Then Exit Sub
    var = Plage
    If Not IsArray(var) Then Exit Sub
    For i& = 2 To UBound(var, 1) 'les lignes
      If IsNumeric(var(i&, 1)) Then
        For j& = 2 To UBound(var, 2)  'les colonnes
          If IsNumeric(var(1, j&)) Then
            var(i&, j&) = var(i&, 1) * var(1, j&) * Z
          End If
        Next j&
      End If
    Next i&
    Plage = var
    End Sub
    Marche à suivre :
    1) sélectionnez la plage à traiter (dans votre exemple, la plage A3:G9)
    2) lancez la macro Traitement_pmo
    Au besoin, adaptez la constante CELL_Z cernée par des ####

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    Bonjour à tous et merci infiniment pour vos réponses que je continu d'étudier.
    Mais à ce point, il me semble que les solutions que vous me proposez et pour lesquelles je vous remercie infiniment, ne passent pas par la fonction.
    Car en fait, bien que la fonction soit toute simple, mon objectif est de comprendre comment construire un tableau via des tableaux le tout en passant par une fonction et d'incrémenter l’output de la fonction pour produire le tableau final.
    Je vous prie de m'excuser si je n'ai pas été clair dans mon premier message pour ce qui est de l'utilisation de la fonction.
    En fait, la difficulté, c'est comment utiliser des tableaux en lieu et place de variable via une fonction.
    Encore une fois, mes excuses si je n'ai pas été très clair.

    Comment avec deux tableaux je peux via une fonction qui lie ces deux tableaux, ( l'équation simple de la fonction) obtenir un troisième tableau qui est le résultat de cette fonction .
    Merci infiniment

    J'ai tenté cette dernière macro mais cela coince :

    soit je transforme les variables en tableaux et cela coince dans la fonction Module 1)
    Soit je laisse les variables ainsi et cela coince dans la sub "by ref argument type mismatch" (Module 2)

    Encore mille fois merci pour votre aide , car si j'arrivais à comprendre ce petit exercice, j'arriverai je pense à faire un pas significatif en VBA.


    Je vous remets en pièce jointe le fichier que j'ai modifié afin que vous ayez ma démarche que j'ai expliqué plus haut
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Mais à ce point, il me semble que les solutions que vous me proposez et pour lesquelles je vous remercie infiniment, ne passent pas par la fonction.
    Car en fait, bien que la fonction soit toute simple, mon objectif est de comprendre comment construire un tableau via des tableaux le tout en passant par une fonction et d'incrémenter l’output de la fonction pour produire le tableau final.
    Dans ce cas, essayez de remplacer votre code par le code suivant
    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
    Public Function FresultA(S As Double, K As Double, Z As Double) As Double
     
            FresultA = (S * K) / Z
     
    End Function
     
     
    Sub HoahA()
    '*** ne pas utiliser ThisWorkbook comme nom de variable car c'est un mot réservé
    '*** (il fait référence au classeur contenant la macro)
    'Dim ThisWorkbook As Workbook
    'Set ThisWorkbook = ActiveWorkbook
    '***
    Dim MyWorkbook As Workbook
    Set MyWorkbook = ThisWorkbook 'fait référence au classeur contenant la macro
    'OU
    'Set MyWorkbook = ActiveWorkbook 'fait référence au classeur actif
    Dim MySheet2 As Worksheet
    Set MySheet2 = MyWorkbook.Worksheets("Sheet2")
     
    Dim i As Integer
    Dim j As Integer
    Dim spot(1 To 1, 1 To 6) As Double
    Dim strike(1 To 6, 1 To 1) As Double
    Dim Divider As Double
    Dim OutPutResult(1 To 6, 1 To 6) As Double
     
    Divider = MySheet2.Cells(1, 2)
    For i = 1 To UBound(spot, 2)
       For j = 1 To UBound(strike, 1)
          spot(1, j) = MySheet2.Cells(3, j + 1)
          strike(i, 1) = MySheet2.Cells(i + 3, 1)
          OutPutResult(i, j) = FresultA(spot(1, j), strike(i, 1), Divider)
       Next j
    Next i
    MySheet2.Range("B4: G9") = OutPutResult
    End Sub

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Alors, si tu veux que ça passe par une fonction, je te propose deux solutions.
    Par une fonction tableau qui retourne, comme son nom l'indique, un tableau :
    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
     
    'appelle une fonction qui retourne un tableau (CalculRetourTableau)
    Sub TraitementA()
     
        Dim MySheet2 As Worksheet
        Dim Z As Double
        Dim MyTabSpot() '<-- Variant pour affecter directement un range
        Dim MyTabK() '<-- Variant pour affecter directement un range
        Dim MyTabA() As Double
     
        Set MySheet2 = Worksheets("Sheet2")
     
        With MySheet2
     
            Z = .Range("B1")
            MyTabSpot = .Range(.Cells(3, 2), .Cells(3, 7)) 'ligne 3 de B3 à G3
            MyTabK = .Range(.Cells(4, 1), .Cells(9, 1)) 'colonne A de A4 à A9
     
            'appel de la fonction
            MyTabA = CalculRetourTableau(MyTabSpot, MyTabK, Z)
     
            'inscrit le résultat dans le Range
            .Range(.Cells(4, 2), .Cells(UBound(MyTabA, 2) + 3, UBound(MyTabA, 1) + 1)) = MyTabA
     
        End With
     
    End Sub
     
    'la fonction "CalculRetourTableau" retourne un tableau, elle est appelée une seule fois
    Public Function CalculRetourTableau(S(), K(), Z As Double) As Double()
     
        Dim Tbl() As Double
        Dim I  As Integer
        Dim J  As Integer
     
        ReDim Tbl(1 To UBound(S, 2), 1 To UBound(K, 1))
     
        For I = 1 To UBound(S, 2)
     
            For J = 1 To UBound(K, 1)
     
                Tbl(J, I) = S(1, I) * K(J, 1) * Z
     
            Next J
     
        Next I
     
        CalculRetourTableau = Tbl
     
    End Function
    Par une fonction qui est appelée à chaque itération (chaque fois que la boucle interne l'appelle) :
    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
     
    'appelle une fonction qui retourne une valeur (Calcul)
    Sub TraitementB()
     
        Dim MySheet2 As Worksheet
        Dim I  As Integer
        Dim J  As Integer
        Dim Z As Double
        Dim MyTabSpot()
        Dim MyTabK()
        Dim MyTabA() As Double
     
        Set MySheet2 = Worksheets("Sheet2")
     
        Z = MySheet2.Range("B1")
     
        With MySheet2
     
            MyTabSpot = .Range(.Cells(3, 2), .Cells(3, 7)) 'ligne 3 de B3 à G3
            MyTabK = .Range(.Cells(4, 1), .Cells(9, 1)) 'colonne A de A4 à A9
     
            ReDim MyTabA(1 To UBound(MyTabSpot, 2), 1 To UBound(MyTabK, 1))
     
            'ici, la fonction est appelée à chaque itération
            For I = 1 To UBound(MyTabSpot, 2)
     
                For J = 1 To UBound(MyTabK, 1)
     
                    MyTabA(J, I) = Calcul(MyTabSpot(1, I), MyTabK(J, 1), Z)
     
                Next J
     
            Next I
     
             'inscrit le résultat dans le Range
            .Range(.Cells(4, 2), .Cells(UBound(MyTabA, 2) + 3, UBound(MyTabA, 1) + 1)) = MyTabA
     
        End With
     
    End Sub
     
    'la fonction "Calcul" retourne une seule valeur elle est appelée une multitude de fois
    Public Function Calcul(ByVal S As Double, ByVal K As Double, Z As Double) As Double
     
        Calcul = S * K * Z
     
    End Function
    Hervé.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut Merci
    Merci infiniment, cela fonctionne parfaitement !

    Suis vraiment content, je ne sais comment vous remercier.

    N'ayant pas le niveau que j'aurai souhaité avoir, j'ai peut-être été confus en expliquant ce que je recherchais mais cela correspond à la solution de PMO 2017 et à la seconde de Hervé (Thèze) , avec une itération à chaque fois.
    Mais là, en bonus, j'ai une seconde méthode alors, vraiment , merci infiniment !


    Merci beaucoup à tous pour votre aide, j'ai vraiment apprécié !

    Sincères salutations


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

Discussions similaires

  1. Exercice de programmation C : fonctions et tableaux
    Par Celialita11 dans le forum Débuter
    Réponses: 7
    Dernier message: 31/03/2010, 02h10
  2. Fonction et tableaux
    Par Nemesis007 dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2008, 16h54
  3. Réponses: 2
    Dernier message: 01/12/2008, 15h18
  4. Problème de fonctions et tableaux
    Par sebdu94 dans le forum C
    Réponses: 2
    Dernier message: 05/04/2007, 12h12
  5. [Conception] Utiliser les fonctions des tableaux ou plusieurs requêtes ?
    Par Derik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 01/02/2006, 10h54

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