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 :

Variable Tableau [Débutant(e)] [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Variable Tableau
    Bonjour à tous,

    Je débute avec les variables tableaux et j'aimerai savoir s'il est possible de modifier une variable dans un tableau.
    Je m'explique, j'ai le tableau de données suivant:
    A1=0, B1=1, C1=1, D1=0, A2=1, B2=0, C2=1 et D2=0
    En F1 la formule suivante tirée de F1 à G2: index($I$1:$P$1;4*a1+2*b1+c1+1) et de I1 à P1 de 1 à 8, donc on se trouve avec F1=4, G1=7, F1=6 et G2=3
    Maintenant si je modifie K1, par exemple K1=10, avec excel G2= 10 mais comment faire pour que le tableau F1:G2 prend en compte la modification de K1 lorsque l'on est en variable tableau, et comment construire ce type de programmation.

    Merci par avance.

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, un tuto à lire

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonjour,

    @ kiki29: Merci pour le tuto mais déjà lu comme d'autres également.
    Je suis débutant et j'ai du mal pour débuter. Je ne demande pas de me faire mes devoirs parce que la programmation standard j'arrive à me débrouiller même si je ne suis vraiment pas un expert. L'objectif est d'accélérer mon code de départ en passant par les variables tableaux (temps de traitement du code initial voisin de 29 heures et cela devient énervant !!!!) mais avant de me lancer dans cette nouvelle aventure je veux juste savoir si cela est possible, si il est nécessaire de définir 2 ou 3 tableaux et comment programmer.

    Cordialement

  4. #4
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonjour pascal4782,

    Pour ma part, je ne comprend pas ta question (j'imagine ne pas être le seul)... Peux tu reformuler ta problématique ou l'illustrer à l'aide d'un exemple ? Rien de mieux qu'un exemple pour comprendre.

    Tu nous parles de tableau Excel (avec des références de cellule) et de variable tableau (VBA je suppose) - c'est confus : veux tu transformer un tableau Excel en variable tableau ?

    Bertrand

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonjour,

    @Bear the french: Merci pour cette tentative, ma demande ne devais donc pas etre precise. Je reprends les explications.
    Problématique: J'aimerai passer de la programmation "normale" en variable tableau ce petit programme exemple.
    - J'ai un tableau de données binaire (0,1) de (A1:D2)
    - J'ai un tableau de calcul (F1:G2). exemple en F1=INDEX($I$1:$P$1;4*A1+2*B1+C1+1)et cette formule est glissée jusqu'en G2
    - J'ai une série de variables (I1:P1) que je désire faire évoluer toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)
    - Un tableau de résultat (R1:S1) qui me permet de vérifier en R1 si F1 et G1 sont pairs R1=SI(ET(EST.PAIR(F1);EST.PAIR(G1));1;0) et en S1 si F2 et G2 sont pairs S1=SI(ET(EST.PAIR(F2);EST.PAIR(G2));1;0). Si R1=1 et S1 = 1 alors je copie les variables qui ont données la bonne combinaison

    J'espère avoir été clair. Je joins un petit fichier en exemple avec une petite macro pour les résultats souhaités même s'il n'est pas de bon aloi de joindre un fichier

    Cordialement
    Fichiers attachés Fichiers attachés

  6. #6
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonjour,

    Ta problématique est intéressante.

    On va procéder par étape.

    Etape 1 : Affecter les données binaires à une variable tableau que l'on va appeler tableau_binaire()

    Etant donné qu'il a deux lignes et 4 colonnes, je vais faire un tableau à 2 dimensions (2,4). Attention, il y a une différence fondamentale entre Excel et la variable tableau VBA : le premier indice dans une variable tableau est le 0, alors que c'est le 1 pour Excel.

    La cellule A1 dans Excel = la cellule (x=1,y=1) dans Excel = la valeur du tableau en (0,0).

    Illustration :
    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
    Sub mise_en_tableau()
    Dim tableau_binaire(2, 4), i, j As Integer
     
    'on traite la première ligne puis la seconde
    For i = 1 To 2
        'on traite la première colonne puis la seconde...
        For j = 1 To 4
            tableau_binaire(i - 1, j - 1) = Cells(i, j).Value
        Next
    Next
     
    'j'affiche le résultat dans un MsgBox pour vérifier si cela fonctionne
    'l'expression vbNewLine permet de passer à la ligne
    MsgBox tableau_binaire(0, 0) & " " & tableau_binaire(0, 1) & " " & tableau_binaire(0, 2) & " " & tableau_binaire(0, 3) & vbNewLine & tableau_binaire(1, 0) & " " & tableau_binaire(1, 1) & " " & tableau_binaire(1, 2) & " " & tableau_binaire(1, 3)
     
    End Sub
    Tout cela est Ok pour toi ?

    Bertrand

    Etape 2 : établir une série de variables qui représentent toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)

    Mêmes principes que précédemment mais dans un tableau appelé "tableau_un_ou_deux(256, 8)".

    Illustration :

    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
    Sub mise_en_tableau2()
    '
    'Pour établir une série de variables qui représentent toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)
    '
     
    Dim tableau_un_ou_deux(256, 8), x As Integer
    Dim i1, i2, i3, i4, i5, i6, i7, i8 As Byte
    Dim iLigne As Long
    Dim resultat As String
     
    iLigne = 0
     
    'je boucle pour chacune des huit cellules sur la ligne entre 1 et 2
    'il faut imaginer un arbre avec 2 racines qui produisent 2 racines, qui produisent 2 racines...
    For i1 = 1 To 2
        For i2 = 1 To 2
            For i3 = 1 To 2
                For i4 = 1 To 2
                    For i5 = 1 To 2
                        For i6 = 1 To 2
                            For i7 = 1 To 2
                                For i8 = 1 To 2
                                    tableau_un_ou_deux(iLigne, 0) = i1
                                    tableau_un_ou_deux(iLigne, 1) = i2
                                    tableau_un_ou_deux(iLigne, 2) = i3
                                    tableau_un_ou_deux(iLigne, 3) = i4
                                    tableau_un_ou_deux(iLigne, 4) = i5
                                    tableau_un_ou_deux(iLigne, 5) = i6
                                    tableau_un_ou_deux(iLigne, 6) = i7
                                    tableau_un_ou_deux(iLigne, 7) = i8
                                    iLigne = iLigne + 1
                                Next i8
                            Next i7
                        Next i6
                    Next i5
                Next i4
            Next i3
        Next i2
    Next i1
     
    ' j'affiche le résultat dans un MsgBox pour vérifier si cela fonctionne
    ' l'expression vbNewLine permet de passer à la ligne
    ' ça fonctionne pour les premières lignes du tableau
    For x = 0 To 255
        resultat = resultat & vbNewLine & x + 1 & " " & _
                tableau_un_ou_deux(x, 0) & " " & tableau_un_ou_deux(x, 1) & " " & _
                tableau_un_ou_deux(x, 2) & " " & tableau_un_ou_deux(x, 3) & " " & _
                tableau_un_ou_deux(x, 4) & " " & tableau_un_ou_deux(x, 5) & " " & _
                tableau_un_ou_deux(x, 6) & " " & tableau_un_ou_deux(x, 7)
    Next
     
    MsgBox resultat
     
    End Sub
    Il y a peut-être plus simple que cela... D'autres forum-eurs me corrigeront car je pense qu'il doit y avoir plus court.

    Il faut d'abord bien comprendre ces deux étapes avant de commencer les calculs.

    Bertrand

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonjour,
    @Bertrand:
    Etape 1, l'objectif est la définition du tableau binaire et la MSG permet de visualiser toutes les données de ce tableau.
    Dans la définition du tableau vous définissez 2 lignes et 4 colonnes, avec i qui boucle sur les lignes et j sur les colonnes. Par contre, je suppose que" tableau_binaire(i - 1, j - 1)" permet de démarrer sur la ligne et colonne 0.

    Etape 2, l'objectif est la définition des 256 possibilités avec pour consigne de démarrer a partir de la ligne 0. Cependant la MsgBox n'affiche que les 52 premiers cas mais il semble que cela soit normal car fait l'objet d'un commentaire dans la programmation.
    Le bouclage des variables semble identique que pour une programmation "standard", par contre vous demandez de commencer par la ligne "0" (iLigne = 0) et ensuite vous demandez la scrutation de ligne par ligne ( iLigne = iLigne + 1) cependant je ne vois pas encore ce que viens faire tableau_un_ou_deux(iLigne, 0) = i1, fera l'objet d'une information ultérieure.

    Conclusion. La méthode que vous adoptez me convient parfaitement car me permet de débuter avec les variables tableaux. J'attends avec impatience vos prochains posts

    Cordialement

  8. #8
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Alors on continue.

    Les MSGBOX ne sont là que dans un but pédagogique... Afin de visualiser et de tester au fur et à mesure. C'est à ôter quand on assemblera nos codes.

    n'affiche que les 52 premiers cas mais il semble que cela soit normal
    oui, c'est juste pour avoir une idée

    Etape 3 : calculs et coordonnées
    La suite :
    J'ai un tableau de calcul (F1:G2). exemple en F1=INDEX($I$1:$P$1;4*A1+2*B1+C1+1)et cette formule est glissée jusqu'en G2
    Il va falloir préciser la méthode :
    Ta formule fait référence absolue à la plage $I$1:$P$1 soit 2 2 2 2 2 2 2 2
    Hors dans la précédente étape, les 2 2 2 2 2 2 2 2 sont devenus 256 combinaisons.
    Faut il toujours faire référence à 2 2 2 2 2 2 2 2 (qui doit être en tableau_un_ou_deux(255, 0 à 7)) ou à la première combinaison qui est en tableau_un_ou_deux(0, 0 à 7) et qui est égale à 1 1 1 1 1 1 1 1 ?

    On va utiliser les mêmes concepts que précédemment : tableau de calcul (F1:G2) devient en VBA tableau_avec_calcul_index(2,2). Il va falloir renseigner les 4 anciennes cellules :

    tableau_avec_calcul_index(0,0) = ...
    tableau_avec_calcul_index(0,1) = ...
    tableau_avec_calcul_index(1,0) = ...
    tableau_avec_calcul_index(1,1) = ...

    Bertrand

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir,

    J'interviens probablement trop rapidement mais je pense à la solution suivante:

    tableau_avec_calcul_index(0,0) = k1
    tableau_avec_calcul_index(0,1) = K2
    tableau_avec_calcul_index(1,0) = K3
    tableau_avec_calcul_index(1,1) = k4

    Par contre je reste perplexe car à l'étape 2 vous n'avez pas défini l'emplacement du tableau-un-deux, seul a été défini se qu'il devait réaliser.

    Cordialement

  10. #10
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Si on considère que tu fais encore référence aux 2 2 2 2 2 2 2 2, la macro est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Anciennement le calcul de l'index
    resultat = ""
    For i = 0 To 1
        For j = 0 To 1
            tableau_avec_calcul_index(i, j) = tableau_un_ou_deux(255, 4 * tableau_binaire(i, j) + 2 * tableau_binaire(i, j + 1) + tableau_binaire(i, j + 2) + 1)
        Next
    Next
     
    MsgBox tableau_avec_calcul_index(0, 0) & " " & tableau_avec_calcul_index(0, 1) & vbNewLine & tableau_avec_calcul_index(1, 0) & " " & tableau_avec_calcul_index(1, 1)
    Celle ci est extraite du code "général" que nous pouvons regrouper :

    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
    Sub mise_en_tableau3()
     
    Dim tableau_avec_calcul_index(2, 2), tableau_un_ou_deux(256, 8), tableau_binaire(2, 4), i, j, x As Integer
    Dim i1, i2, i3, i4, i5, i6, i7, i8 As Byte
    Dim iLigne As Long
     
    ' Chargement d'un tableau Excel en tableau VBA
    ' on traite la première ligne puis la seconde
    For i = 1 To 2
        ' on traite la première colonne puis la seconde...
        For j = 1 To 4
            tableau_binaire(i - 1, j - 1) = Cells(i, j).Value
        Next
    Next
     
    ' Pour établir une série de variables qui représentent toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)
    ' je boucle pour chacune des huit cellules sur la ligne entre 1 et 2
    ' il faut imaginer un arbre avec 2 racines qui produisent 2 racines, qui produisent 2 racines...
    iLigne = 0
    For i1 = 1 To 2
        For i2 = 1 To 2
            For i3 = 1 To 2
                For i4 = 1 To 2
                    For i5 = 1 To 2
                        For i6 = 1 To 2
                            For i7 = 1 To 2
                                For i8 = 1 To 2
                                    tableau_un_ou_deux(iLigne, 0) = i1
                                    tableau_un_ou_deux(iLigne, 1) = i2
                                    tableau_un_ou_deux(iLigne, 2) = i3
                                    tableau_un_ou_deux(iLigne, 3) = i4
                                    tableau_un_ou_deux(iLigne, 4) = i5
                                    tableau_un_ou_deux(iLigne, 5) = i6
                                    tableau_un_ou_deux(iLigne, 6) = i7
                                    tableau_un_ou_deux(iLigne, 7) = i8
                                    iLigne = iLigne + 1
                                Next i8
                            Next i7
                        Next i6
                    Next i5
                Next i4
            Next i3
        Next i2
    Next i1
     
    ' Anciennement le calcul de l'index
    resultat = ""
    For i = 0 To 1
        For j = 0 To 1
            tableau_avec_calcul_index(i, j) = tableau_un_ou_deux(255, 4 * tableau_binaire(i, j) + 2 * tableau_binaire(i, j + 1) + tableau_binaire(i, j + 2) + 1)
        Next
    Next
     
    ' j'affiche le résultat dans un MsgBox pour vérifier si cela fonctionne
    MsgBox tableau_avec_calcul_index(0, 0) & " " & tableau_avec_calcul_index(0, 1) & vbNewLine & tableau_avec_calcul_index(1, 0) & " " & tableau_avec_calcul_index(1, 1)
     
    End Sub
    J'ai fait une simple transcription de ta formule index, le calcul permettant de déterminer la référence de la colonne sous Excel et de la deuxième dimension dans ta variable tableau VBA.

    Bertrand

    Par contre je reste perplexe car à l'étape 2 vous n'avez pas défini l'emplacement du tableau-un-deux, seul a été défini se qu'il devait réaliser.
    Je crois comprendre pourquoi tu es perplexe : veux tu que je fasse apparaître les 256 combinaisons dans ton classeur excel ?
    Il n'est pas nécessaire de les affecter à des cellules, ce qui alourdit considérablement le traitement. C'est d'ailleurs un des bienfaits de travailler par la variable VBA.

    Bertrand

    Citation Envoyé par pascal4782 Voir le message
    J'interviens probablement trop rapidement mais je pense à la solution suivante:
    tableau_avec_calcul_index(0,0) = k1
    tableau_avec_calcul_index(0,1) = K2
    tableau_avec_calcul_index(1,0) = K3
    tableau_avec_calcul_index(1,1) = k4
    C'est faux de mélanger Excel et VBA mais juste pour la compréhension :

    tableau_avec_calcul_index(0,0) --> "F1 = INDEX($I$1:$P$1;4*A1+2*B1+C1+1)"
    tableau_avec_calcul_index(0,1) --> "G1 = INDEX($I$1:$P$1;4*B1+2*C1+D1+1)"
    tableau_avec_calcul_index(1,0) --> "F2 = INDEX($I$1:$P$1;4*A2+2*B2+C2+1)"
    tableau_avec_calcul_index(1,1) --> "G2 = INDEX($I$1:$P$1;4*B2+2*C2+D2+1)"

    Bertrand

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir,

    C'est bien ce qu'il me semblait, mon intervention était trop rapide.
    J'arrive a la limite de mes compétences, ce qui me perturbe c'est l'utilisation de i et j comme variables alors qu'elles étaient utilisées pour définir le tableau-binaire. Ca encore je peux le concevoir par contre cette ligne je ne la comprends pas du tout.
    "le255" correspond au nombre de possibilité, mais après pour le 4*, 2*, cela deviens le grand mystère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau_avec_calcul_index(i, j) = tableau_un_ou_deux(255, 4 * tableau_binaire(i, j) + 2 * tableau_binaire(i, j + 1) + tableau_binaire(i, j + 2) + 1)
    Nous pouvons continuer demain, je dois m'absenter
    Merci encore pour votre patience et votre pédagogie

    "Désolé je n'avais pas rafraichi, votre reponse me permet de mieux comprendre la ligne du programme".
    Cordialement

  12. #12
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Si tu veux voir apparaître les combinaisons à l'étape 2, utilises cette macro :

    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
    62
    Sub mise_en_tableau2()
    '
    'Pour établir une série de variables qui représentent toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)
    '
     
    Dim tableau_un_ou_deux(256, 8), x As Integer
    Dim i1, i2, i3, i4, i5, i6, i7, i8 As Byte
    Dim iLigne As Long
    Dim resultat As String
     
    iLigne = 0
     
    'je boucle pour chacune des huit cellules sur la ligne entre 1 et 2
    'il faut imaginer un arbre avec 2 racines qui produisent 2 racines, qui produisent 2 racines...
    For i1 = 1 To 2
        For i2 = 1 To 2
            For i3 = 1 To 2
                For i4 = 1 To 2
                    For i5 = 1 To 2
                        For i6 = 1 To 2
                            For i7 = 1 To 2
                                For i8 = 1 To 2
                                    tableau_un_ou_deux(iLigne, 0) = i1
                                    tableau_un_ou_deux(iLigne, 1) = i2
                                    tableau_un_ou_deux(iLigne, 2) = i3
                                    tableau_un_ou_deux(iLigne, 3) = i4
                                    tableau_un_ou_deux(iLigne, 4) = i5
                                    tableau_un_ou_deux(iLigne, 5) = i6
                                    tableau_un_ou_deux(iLigne, 6) = i7
                                    tableau_un_ou_deux(iLigne, 7) = i8
     
                                    Cells(iLigne + 1, 9) = tableau_un_ou_deux(iLigne, 0)
                                    Cells(iLigne + 1, 10) = tableau_un_ou_deux(iLigne, 1)
                                    Cells(iLigne + 1, 11) = tableau_un_ou_deux(iLigne, 2)
                                    Cells(iLigne + 1, 12) = tableau_un_ou_deux(iLigne, 3)
                                    Cells(iLigne + 1, 13) = tableau_un_ou_deux(iLigne, 4)
                                    Cells(iLigne + 1, 14) = tableau_un_ou_deux(iLigne, 5)
                                    Cells(iLigne + 1, 15) = tableau_un_ou_deux(iLigne, 6)
                                    Cells(iLigne + 1, 16) = tableau_un_ou_deux(iLigne, 7)
     
                                    iLigne = iLigne + 1
                                Next i8
                            Next i7
                        Next i6
                    Next i5
                Next i4
            Next i3
        Next i2
    Next i1
     
    ' j'affiche le résultat dans un MsgBox pour vérifier si cela fonctionne
    ' l'expression vbNewLine permet de passer à la ligne
    ' ça fonctionne pour les premières lignes du tableau
    For x = 0 To 255
        resultat = resultat & vbNewLine & x + 1 & " " & _
                tableau_un_ou_deux(x, 0) & " " & tableau_un_ou_deux(x, 1) & " " & _
                tableau_un_ou_deux(x, 2) & " " & tableau_un_ou_deux(x, 3) & " " & _
                tableau_un_ou_deux(x, 4) & " " & tableau_un_ou_deux(x, 5) & " " & _
                tableau_un_ou_deux(x, 6) & " " & tableau_un_ou_deux(x, 7)
    Next
     
    End Sub
    A ta question :
    "le255" correspond au nombre de possibilité
    Non, c'est juste la référence dans ton tableau où est stocké 2 2 2 2 2 2 2 2.

    A ta question :
    après pour le 4*, 2*, cela deviens le grand mystère
    Sous VBA, le "4*A1+2*B1+C1+1" d'Excel devient "4*tableau_binaire(i,j)+2*tableau_binaire(i,j+1)+tableau_binaire(i, j+2)+1"

    Kiki29 a raison de te renvoyer vers un tuto. Le forum est là pour débugger mais pas pour enseigner. Il te faut reprendre les tutos sur les tableaux et essayer de faire par toi-même (nous sommes tous passés par là... ).

    Bertrand

    Bonjour,

    4ème et dernière étape : "Un tableau de résultat (R1:S1) qui me permet de vérifier en R1 si F1 et G1 sont pairs R1=SI(ET(EST.PAIR(F1);EST.PAIR(G1));1;0) et en S1 si F2 et G2 sont pairs S1=SI(ET(EST.PAIR(F2);EST.PAIR(G2));1;0). Si R1=1 et S1 = 1 alors je copie les variables qui ont données la bonne combinaison"

    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
    ' transcription de la formule Excel R1=SI(ET(EST.PAIR(F1);EST.PAIR(G1));1;0)
    Dim tableau_pair_ou_impair(2) As Byte
     
    ' deux cases à remplir donc on boucle sur deux indices 0 et 1
    For i = 0 To 1
        ' Variable Mod 2 permet de calculer le rompu de la division par deux (rompu = ce qu'il y a après la virgule)
        ' si pas de rompu, c'est que le chiffre est pair
        If (tableau_avec_calcul_index(i, 0) Mod 2 = 0) And (tableau_avec_calcul_index(i, 1) Mod 2 = 0) Then
            tableau_pair_ou_impair(i) = 1
        Else
            tableau_pair_ou_impair(i) = 0
        End If
    Next
     
    ' j'affiche le résultat dans un MsgBox pour vérifier si cela fonctionne
    MsgBox tableau_pair_ou_impair(0) & " " & tableau_pair_ou_impair(1)
    J'utilise "Variable Mod 2" pour déterminer si un chiffre est pair ou impair.

    Bertrand

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir ,

    @Bertrand: Il semble que ce ne soit si facile que ca de programmer en variable tableau. Le passage Excel => variable tableau reste complexe lors de la définition des formules :
    Sous VBA, le "4*A1+2*B1+C1+1" d'Excel devient "4*tableau_binaire(i,j)+2*tableau_binaire(i,j+1)+tableau_binaire(i, j+2)+1"
    et R1=SI(ET(EST.PAIR(F1);EST.PAIR(G1));1;0) devient (tableau_avec_calcul_index(i, 0) Mod 2 = 0) And (tableau_avec_calcul_index(i, 1) Mod 2 = 0)

    Votre programmation "tableau pair ou impair" je l'ai intégré sous la mise en "tableau3" et l'affichage est égal à "11"

    Il ne reste plus qu'une 5 eme étape pour terminer la formation, l'affichage des résultats.

    Cordialement

  14. #14
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Bonsoir Pascal,

    Le code complet (avec le remplissage du tableau Excel - mais sans mise en forme) :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Sub mise_en_tableau4()
     
    Dim tableau_avec_calcul_index(2, 2), tableau_un_ou_deux(256, 8), tableau_binaire(2, 4), i, j, x As Integer
    Dim i1, i2, i3, i4, i5, i6, i7, i8 As Byte
    Dim iLigne As Long
     
    ' Chargement d'un tableau Excel en tableau VBA
    ' on traite la première ligne puis la seconde
    For i = 1 To 2
        ' on traite la première colonne puis la seconde...
        For j = 1 To 4
            tableau_binaire(i - 1, j - 1) = Cells(i, j).Value
        Next
    Next
     
    ' Pour établir une série de variables qui représentent toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)
    ' je boucle pour chacune des huit cellules sur la ligne entre 1 et 2
    ' il faut imaginer un arbre avec 2 racines qui produisent 2 racines, qui produisent 2 racines...
    iLigne = 0
    For i1 = 1 To 2
        For i2 = 1 To 2
            For i3 = 1 To 2
                For i4 = 1 To 2
                    For i5 = 1 To 2
                        For i6 = 1 To 2
                            For i7 = 1 To 2
                                For i8 = 1 To 2
                                    tableau_un_ou_deux(iLigne, 0) = i1
                                    tableau_un_ou_deux(iLigne, 1) = i2
                                    tableau_un_ou_deux(iLigne, 2) = i3
                                    tableau_un_ou_deux(iLigne, 3) = i4
                                    tableau_un_ou_deux(iLigne, 4) = i5
                                    tableau_un_ou_deux(iLigne, 5) = i6
                                    tableau_un_ou_deux(iLigne, 6) = i7
                                    tableau_un_ou_deux(iLigne, 7) = i8
     
                                    Cells(iLigne + 1, 9).Value = tableau_un_ou_deux(iLigne, 0)
                                    Cells(iLigne + 1, 10).Value = tableau_un_ou_deux(iLigne, 1)
                                    Cells(iLigne + 1, 11).Value = tableau_un_ou_deux(iLigne, 2)
                                    Cells(iLigne + 1, 12).Value = tableau_un_ou_deux(iLigne, 3)
                                    Cells(iLigne + 1, 13).Value = tableau_un_ou_deux(iLigne, 4)
                                    Cells(iLigne + 1, 14).Value = tableau_un_ou_deux(iLigne, 5)
                                    Cells(iLigne + 1, 15).Value = tableau_un_ou_deux(iLigne, 6)
                                    Cells(iLigne + 1, 16).Value = tableau_un_ou_deux(iLigne, 7)
     
                                    iLigne = iLigne + 1
                                Next i8
                            Next i7
                        Next i6
                    Next i5
                Next i4
            Next i3
        Next i2
    Next i1
     
    ' Anciennement le calcul de l'index
    For i = 0 To 1
        For j = 0 To 1
            tableau_avec_calcul_index(i, j) = tableau_un_ou_deux(255, 4 * tableau_binaire(i, j) + 2 * tableau_binaire(i, j + 1) + tableau_binaire(i, j + 2) + 1)
            Cells(1 + i, 6 + j).Value = tableau_avec_calcul_index(i, j)
        Next
    Next
     
     
    ' transcription de la formule Excel R1=SI(ET(EST.PAIR(F1);EST.PAIR(G1));1;0)
    Dim tableau_pair_ou_impair(2) As Byte
     
    ' deux cases à remplir donc on boucle sur deux indices 0 et 1
    For i = 0 To 1
     
        ' Variable Mod 2 permet de calculer le rompu de la division par deux (rompu = ce qu'il y a après la virgule)
        ' si pas de rompu, c'est que le chiffre est pair
        If (tableau_avec_calcul_index(i, 0) Mod 2 = 0) And (tableau_avec_calcul_index(i, 1) Mod 2 = 0) Then
            tableau_pair_ou_impair(i) = 1
     
        Else
            tableau_pair_ou_impair(i) = 0
     
        End If
        Cells(1, 18 + i).Value = tableau_pair_ou_impair(i)
     
    Next
     
    End Sub
    Bertrand

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir,

    @Bertrand. Désolé mais le code ne génère que l'affichage des 256 combinaisons; en mode pas à pas on constate réellement l'affichage de toutes les combinaisons sans faire les autres calculs (hypothèse car pas d'affichage en mode pas à pas).

    Cordialement

  16. #16
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Re-Bonsoir,

    Non non, VBA fait bien les calculs --> Excel ne fait apparaître que les résultats (et non plus des formules).

    Utilises le fichier joint et appuies sur le bouton "Lance" (et observes).
    Effaces tes résultats et relances si nécessaire.

    Bertrand

    PS : A moins que tu ne veuilles un "calcul pair ou impair" sur les 256 lignes ? ...
    Fichiers attachés Fichiers attachés

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir Bertrand,

    Désolé d'insister mais mon programme initial ne donne que 16 cas respectant les conditions, alors qu'en variable tableau il affiche les 256 combinaisons possibles et non les bonnes réponses.
    Pour comparer, test mon petit programme.

    Cordialement

  18. #18
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Qu'appelles tu les "16 cas respectant les conditions" ?

    As tu essayé le fichier joint sur mon dernier post ?

    Bertrand

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir bertrand,

    Il est évident que j'ai testé, et le programme et le dernier que vous avez mis a disposition et dans les 2 cas s'affiche les 256 combinaisons possibles.

    J'entends par les 16 cas respectant les conditions la combinaison des 8 variables permettant d'obtenir R1 et S1 = 1 c'est à dire F1, G1, F2 et G2 sont pairs.

    Si vous prenez le 1 cas affiché du programme variable tableau (1 1 1 1 1 1 1 1), alors F1=1, G1=1, F2=1 et G2=1 par conséquence R1 = 0 et S1 =0

    Maintenant vous sélectionnez dans le tableau avec les formules (1 1 2 2 1 2 2 1), alors F1=2, G1=2, F2=2 et enfin G2=2 par conséquence R1=1 et S1=1 ce qui implique que cette combinaison respecte les conditions.
    J'espère avoir répondu.

    Cordialement

  20. #20
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Re,

    F1, G1, F2, G2, R1 et S1 sont dans ton premier fichier des formules Excel et n'ont jamais été des conditions pour réduire tes combinaisons... C'est d'ailleurs la seule combinaison 2 2 2 2 2 2 2 2 qui a servi à leur calcul.
    Peut-être que j'avais mal compris.

    Maintenant le problème est différent : tu as 256 possibilités et tu veux en réduire le choix avec des critères :
    - calculer une sorte de F1, G1, F2, G2 pour chacune des combinaisons
    - si ces 4 valeurs calculées sont paires --> retenir la combinaison

    C'est bien cela ?

    Bertrand

    Re,

    Pour réduire ton choix (sur la base de mon précédent post), je fais apparaître les 16 combinaisons trouvées dans un petit tableau en plage AD1:AK16.

    Voilà 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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    Sub mise_en_tableau4()
     
    Dim tableau_avec_calcul_index(256, 2, 2), tableau_un_ou_deux(256, 8), tableau_binaire(2, 4), i, j, x As Integer
    Dim i1, i2, i3, i4, i5, i6, i7, i8 As Byte
    Dim iLigne As Long
     
    ' Chargement d'un tableau Excel en tableau VBA
    ' on traite la première ligne puis la seconde
    For i = 1 To 2
        ' on traite la première colonne puis la seconde...
        For j = 1 To 4
            tableau_binaire(i - 1, j - 1) = Cells(i, j).Value
        Next
    Next
     
    ' Pour établir une série de variables qui représentent toutes les combinaisons de 1 à 2 (soit 2^8=256 combinaisons possibles)
    ' je boucle pour chacune des huit cellules sur la ligne entre 1 et 2
    ' il faut imaginer un arbre avec 2 racines qui produisent 2 racines, qui produisent 2 racines...
    iLigne = 0
    For i1 = 1 To 2
        For i2 = 1 To 2
            For i3 = 1 To 2
                For i4 = 1 To 2
                    For i5 = 1 To 2
                        For i6 = 1 To 2
                            For i7 = 1 To 2
                                For i8 = 1 To 2
                                    tableau_un_ou_deux(iLigne, 0) = i1
                                    tableau_un_ou_deux(iLigne, 1) = i2
                                    tableau_un_ou_deux(iLigne, 2) = i3
                                    tableau_un_ou_deux(iLigne, 3) = i4
                                    tableau_un_ou_deux(iLigne, 4) = i5
                                    tableau_un_ou_deux(iLigne, 5) = i6
                                    tableau_un_ou_deux(iLigne, 6) = i7
                                    tableau_un_ou_deux(iLigne, 7) = i8
                                    Cells(iLigne + 1, 9) = tableau_un_ou_deux(iLigne, 0)
                                    Cells(iLigne + 1, 10) = tableau_un_ou_deux(iLigne, 1)
                                    Cells(iLigne + 1, 11) = tableau_un_ou_deux(iLigne, 2)
                                    Cells(iLigne + 1, 12) = tableau_un_ou_deux(iLigne, 3)
                                    Cells(iLigne + 1, 13) = tableau_un_ou_deux(iLigne, 4)
                                    Cells(iLigne + 1, 14) = tableau_un_ou_deux(iLigne, 5)
                                    Cells(iLigne + 1, 15) = tableau_un_ou_deux(iLigne, 6)
                                    Cells(iLigne + 1, 16) = tableau_un_ou_deux(iLigne, 7)
     
                                    iLigne = iLigne + 1
                                Next i8
                            Next i7
                        Next i6
                    Next i5
                Next i4
            Next i3
        Next i2
    Next i1
     
    ' Anciennement le calcul de l'index
    For x = 0 To 255
        For i = 0 To 1
            For j = 0 To 1
                tableau_avec_calcul_index(x, i, j) = tableau_un_ou_deux(x, 4 * tableau_binaire(i, j) + 2 * tableau_binaire(i, j + 1) + tableau_binaire(i, j + 2) + 1)
            Next
        Next
    Next
     
    ' transcription de la formule Excel R1=SI(ET(EST.PAIR(F1);EST.PAIR(G1));1;0)
    Dim tableau_pair_ou_impair(256, 2) As Byte
    Dim numligne As Integer
     
     
    numligne = 1
    For x = 0 To 255
        ' deux cases à remplir donc on boucle sur deux indices 0 et 1
        For i = 0 To 1
     
        ' Variable Mod 2 permet de calculer le rompu de la division par deux (rompu = ce qu'il y a après la virgule)
        ' si pas de rompu, c'est que le chiffre est pair
        If (tableau_avec_calcul_index(x, i, 0) Mod 2 = 0) And (tableau_avec_calcul_index(x, i, 1) Mod 2 = 0) Then
            tableau_pair_ou_impair(x, i) = 1
     
        Else
            tableau_pair_ou_impair(x, i) = 0
     
        End If
        Cells(x + 1, 18 + i).Value = tableau_pair_ou_impair(x, i)
     
        If i = 1 And tableau_pair_ou_impair(x, 0) = 1 And tableau_pair_ou_impair(x, 1) = 1 Then
                                    Cells(numligne, 30).Value = tableau_un_ou_deux(x, 0)
                                    Cells(numligne, 31).Value = tableau_un_ou_deux(x, 1)
                                    Cells(numligne, 32).Value = tableau_un_ou_deux(x, 2)
                                    Cells(numligne, 33).Value = tableau_un_ou_deux(x, 3)
                                    Cells(numligne, 34).Value = tableau_un_ou_deux(x, 4)
                                    Cells(numligne, 35).Value = tableau_un_ou_deux(x, 5)
                                    Cells(numligne, 36).Value = tableau_un_ou_deux(x, 6)
                                    Cells(numligne, 37).Value = tableau_un_ou_deux(x, 7)
                                    numligne = numligne + 1
        End If
        Next
    Next
     
    End Sub
    Est-ce ok ?

    Bertrand

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Programme de variables tableau
    Par Wilvart dans le forum C++
    Réponses: 3
    Dernier message: 24/04/2006, 21h30
  2. [Tableaux] récuperer une variable tableau passé par URL
    Par molesqualeux dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2005, 01h12
  3. variables tableau dans requettes mysql ... et affichage
    Par mulbek dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/10/2005, 16h29
  4. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30
  5. Acces à une variable-tableau de PHP
    Par Erwan21 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/02/2005, 13h55

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