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 :

Macro VBA - Table de vérité [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Debutant VBA
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Debutant VBA

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Par défaut Macro VBA - Table de vérité
    Bonjour

    Je recherche de l'aide pour une Macro VBA.
    Je suis actuellement en auto-formation vba depuis 2 jours ( je suis donc débutant ), et je me suis donné comme challenge de créer une table de vérité.

    le fonctionnement :
    - On rentre le nombre de vecteur d'entré et celui des sorties
    - On rentre dans un tableau le nom des vecteurs d'entrées et le nom des vecteurs de sorties
    ( Je suis à ce niveau là du programme )

    (Résultat)

    Vecteur_E1 Vecteur_E2 Vecteur_S1
    0 0 VIDE
    0 1 VIDE
    1 0 VIDE
    1 1 VIDE

    Ce que je recherche actuellement c'est une manière de créer des conditions directement sur la page excel pour que ça me renvoie le résultat de la sortie.
    (exemple : Vecteur_E1 & Vecteur_E2 -> Vecteur_S1 = True / Vecteur_E1 Or Vecteur_E2 -> Vecteur_S1 = True

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    Sub GenerationTableVerite()
     
    ' rentrer le nombre de var e en B3, le nombre var s D3, les noms var e en B6 -> B22, les noms var s en D6 -> D22
     
        ' Indice par défaut
        Dim i As Long
        ' nombre de variable en sortie ( b3 )
        Dim MaxVarETab As Long
        ' Indice qui gère le nombre de variable en sortie ( d3 )
        Dim MaxVarSTab As Long
        '
        Dim iLesLignes As Long
        '
        Dim iUneLigne As Long
        '
        Dim VarE As Long
        '
        Dim iDepart As Long
        ' Indice de début de génération des variables de sortie, elles suivent la fin de génération des variables d'entrées
        Dim DebutVarS As String
        '
        Dim iEtat As String
     
        MaxVarETab = Range("B3").Cells.Value
     
        MaxVarSTab = Range("D3").Cells.Value
     
        ' Suppression lignes
        Range("F2", Range("Z2").End(xlDown)).Rows.Clear
     
        ' bloque l'affichage
        Application.ScreenUpdating = False
     
        Range("F2").Cells.Value = Range("B6").Cells.Value
     
        ' Récupère le noms des variables entrantes du tableau de la colonne B et les écrits
        For j = 0 To MaxVarETab - 2
            Range("G2").End(xlToLeft).Offset(0, 1 + j).Cells.Value = Range("B" & 7 + j, "B22").Cells.Value
        Next
     
        ' Gère ecriture varS
        If MaxVarETab = 1 Then
                DebutVarS = "G2"
                End If
            If MaxVarETab = 2 Then
                DebutVarS = "G2"
                End If
            If MaxVarETab = 3 Then
                DebutVarS = "H2"
                End If
            If MaxVarETab = 4 Then
                DebutVarS = "I2"
                End If
            If MaxVarETab = 5 Then
                DebutVarS = "J2"
                End If
            If MaxVarETab = 6 Then
                DebutVarS = "K2"
                End If
            If MaxVarETab = 7 Then
                DebutVarS = "L2"
                End If
            If MaxVarETab = 8 Then
                DebutVarS = "M2"
                End If
            If MaxVarETab = 9 Then
                DebutVarS = "N2"
                End If
            If MaxVarETab = 10 Then
                DebutVarS = "O2"
                End If
            If MaxVarETab = 11 Then
                DebutVarS = "P2"
                End If
            If MaxVarETab = 12 Then
                DebutVarS = "Q2"
                End If
            If MaxVarETab = 13 Then
                DebutVarS = "R2"
                End If
            If MaxVarETab = 14 Then
                DebutVarS = "S2"
                End If
            If MaxVarETab = 15 Then
                DebutVarS = "T2"
                End If
            If MaxVarETab = 16 Then
                DebutVarS = "U2"
                End If
            If MaxVarETab = 17 Then
                DebutVarS = "V2"
                End If
     
        ' Récupère le noms des variables de sortie du tableau de la colonne L
        For j = 0 To MaxVarSTab - 1
            Range(DebutVarS).End(xlToLeft).Offset(0, MaxVarETab + j).Cells.Value = Range("D" & 6 + j, "D22").Cells.Value
        Next
     
        ' Sortie procédure si le nombre de variable d'entrée vaut 0
        If MaxVarETab = 0 Then Exit Sub
     
        ' Indice de départ du tableau de Karnaugh
        iDepart = MaxVarETab + 5
        ' Nombre total de ligne du tableau selon les variables d'entrées
        iLesLignes = (2 ^ MaxVarETab) - 1
        ' Nombre total de variable d'entrée
        MaxVarETab = MaxVarETab - 1
     
        ' Boucle de parcours des lignes selon le nombre total de 2 ^ variables entrées
        For iUneLigne = 0 To iLesLignes
            ' Boucle de génération des 0 et des 1 selon le nombre de variable d'entrée
            For VarE = 0 To MaxVarETab
                If (iUneLigne And (2 ^ VarE)) > 0 Then
                    iEtat = "1"
                Else
                    iEtat = "0"
                End If
                ' écriture des 0 et des 1
                Feuil1.Cells(iUneLigne + 2 + 1, iDepart - VarE) = iEtat
            Next VarE
        Next iUneLigne
     
        ' Modification du style d'écriture
        With Range("F3", "Z900000")
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        End With
     
        ' active l'affichage
        Application.ScreenUpdating = True
     
        ' Message box indiquant si ça s'est bien passé
        MsgBox "Génération terminée"
     
    End Sub
    Auriez-vous des indications sur ce sujet ?

    J'espère avoir été clair, et je reste présent dès que je le peux pour répondre.
    Je vais continuer de chercher de mon coté.

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour,

    je n'ai pas le temps de tout regarder en détail, mais pour t'encourager voici un exemple de simplification.
    (je ne dit pas que c'est la solution parfaitement adapté, mais c'est pour te montrer l’intérêt de la décomposition des taches par des fonctions ou autre sub-routine (Sub dans le code)

    donc la partie :

    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
    ' Gère ecriture varS
    If MaxVarETab = 1 Then
    DebutVarS = "G2"
    End If
    If MaxVarETab = 2 Then
    DebutVarS = "G2"
    End If
    If MaxVarETab = 3 Then
    DebutVarS = "H2"
    End If
    If MaxVarETab = 4 Then
    DebutVarS = "I2"
    End If
    If MaxVarETab = 5 Then
    DebutVarS = "J2"
    End If
    If MaxVarETab = 6 Then
    DebutVarS = "K2"
    End If
    If MaxVarETab = 7 Then
    DebutVarS = "L2"
    End If
    If MaxVarETab = 8 Then
    DebutVarS = "M2"
    End If
    If MaxVarETab = 9 Then
    DebutVarS = "N2"
    End If
    If MaxVarETab = 10 Then
    DebutVarS = "O2"
    End If
    If MaxVarETab = 11 Then
    DebutVarS = "P2"
    End If
    If MaxVarETab = 12 Then
    DebutVarS = "Q2"
    End If
    If MaxVarETab = 13 Then
    DebutVarS = "R2"
    End If
    If MaxVarETab = 14 Then
    DebutVarS = "S2"
    End If
    If MaxVarETab = 15 Then
    DebutVarS = "T2"
    End If
    If MaxVarETab = 16 Then
    DebutVarS = "U2"
    End If
    If MaxVarETab = 17 Then
    DebutVarS = "V2"
    End If
    Pourrait être réécrite comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub demo()
        Dim DebutVarS As String, MaxVarETab As Long
        MaxVarETab = 8 'pour la demo 
        DebutVarS = QuelleColonne(MaxVarETab) & 2 ' 2 pour la ligne
        MsgBox DebutVarS
    End Sub
    Function QuelleColonne(ByVal MaxVarETab As Long) As String
        Dim MaColListe As Variant ' dimensionnée à variant pour permettre à cette variable de recevoir un tableau
        MaColListe = Array("G", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V")
        QuelleColonne = MaColListe(MaxVarETab - 1) ' -1 car le premier index du tableau est 0 donc 0->G, 1->G, 2->H etc
    End Function
    ah et aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Range("F2").Cells.Value = Range("B6").Cells.Value ' ici cells ne sert à rien l'object range se suffit à lui même
     
    Range("F2").Value = Range("B6").Value

    Code "safe !"

    Philippe

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Aller une deuxième méthode pour le fun :

    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
    Sub demo2()
        MaxVarETab = 3
        DebutVarS = QuelleColonne(MaxVarETab, "G") & 2 ' 2 pour la ligne
        MsgBox DebutVarS
    End Sub
     
    Function QuelleColonne(ByVal MaxVarETab As Long, PremiereColonne As String) As String
     
        Dim PremiereColonneIndex As Long
        PremiereColonneIndex = Columns(PremiereColonne).Column
        Select Case MaxVarETab
            Case 1, 2
                QuelleColonne = PremiereColonne
            Case 3 To 17
                ' sur la ligne suivante Address(True, False) renvera par exemple si on est en colonne "AC" et ligne "1" une chaine "AC$1"
                ' le split permet de decouper la chaine en plusieurs partie sur la base du caractere delimiteur definit. Ici j'utilise comme delimiteur "$". split renvois alors une matrice(tableau)
                QuelleColonne = Split(Cells(1, PremiereColonneIndex + MaxVarETab - 2).Address(True, False), "$")(0) ' 0 car le premier index du tableau renvoyé est 0
        End Select
     
    End Function
    Philippe

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Debutant VBA
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Debutant VBA

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Par défaut
    Merci pour ces précieux conseils !

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 114
    Par défaut
    Salut

    Si tu débutes, tu devrais prendre d'emblée les "bonnes" (du moins à mon avis) habitudes et qui seraient à minima:
    • l'utilisation d'un tableau structuré au sein d'excel (faire une recherche Pierre Fauconnier tableaux structurés sur ton moteur de recherche préféré).
    • Attention a préciser à chaque fois la feuille sur laquelle tu travailles. Tu le fais ici
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      Feuil1.Cells(iUneLigne + 2 + 1
      Mais nul part ailleurs alors qu'à mon sens c'est primordial.


    Sur le principe en lui même, le binaire n'est qu'une représentation d'un nombre (ou l'inverse...). Enfin ce que je veux dire c'est que
    00 -> 0
    01 -> 1
    10 -> 2
    11 -> 3

    Est-ce qu'il ne serait pas plus simple de dire que
    0 -> État Vecteur sortie 1, 2 , 3, ...
    1 -> État Vecteur sortie 1, 2 , 3, ...
    ...

    Mais je n'ai pas trop compris comment tu déterminais tes états de sortie.
    En fonction de tes états d'entrée ok vu que c'est une table booléenne (tableau de karnaugh si mes souvenirs de BEP electrotech sont encore là)
    Ou alors c'est l'inverse, tu donnes dans ton tableau la table de vérité remplie et pour des valeurs d'états d'entrées, tu veux retournées les états de sortie correspondants.
    (Dans les deux cas ce que j'ai dis au dessus me semble valable)

    En relisant ton code... Tu veux créer le tableau en fait pour qu'ensuite l'utilisateur saisisse les états de sortie?
    Alors je dirais qu'il faut
    • créer les entêtes
    • créer à partir des entêtes le tableau strcturé
    • ajouter les lignes au tableau structuré soit via des formules soit à partir du code VBA
      • Tu peux utiliser le principe du 0 = 00, 1 = 01, 2=10,... si tu as 5 colonnes d'entrées, ça te fait 32 possibilité. Tu devras donc boucler de 0 à 31 et utiliser la représentation binaire du nombre pour déterminer les valeurs à saisir dans les case
        Par exemple 12 -> 01100
        entrée 1 = "0"
        Entrée 2 = "1"
        Entrée 3 = "1"
        Entrée 4 = "0"
        ....



    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Debutant VBA
    Inscrit en
    Mai 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Debutant VBA

    Informations forums :
    Inscription : Mai 2022
    Messages : 4
    Par défaut
    Pour déterminer mes états de sortie, je voudrais rajouter dans une colonne la conditions qui correspond à la validation de la sortie

    exemple :

    "Insérer la valeur correspondante à la validation de la sortie"
    1 & 0 OU 10

    Ce qui veut dire qui si Vecteur_E1 = 1 et Vecteur_E2 = 0 alors Vecteur_S1 = 1

    du coup dans la colonne H (vu qu'il n'y a que deux vecteurs d'entrés soit colonne F et G) un 1 s'affiche à coté de la ligne correspondante à 1 / 0.

    exemple résultat :

    Vecteur_E1 Vecteur_E2 Vecteur_S1
    0 0 0
    0 1 0
    1 0 1
    1 1 0

    Merci pour l'aide apportée.

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

Discussions similaires

  1. [AC-2010] Gestion des macros de table par VBA
    Par Depite dans le forum Access
    Réponses: 5
    Dernier message: 30/03/2018, 15h15
  2. Réponses: 8
    Dernier message: 16/07/2008, 09h08
  3. Modifier la structure d'une table par macro / vba
    Par zermatt dans le forum Access
    Réponses: 8
    Dernier message: 21/01/2007, 15h32
  4. Macro VBA sur Access
    Par beurnoir dans le forum Access
    Réponses: 3
    Dernier message: 12/10/2005, 16h46
  5. [SQL][MACRO VBA]Pb de syntaxe
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/08/2004, 09h11

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