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 :

aide sur calcul dans les élements contenus dans un tableau en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut aide sur calcul dans les élements contenus dans un tableau en VBA
    Bonjour à toutes et a tous,

    je suis novice en VBA j'ai lu les cours et tutoriels contenus dans ce forum sur les tableaux et boucles imbriquées mais afin de mieux appréhender le concept des tableaux que je ne visualise pas trop bien peut être, je sollicite votre aide sur un exemple précis qui, à mon avis me permettra de mieux contextualiser les choses.

    Je m'explique : je veux créer une fonction avec une seule variable d'entrée qui est un tableau. A partir de cette variable d'entrée je veux faire des calculs entre les différents éléments du tableau (voir image ci-joint en jaune le tableau d'entrée et le texte en couleur les calculs que je veux faire).
    Nom : Capture.JPG
Affichages : 1091
Taille : 21,2 Ko

    Je n'ai pas fait de code comme je ne sais pas du tout comment faire. Merci de vos aides pour me permettre d'avance dans mon apprentissage des tableaux sous vba.

    Par ailleurs j'ai cru lire que debug.print ne fonctionne pas pour les tableaux. Existe-t-il un autre moyen pour vérifier les éléments d'un tableau au cours de la réalisation d'un code.


    Milles remerciements par avance.

    ---------------------------------------------------------------------------------------------------------------------
    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour !

    Aucun souci avec Debug.Print pour afficher un élément d'une variable tableau !

    Autre moyen : suivre le code en mode pas à pas via la touche F8 (ou via un point d'arrêt)
        et contrôler le contenu de la variable dans la fenêtre Variables locales

    Pour la création de la variable tableau tout dépend déjà où se trouvent les données !

    Voir le tutoriel Utiliser les variables tableaux en VBA Excel

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je ne comprends pas vraiment quelle est la logique de tes combinaisons (s'il y en a une).

    Tu ne peux pas créer une fonction qui renvoie plusieurs valeur. Une fonction ne renvoie qu'une valeur.
    Par contre, il est possible de faire une procédure Sub qui rempliera des cases précises.

    Si tu transmets un tableau sous forme de paramètre, il faut que ce paramètre soit déclaré de type Range.
    Tu pourras atteindre chaque élément à l'aide de la propriété Item.
    https://msdn.microsoft.com/fr-fr/lib.../ff841096.aspx
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut
    Bonjour
    Non il ny a aucune logique hormis le sens fait de pouvoir contextualiser les choses de mieux les apprehender. Je suis d'accord avec le fait que la fonction ne donne qu ine seul valeur mais je peux les sortir en array sur plusieurs cellules.

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Demo1()
            VT = [{"x","P";0.5,150}]
        For R& = LBound(VT) To UBound(VT)
            Debug.Print VT(R, 1), VT(R, 2)
        Next
            Debug.Print VT(2, 1) * VT(2, 2)
    End Sub
    Voir le résultat dans la fenêtre Exécution du VBE …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #6
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par delphine63000 Voir le message
    Je suis d'accord avec le fait que la fonction ne donne qu ine seul valeur mais je peux les sortir en array sur plusieurs cellules.
    Une fonction est dans une cellule dans laquelle elle place son résultat.
    C'est la même chose que n'importe quelle fonction Excel.

    Si tu veux placer plusieurs valeurs dans plusieurs cellules, il faudra créer une procédure Sub qui se lancera avec un bouton ou un raccourci clavier mais qui ne sera pas aussi dynamique qu'une fonction (sauf si on la place dans une macro évènementielle, mais ça c'est une autre histoire).
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut
    Bonjour Marc
    Merci pr ton aide. Je precise ma pensee a propos de debug.print pour afficher tous le tableaux entierement n'est pas possible? Cest vrai que comme tu fais si jai bien compris tu affiches tous les elements un à un.

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Sinon comme déjà évoqué voir la fenêtre Variables locales
    ou encore affecter une plage de cellules par le contenu de la variable tableau (cf tutoriel) …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre actif Avatar de EBRAG
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 125
    Points : 236
    Points
    236
    Par défaut
    Bonjour,

    Voici ma proposition (en inscrivant bien les opérateurs)
    Nom : Capture.PNG
Affichages : 1022
Taille : 16,2 Ko

    et donc le code suivant
    voir nouvelle réponse plus bas !
    Joël GARBE
    Fouillez bien, vous trouverez (ou pas !)

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut
    bonjour Menhir,

    Voici un code en format function qui permet de sortir 3 valeurs en même temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function toto(x, y)
    toto = Array(x + y, x * y, x / y)
     
    End Function
    avant de lancer la function tu selectionnes 3 cellules en même temps ensuite tu lances la function et tu entres tes variables au moment de sortir les résultats il faut entrée CRTL+ALT+ENTREE en même temps
    Nom : Capture.PNG
Affichages : 875
Taille : 3,7 Ko

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut
    slt EBRAG,

    Merci pour ta proposition mais je pourrais avoir les commentaires s'il te plait. Je la lis mais je comprend pas grand chose.

  12. #12
    Membre actif Avatar de EBRAG
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 125
    Points : 236
    Points
    236
    Par défaut
    désolé ! me suis trompé de procédure

    avec celle-ci, tu comprendras peut-être mieux (par rapport au tableau de ma première réponse, donc à adapter !
    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
    Sub Tableau()
      Dim Tbl()
      Dim oCell As Range
      Dim i As Long
      Dim sOp1 As String
      Dim sOp2 As String
      Dim lNum1 As Long
      Dim lNum2 As Long
      Dim sOperateur As String
      Dim stest As String
      Tbl() = Range("C3:E5")
      For Each oCell In Range("B7:B12")
        sOperateur = ""
        sOp1 = ""
        sOp2 = ""
        For i = 1 To VBA.Len(oCell)
          stest = VBA.Mid(oCell, i, 1)
          Select Case stest
            Case "0" To "9"
              If sOperateur = "" Then
                lNum1 = stest
              Else
                lNum2 = stest
              End If
            Case "+", "-", "*", "/"
              sOperateur = stest
            Case Else
              If sOperateur = "" Then
                sOp1 = sOp1 & stest
              Else
                sOp2 = sOp2 & stest
              End If
     
          End Select
        Next
     
        Select Case sOperateur
          Case "+"
            oCell.Offset(0, 1) = Tbl(lNum1, Application.WorksheetFunction.Match(sOp1, Range("C2:E2"), 0)) + _
              Tbl(lNum2, Application.WorksheetFunction.Match(sOp2, Range("C2:E2"), 0))
          Case "-"
            oCell.Offset(0, 1) = Tbl(lNum1, Application.WorksheetFunction.Match(sOp1, Range("C2:E2"), 0)) - _
              Tbl(lNum2, Application.WorksheetFunction.Match(sOp2, Range("C2:E2"), 0))
          Case "*"
            oCell.Offset(0, 1) = Tbl(lNum1, Application.WorksheetFunction.Match(sOp1, Range("C2:E2"), 0)) * _
              Tbl(lNum2, Application.WorksheetFunction.Match(sOp2, Range("C2:E2"), 0))
          Case "/"
            oCell.Offset(0, 1) = Tbl(lNum1, Application.WorksheetFunction.Match(sOp1, Range("C2:E2"), 0)) / _
              Tbl(lNum2, Application.WorksheetFunction.Match(sOp2, Range("C2:E2"), 0))
        End Select
      Next
     
    End Sub
    Joël GARBE
    Fouillez bien, vous trouverez (ou pas !)

  13. #13
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    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
     
    Sub essai()
      Tbl = [A2:C4]
      [A2:C4] = Tbl
      x1p1 = Tbl(1, 1) * Tbl(1, 2)
      x2p1 = Tbl(2, 1) * Tbl(1, 2)
      x3M1 = Tbl(3, 1) * Tbl(1, 3)
      x1P3 = Tbl(1, 1) * Tbl(3, 2)
      x2M2 = Tbl(2, 1) * Tbl(2, 3)
      [E2] = x1p1
      [E3] = x2p1
      [E4] = x3M1
      [E5] = x1P3
      [E6] = x2M2
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Merci pour vos aides à vous tous. très sincères remerciements et bonne journée à tous.

  15. #15
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    N'étant pas habitué à ce genre d'exercice, je suis quand même arrivé a faire une fonction quasi comme le résultat en exemple dans le post 1
    1 -j'ai aussi utilisé un champ nommé pour la plage regroupant les chiffres mais on peut aussi sélectionné la plage dans la limites de la fonction, sinon il faudra la faire évolué
    2 - pour les calculs, les opérateurs sont obligatoires et doivent être mis entre guillemets
    3 - Les valeurs et opérateurs peuvent être optionnel lors de l'écriture de la formule (cf Capture)

    La formule se présente (schématisé) :

    =Calcul(MaPlage;Xn;Opérateur1;Pn;Opérateur2;Mn)

    Voilà ce que cela donne en capture d'écran, on peut surement faire mieux mais je le fait avec mon niveau

    PS : les pro toutes remarques sont les bienvenues - merci d'avance pour ceux qui se manifestent

    capture :

    Nom : Function Calcul.PNG
Affichages : 971
Taille : 12,7 Ko

    le 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
    Function Calcul(Plage As Range, Optional Xn, Optional OPE1, Optional Pn, Optional OPE2, Optional Mn) As String
    Dim X, P, M, Val_X$, Val_P$, Val_M$, Val_OPE1$, Val_OPE2$, XPM$
     
        X = Application.Transpose(Application.Index(Plage, 0, 1)) 'Tab Valeurs de X
        P = Application.Transpose(Application.Index(Plage, 0, 2)) 'Tab Valeurs de P
        M = Application.Transpose(Application.Index(Plage, 0, 3)) 'Tab Valeurs de M
     
        If IsError(Xn) Then Val_X = "" Else Val_X = X(Xn) 'Position de la valeur choisie dans X
                    If IsError(OPE1) Then Val_OPE1 = "" Else Val_OPE1 = OPE1 'Opérateur 1
        If IsError(Pn) Then Val_P = "" Else Val_P = P(Pn) 'Position de la valeur choisie dans P
                    If IsError(OPE2) Then Val_OPE2 = "" Else Val_OPE2 = OPE2 'Opérateur 2
        If IsError(Mn) Then Val_M = "" Else Val_M = M(Mn) 'Position de la valeur choisie dans M
     
        XPM = Val_X & Val_OPE1 & Val_P & Val_OPE2 & Val_M
     
        'RESULTAT de type String
        Calcul = IIf(Val_X = "", "", "X" & CStr(Xn)) & IIf(Val_OPE1 = "", "", Val_OPE1) & _
                 IIf(Val_P = "", "", "P" & CStr(Pn)) & IIf(Val_OPE2 = "", "", Val_OPE2) & _
                 IIf(Val_M = "", "", "M" & CStr(Mn)) & _
                 "  =  " & Evaluate(XPM)
     
    End Function
    Edit : Quand je parlais da limite de la fonction, ici 'est par rapport au nombre de colonne contenu dans la plage qui est de 3 , après faut modifier la fonction.

    Je voulais faire qq chose de dynamique, mais pas trop le temps, en plus il faut voir si c'est possible, et si ca l'ai, on devra sûrement passer par des boucles
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  16. #16
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonsoir Delphine,

    En attendant ton retour j'ai fait une correction j'ai tenté une opération avec virgule qui ne marchait pas, en fait le calcul de la fonction se fait avec un point "." (ex : 2.5)
    Mais c'est pas un problème avec un Replace de la virgule par le point dans la fonction c'est arrangé (tu peux utilisé autant le point que la virgule dans tes valeurs)

    Donc voilà le code modifié :
    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
    Function Calcul(Plage As Range, Optional Xn, Optional OPE1, Optional Pn, Optional OPE2, Optional Mn) As String
    Dim X, P, M, Val_X$, Val_P$, Val_M$, Val_OPE1$, Val_OPE2$, XPM$
     
        X = Application.Transpose(Application.Index(Plage, 0, 1)) 'Tab Valeurs de X
        P = Application.Transpose(Application.Index(Plage, 0, 2)) 'Tab Valeurs de P
        M = Application.Transpose(Application.Index(Plage, 0, 3)) 'Tab Valeurs de M
     
        If IsError(Xn) Then Val_X = "" Else Val_X = Replace(X(Xn), ",", ".") 'Position de la valeur choisie dans X
                    If IsError(OPE1) Then Val_OPE1 = "" Else Val_OPE1 = OPE1 'Opérateur 1
        If IsError(Pn) Then Val_P = "" Else Val_P = Replace(P(Pn), ",", ".") 'Position de la valeur choisie dans P
                    If IsError(OPE2) Then Val_OPE2 = "" Else Val_OPE2 = OPE2 'Opérateur 2
        If IsError(Mn) Then Val_M = "" Else Val_M = Replace(M(Mn), ",", ".") 'Position de la valeur choisie dans M
     
        XPM = Val_X & Val_OPE1 & Val_P & Val_OPE2 & Val_M
     
        'RESULTAT de type String
        Calcul = IIf(Val_X = "", "", "X" & CStr(Xn)) & IIf(Val_OPE1 = "", "", Val_OPE1) & _
                 IIf(Val_P = "", "", "P" & CStr(Pn)) & IIf(Val_OPE2 = "", "", Val_OPE2) & _
                 IIf(Val_M = "", "", "M" & CStr(Mn)) & _
                 "  =  " & Evaluate(XPM)
     
    End Function
    Edit : il me semble que avoir lu qu'une conversion en Cdbl peut marcher a la place du Replace, je testerais dès que j'ai un moment

    N'hésite pas pour toutes questions ou problème rencontrés auxquels je n'aurais pas pensé
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2016
    Messages : 69
    Points : 32
    Points
    32
    Par défaut
    Bonsoir a toutes et a tous,
    Alors me revoila avec mes tableaux. Alors je veux remplir mon tableau à partir des valeurs entrées et quelques opérations sur ces valeurs (voir capture d'écran ci-dessous).
    Nom : constructin matrice.JPG
Affichages : 842
Taille : 44,3 Ko
    Voici la fonction que j'ai créer mais bon elle n'est pas fameuse à mon avis.
    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
    Function calculmatrice(x As Range)
    Dim i As Variant 'pour parcourir les lignes de la matrice
    Dim j As Variant 'pour parcourir les colonnes de la matrice
    Dim n As Single  'taille de la matrice
    Dim matrice() As Range
     
    k = Application.CountA(x) 'nombre de valeur contenu dans x
    n = k - 1
     
    ReDim matrice(i, j)
     
    For i = 1 To n
    For j = 1 To n
        If i = j Then
            matrice(i, j) = 2 * (x(i) + x(i + 1))
        ElseIf i > 1 And i <= j Then
            matrice(i, j) = x(i + 1)
        ElseIf j > 1 And j < i Then
            matrice(i, j) = x(j + 1)
        End If
     
    Next
    Next
     
    calculmatrice = matrice(1, 1) 'valeur à changer pour obtenir toute les valeurs de la matrice
     
    End Function
    et je voudrais aussi pouvoir intercaler des colonnes supplémentaires ou en remplacer les idées ou une documentation sur ce point particuliers ne serait pas refus en plus de mon problème de construction du table
    A titre d'exemple voici une capture d'image par un exemple numérique.
    Nom : exemple numerique.JPG
Affichages : 904
Taille : 20,4 Ko

    MERCI DE VOS AIDES.

  18. #18
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    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 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ce sont des calculs à la fois basiques, mais surtout reposant sur un motif/pattern en escalier
    ce n'est pas la panacée pour étirer des formules Excel, mais ça n'empêche pas de s'aider du VBA pour les utiliser


    la restitution exacte de ta dernière copie écran peut se remplir avec deux simples formules :

    - "=A1+A2" // "=2*(Xi + Xi+1)"
    - "=A2" // "=Xi"

    en partant de ça, on va les écrire dynamiquement "au bon endroit" en fonction du nombre de valeurs
    l'avantage, c'est que les formules te permettent de faire varier ton tableau de résultat, en changeant les valeurs d'entrée

    Ecrit à partir de A1 une liste de valeurs sur la colonne A sans ligne vide
    Et utilise ce code, qui contient une variable LIMITE pour ta propre sécurité, si tu étais trop gourmande en quantité

    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
    Sub toto()
    Dim LIMITE As Integer, NbVal As Integer, i As Integer
    LIMITE = 10                                                 ' la sécurité
    NbVal = Cells(1, 1).CurrentRegion.Columns(1).Cells.Count    ' le nombre de valeurs
    If NbVal < 1 Or NbVal > LIMITE Then Exit Sub                ' on veut un nombre de valeurs compris entre 2 et LIMITE
     
        ' on se met 4 lignes en dessous des valeurs
        With Cells(NbVal + 4, 1)
            ' on efface un peu
            .CurrentRegion.ClearContents
            ' on boucle sur la taille que feront les côtés du carré final
            For i = 1 To NbVal - 1
                ' quoi qu'il arrive, le "=2*(Xi + Xi+1)"
                .Offset(i - 1, i - 1).Formula = "=2*(A" & i & "+A" & i + 1 & ")"
                ' à partir de 3 valeurs
                If i > 1 Then
                    ' "=Xi" au dessus et sur la gauche de là où on a écrit la formule du dessus
                    .Offset(i - 1, i - 2).Formula = "=A" & i
                    .Offset(i - 2, i - 1).Formula = "=A" & i
                End If
            Next i
            's'il reste des cellules vides, on met 0
            On Error Resume Next
                If NbVal > 2 Then .Resize(NbVal - 1, NbVal - 1).SpecialCells(xlCellTypeBlanks).Value = 0
            On Error GoTo 0
        End With
    End Sub
    c'est pas super optimisé, mais vu le peu de temps que j'y ai consacré, on devrait s'en tirer pas trop mal

  19. #19
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Pour rester sous forme de 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
    Function calculmatrice(x As Range)
        Dim i      As Long    'pour parcourir les lignes de la matrice
        Dim j      As Long    'pour parcourir les colonnes de la matrice
        Dim n      As Single    'taille de la matrice
        Dim matrice() As Double
     
        n = Application.CountA(x) - 1
        ReDim matrice(1 To n, 1 To n)
        For i = 1 To n
            For j = 1 To n
                If i = j Then
                    matrice(i, j) = 2 * (x(i) + x(i + 1))
                ElseIf i > 1 And i <= j Then
                    matrice(i, j) = x(i + 1)
                ElseIf j > 1 And j < i Then
                    matrice(i, j) = x(j + 1)
                End If
            Next
        Next
        calculmatrice = matrice    'valeur à changer pour obtenir toute les valeurs de la matrice
    End Function
    Comme la taille de ta matrice dépend de la taille de x sélectionne la plage résultat à la bonne taille avant de valider en matriciel.

    Sinon tu peux fixer la taille à 4x4 avec ReDim matrice(1 To 4, 1 To 4), mais les colonnes/lignes inutilisées se mettent à 0, même en déclarant matrice As Variant. A voir le plus pratique pour toi.
    eric

  20. #20
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re Delphine,

    je voulais savoir si la 1ère fonction que j'ai fait en post 17, allait te servir

    sinon sur ton 2ème problème (en réactualisant j'ai eu la surprise de voir le code de Eriic proche du mien, il y a qd meme des différences)

    le voilà
    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 CalculMatrice(Plage As Range, Lig&, col&) As Variant
    Dim VA
     
        VA = Application.Transpose(Application.Index(Plage, 0, 1))
     
        If Lig > UBound(VA) - 1 Or col > UBound(VA) - 1 Then
            CalculMatrice = "Error => n maxi = " & UBound(VA) - 1: Exit Function
        End If
     
        If Lig = col Then
            matrice = 2 * (VA(Lig) + VA(Lig + 1))
        ElseIf Lig > 1 And Lig <= col Then
            matrice = VA(Lig + 1)
        ElseIf col > 1 And col < Lig Then
            matrice = VA(col + 1)
        End If
     
            CalculMatrice = matrice
     
    End Function
    Edit : selon ton tableau il y a des 0 (zéro), mais selon les conditions comment obtient t on ces zéro ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

Discussions similaires

  1. Boucle sur tous les mots contenus dans un fichier texte
    Par medmaysais dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 12/03/2016, 09h56
  2. Filtres dans les requêtes ou dans les rapports
    Par aureliend8800 dans le forum Webi
    Réponses: 3
    Dernier message: 14/06/2013, 21h12
  3. Placer les points contenus dans un tableau sur un graphe
    Par SandyF dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/09/2009, 17h40
  4. Réponses: 20
    Dernier message: 22/07/2008, 01h28
  5. [XHTML] Variables contenus dans les messages en XHTML
    Par Linoa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 19/09/2005, 12h45

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