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 :

Remplir une matrice à partir de formulaires complétés [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Coordonnatrice services d'éditique
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Coordonnatrice services d'éditique
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Remplir une matrice à partir de formulaires complétés
    Bonjour

    Après plusieurs heures de tâtonnements, je fais appel à vous! J'ai tenté d'écrire un code VBA pour accomplir la tâche souhaitée mais comme je suis débutante, j'aurais besoin d'un coup de main.

    Voici mon ébauche de 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
    Option Explicit
     
    Sub FillMatrix()
     
    Dim r As Range
    Dim DestRow As String
    Dim Matrice As Worksheet
    Set Matrice = Worksheet("!MatriceTest")
    Dim ReportCards As Workbook
    Set ReportCards = Workbook("!ReportCards")
     
    For Each Sheet In ReportCards
        ActiveSheet.Name=DestRow .Value
            If DestRow .Value <> "" Then
                Search for DestRow in A2 until end of A
                Active Range = r
                ReportCards.Range("B5") = Matrice.Range("B" & r.Row)
                ReportCards.Range("D7") = Matrice.Range("E" & r.Row)
                If ReportCards.Range("A12").Value <> "" Then
                ReportCards.Range("A12")= Concatenate ReportCards.Range("A12") & Matrice.Range("F" & r.Row)
                Else
                ReportCards.Range("A12") = Matrice.Range("F" & r.Row)
    			End If
    		End If
    Next Sheet
     
    End Sub
    J'ai créé deux petits fichiers bidons pour tester ma solution (la matrice et le classeur de Report Cards) et j'ai mis mon code dans un module dans le classeur de Report Cards. Sauf que ça bogue déjà à la 4ième ligne

    Merci

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

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Je ne sais pas où tu as récupérer ce code mais je pense qu'il serait préférable que tu explique ce que tu souhaite faire car tu utilise en partie un language qui n'est pas du VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Search for DestRow in A2 until end of A
    La variable "DestRow" n'est pas initialisée donc ça plante illico arrivé à cette ligne. Et ou est l'intérêt de renommer la feuille active à chaque passage de la boucle ?

    Hervé.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    L'acte le plus important n'est pas de coder mais de savoir ce que l'on veut faire, penser l'algorithme en français puis coder.
    Avec l'expérience le code se fait direct....
    Je rejoins donc Theze sur sa demande d'explication car le code, même entre les lignes ne rime à rien

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Coordonnatrice services d'éditique
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Coordonnatrice services d'éditique
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Explication
    J'ai un classeur qui contient plusieurs onglets (ex: T21, T22, T31, etc), chacun d'eux correspond à une matrice de tests sur un module (pas un module de vba, un module du logiciel testé au bureau) dans laquelle chaque ligne correspond à un test UAT pour le module en question. Chaque colonne correspond à des informations qui servent à générer des fiches test (remplir les champs d'instruction et étiquettes de champs) ou à en récupérer les valeurs (lorsque les cellules ont été remplies par les usagers). Ex de colonnes: Statut, Code Test(D), Code Activité(E), Code Cas(F), Code variant(G), Activité, Titre de la tâche, variants, objectif, Description de la tâche, Instructions spécifiques, Note du/au concepteur, Résultat.

    J'ai plusieurs classeurs qui correspondent à des lots de tests. Ex. Le classeur T22001-T22010 contient une trentaine d'onglets. Chaque onglet (feuille de calcul) correspond à une ligne de la matrice T22, soit une fiche test. Les fiches tests ont été générées à partir des champs d'instructions de la matrice à l'aide d'une macro. La macro copiait une feuille "Modèle de Fiche TAU" à la fin du classeur et utilisait la valeur de la colonne AR de la matrice pour renommer chaque fiche test générée. Je déplaçais ensuite les lots de fiches tests dans des classeurs distincts.

    Les usagers ont réalisé les tests UAT et écrit leurs observations et résultats sur les fiches tests.

    Il s'agit maintenant de récupérer les valeurs des fiches test (chaque feuille d'un classeur) et de les insérer au bon endroit dans la matrice.

    Contingences:
    • La colonne AR (Nom du test) contient une formule qui concatene en texte les valeurs des colonnes DEFG pour constituer le nom du test.
    • Certaines colonnes d'instruction ont continué d'être renseignées après l'émission des tests, par exemple O (Note du/au concepteur), et doivent conserver les instructions présentes dans la matrice tout en y aggrégeant les précisions ajoutées par les usagers.


    Dans le code que j'ai essayé d'écrire moi-même (après en avoir regardé des dizaines qui ne faisaient pas ce dont j'ai besoin) je n'essayais pas de renommer la feuille active mais plutôt d'affecter le nom de la feuille active (qui est une clé unique) à la variable DestRow afin d'utiliser ce nom comme string à chercher dans la colonne AR de la matrice afin de pouvoir établir la valeur de r (no de ligne) pour pouvoir en faire mon Range et l'utiliser dans la référence des cellules de la feuille matrice (dans classeur MatriceTest) vers où copier les valeurs tirée de la feuille fiche test (dans classeur ReportCards).

    Comme les documents originaux ont beaucoup de champs et sont confidentiel (boulot) et que je voulais d'abord me pratiquer sur des classeurs simples, j'ai créé deux classeurs bidons qui reprennent l'essentiel des contingences pour tester ma macro.
    (si vous avez besoin de voir je l'ai mis dans skydrive: http://sdrv.ms/17iDR5L )

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

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Je rejoins tout à fait ELikero ! Une explication claire et nette serait préférable car je n'ai rien compris à tes "explications". Je sais que ce n'est pas évident d'arriver à faire comprendre à d'autres même si on sait parfaitement se qu'on souhaite. Donc, tu veux récupérer les valeurs de quelles cellules de quels classeurs pour les mettre dans quelles cellules de quel classeur (je suppose un classeur de synthèse) ?

    Hervé.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Coordonnatrice services d'éditique
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Coordonnatrice services d'éditique
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bon, je réessaie!

    ClasseurA = Matrice



    ClasseurB = FicheTest



    Chaque ligne du ClasseurA correspond à une feuille du ClasseurB. Le nom de cette feuille est un identificateur unique.

    Quand j'active la macro à partir de n'importe quelle feuille du ClasseurB, je veux d'abord qu'elle me demande si je veux seulement exporter le contenu de la feuille active ou tout le classeur.
    (If) Si la réponse est la feuille active seulement, elle effectuera la routine suivante:
    1. Lire le nom de la feuille active et rechercher ce nom (String) dans le ClasseurA, dans la colonne AR plus précisément. Tenir compte que les cellules de la colonne AR contiennent une formule et que ce que la macro doit chercher c'est la valeur affichée, pas la formule, pour trouver la string correspondante.
    2. La macro lira le numéro de la ligne sur laquelle elle a trouvé la string et affecte ce nombre à une variable disons r.
    3. La macro prend dans le ClasseurB la valeur de la cellule B5 et elle REMPLACE, dans le ClasseurA, le contenu de la cellule H&r
    4. La macro prend dans le ClasseurB la valeur de la cellule B6 et elle REMPLACE, dans le ClasseurA, le contenu de la cellule I&r
    5. La macro prend dans le ClasseurB la valeur de la cellule B13et elle L'AJOUTE, dans le ClasseurA, au contenu de la cellule O&r



    (Else) Si la réponse est tout le classeur, elle activera la première feuille du classeur et pour toutes les feuilles (Loop) dont le nom commence par un T, elle effectuera la routine décrite précédemment.

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Coordonnatrice services d'éditique
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Coordonnatrice services d'éditique
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Du code...
    Bonjour

    j'ai continué à travailler sur ce projet et créé un userform avec 3 boutons de commande (Une seule, Toutes les feuilles, Annuler)

    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
    Sub exporterUne()
     
    Dim TargetMxB As Excel.Workbook
    Set TargetMxB = Workbooks.Open("P:\Service aux usagers\Équipe_AWA\Conception\Forumation\Matrices.xlsm")
    Dim TargetMxS As Worksheet
    Set TargetMxS = TargetMxB("Mx1_bio")
    Dim SourceSht As String
    Dim uID As Range
    Dim r As Range
    Dim lastRow As Range
     
    Application.ScreenUpdating = False
    '
    '// Attribuer le nom de la feuille source à une variable pour l'utiliser comme unique ID et string de recherche
    If Left(ActiveSheet.Name, 1) = "T" Then
        SourceSht = ActiveSheet.Name
    '
    '// Trouver la dernière rangée dans Target Sheet
        Sheets(TargetMxS).Cells(1, 1).Activate
        ActiveCell.SpecialCells(xlLastCell).Select
        lastRow = ActiveCell.Row
    '
    '// Chercher l'identificateur unique dans la matrice et affecter son adresse (ligne) à une variable
        uID = TargetMxS.Range("AR3:AR" & lastRow).Find(What:=SourceSht, After:=[AR3], LookIn:=xlValues)
            If Not uID Is Nothing Then
            r = uID.Row
            Else
    '// Si uID n'est pas trouvé, créer une nouvelle ligne après la dernière.
            Set r = lastRow + 1
            End If
    '
    '// Exporter les valeurs de la feuille Source vers la feuille Target; j'avais essayé de réutiliser le nom emmagasiné en string dans SourceSht comme référence mais ça boguait alors j'ai mis ThisWorkbook en me croisant les doigts.
    '
     
        TargetMxS.Range("C" & r) = ThisWorkbook.ActiveSheet.Range("B5")
    '
    Application.ScreenUpdating = True
    Else: End If
    End Sub
    J'ai compilé et ça ne me retourne pas d'erreur, ça me demande si je veux réouvrir Matrices.xlsm quand ce classeur est déjà ouvert, ça l'ouvre s'il est fermé, mais après je ne vois rien se produire et les données de Source n'arrivent pas dans Target.

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Coordonnatrice services d'éditique
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Coordonnatrice services d'éditique
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Grâce à quelques commentaires reçus, j'ai fait quelques modifications et voici le code final qui fait exactement ce dont j'ai besoin. Je suis drôlement fière parce que c'est la première fois que j'écris une macro à partir de rien. Je vais maintenant m'attaquer à la macro récursive (toutes les feuilles).
    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
    Option Explicit
     
    Sub exporterUne()
    Dim TargetMxS As Worksheet
    Dim SourceSht As String
    Dim uID As Range
    Dim L As Long                                        
    Dim lastRow As Long                                        
    Dim oContent As String
     
    Set TargetMxS = Workbooks("Matrices.xlsm").Worksheets("Mx1_bio")          
     worksheets
    Application.ScreenUpdating = False
     
    '// Assigning name of source sheet to variable to be used as unique ID and search string
     
    ThisWorkbook.Activate
        If Left(ActiveSheet.Name, 1) = "T" Then
        SourceSht = ActiveSheet.Name
     
    '// Removing protection from Source sheet
     
    ThisWorkbook.ActiveSheet.Unprotect Chr(00) & Chr(00) & Chr(00) & Chr(00)
     
    '// Finding last row in Target Sheet
    TargetMxS.Activate
        TargetMxS.Cells(1, 1).Activate
        ActiveCell.SpecialCells(xlLastCell).Select
        lastRow = ActiveCell.Row
     
     
    '// Searching for the unique identifier in the matrix and assigning its address (row) to variable
        Set uID = TargetMxS.Range("AR3:AR" & lastRow).Find(What:=SourceSht, _
                  After:=[AR3], LookIn:=xlValues)
            If Not uID Is Nothing Then
            L = uID.Row
            Else
    '// If uID is not found, the following will create a new row below the last one
            L = lastRow + 1
            End If
     
    '// Exporting values from Source Sheet to Target Sheet replacing content of cell
        TargetMxS.Range("C" & L) = ThisWorkbook.ActiveSheet.Range("B5")
    '// Exporting values from Source Sheet to Target Sheet aggregating content to cell
        oContent = TargetMxS.Range("H" & L)
        TargetMxS.Range("H" & L) = oContent & ThisWorkbook.ActiveSheet.Range("B5")
     
    End If
    Application.ScreenUpdating = True
    End Sub


  9. #9
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Je suis drôlement fière parce que c'est la première fois que j'écris une macro à partir de rien
    Je te félicite, maintenant apprends à mettre les balises code en sélectionnant ton code et en appuyant sur # au-dessus de ton message, penses également à Cliquer sur en dessous du message.

    Bonne soirée

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

Discussions similaires

  1. remplir une base à partir un formulaire
    Par hadil dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/04/2009, 19h42
  2. Remplir une matrice à partir d'un vecteur (Suite)
    Par amarion dans le forum MATLAB
    Réponses: 5
    Dernier message: 17/03/2008, 08h23
  3. Remplir une matrice à partir d'un vecteur
    Par amarion dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/03/2008, 12h17
  4. [Formulaire]Remplir une table à partir d'un formulaire
    Par mystikgirl30 dans le forum IHM
    Réponses: 5
    Dernier message: 13/04/2007, 11h38
  5. [C#/SqlServer 2005] Comment remplir une DB à partir d'un formulaire ?
    Par Clarissa2006 dans le forum Windows Forms
    Réponses: 20
    Dernier message: 22/06/2006, 16h10

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