Macro VBA Excel

Bonjour,

Pour mon examen de fin d'année , je dois réalisé un tableau exel avec une macro, mais au vu de mes compétences exel, cela fais 4 jours que j'essaie mais je n'arrive pas à la faire . Pouvez vous m'aidez s'il vous plaît . Voici les instructions du professeur et ses "astuces ". Merci d'avance .

Prévoir une macro programmée en VBA:

Cette macro, intitulée «miseAJourProcedure», a pour mission, comme son nom l’indique de mettre à jour une procédure(de changer de version, en l’incrémentant de 1). Cela implique que la ligne correspondante de la procédure doit être copiée (en valeur) et collée dans la nouvelle feuille 3, intitulée «Archives», dans la première ligne disponible.Ensuite, dans la feuille 2, la version doit être incrémentée de 1, et la formule permettant de sélectionner les personnesqui doivent suivre cette formation doit être à nouveau collée sur l’ensemble de la ligne de la procédure (afin de réinitialiser les valeurs, vu qu’il s’agit d’une nouvelle procédure).a.Astuce pour le VBA:

i.Demander à l’utilisateur quelle procédure il désire mettre à jour (sous-entendu «incrémenter la version de 1»).

1.Si l’encodage de l’utilisateur est bon, on continue

2.Sinon on arrête et on affiche un message d’erreur «Nous n’avons pas trouvé la procédure demandée»

ii.On récupère l’indice de la ligne qui contient la procédure en question(créer une fonction pour vous aider)

iii.On copie dans la feuille «Archive» (fonction Worksheets() en VBA), les éléments de cette ligne(colonne par colonne):

1.Pour ce faire, vous devez trouver la première ligne libre du tableau dans ArchivesÀutiliser(pour trouver la dernière ligne utilisée, et on ajoute un pour trouver la première ligne libre): Worksheets("Archives").Cells(Rows.Count, "B").End(xlUp).Row + 1

2.Vous devez ensuite copier colonne par colonne les valeurs de Personnel dans Archive, jusqu’à la dernière colonne complétée.À utiliser (pour trouver la dernière colonne complétée): Worksheets("Personnel").Cells(cRow, Columns.Count).End(xlToLeft).Column

iv.Vous incrémentez ensuite de 1 la version de la procédure.

v.Vous réinitialisez la formule de la ligne en copiant et en collant la formule de base (stockée en fin de ligne de chaque procédure => Colonne masquée)

vi.Une fois terminé, vous affichez le message «La version de la procédure xxxest à jour» (en remplaçant xxxpar le numéro d’identification de la procédure).

déjà vu ici ... sans réponse https://forum.excel-pratique.com/viewtopic.php?f=2&t=142352

on va avoir tous les élèves ?

Je ne vois même pas le début du commencement d ela macro.

Vas-y par étapes, commence à écrire ceci

i.Demander à l’utilisateur quelle procédure il désire mettre à jour (sous-entendu «incrémenter la version de 1»).

1.Si l’encodage de l’utilisateur est bon, on continue

2.Sinon on arrête et on affiche un message d’erreur «Nous n’avons pas trouvé la procédure demandée»

ii.On récupère l’indice de la ligne qui contient la procédure en question(créer une fonction pour vous aider)

présente ton brouillon, on te guidera et te formera

Je ne vois même pas le début du commencement d ela macro.

Vas-y par étapes, commence à écrire ceci

i.Demander à l’utilisateur quelle procédure il désire mettre à jour (sous-entendu «incrémenter la version de 1»).

1.Si l’encodage de l’utilisateur est bon, on continue

2.Sinon on arrête et on affiche un message d’erreur «Nous n’avons pas trouvé la procédure demandée»

ii.On récupère l’indice de la ligne qui contient la procédure en question(créer une fonction pour vous aider)

présente ton brouillon, on te guidera et te formera

J'ai fais le point i mais quand j'encode la procédure cela me met quand même le message " nous n'avons pas trouver la procédure "

Pour le moment je n'est réussi à faire que cela .

Quelques conseils

  • ajoute
    option explicit

    cela te montrera si des variables sont mal orthographiées
  • je pense qu'il est plus utile d'indenter ton code que d'ajouter des lignes blanches, mais tu peux faire les 2
  • what ... manque le : what:=
  • déclare

    et ensuite utilise le
  • c'est quoi Sequence !?
  • orthographe de xitoletft à changer en xlToLeft

et j'ai pas fini !

            For l = l To maxcolumn
                Worksheets(3).Cells(lignelibre, 1).Value = Worksheets(2).Cells(ligneprocedure, 1).Value
            Next

super dangereux, on confond ensuite le "un" et "la lettre L en minuscule", a dopte plutôt j ou c comme colonne

et la preuve tu avais écrit for lettre L en minuscule = lettre L en minuscule ....

            For l = l To maxcolumn
                Worksheets(3).Cells(lignelibre, 1).Value = Worksheets(2).Cells(ligneprocedure, 1).Value
            Next

super dangereux, on confond ensuite le "un" et "la lettre L en minuscule", a dopte plutôt j ou c comme colonne

et la preuve tu avais écrit for lettre L en minuscule = lettre L en minuscule ....

Merci, j'ai changé ce que tu m'as dit, mais le "option explicit" je ne sais pas ou je dois le mettre dans le code car ça me met erreur quand je le met. Maintenant quand je fais la mise à jour d'une procédure , la ligne devient blanche je ne comprends pas pourquoi?

je n'ai pas terminé, je vais reprendre ...

option explicit

est à mettre tout en haut, avant sub

je n'ai pas terminé, je vais reprendre ...

option explicit

est à mettre tout en haut, avant sub

D'accord merci, est ce que ça serais possible que tu mettes les remarques à coté des lignes dans ma macro en (') car des fois je ne comprends pas où et comment changé pour que ça soit juste . Merci je suis vraiment nul en exel on a jamais eu cours dessus on dois chercher de nous même ce qui est super compliqué.

je te remettrai la macro telle qu'elle fonctionne, et donne un résultat

après il faudra voir si cela correspond à ce que tu souhaites

mais je m'attache pour le moment à la syntaxe

au suivant ...

  • maxcolumn ou maxcolum ? il faut choisir !

ceci fonctionne, regarde le résultat s'il correspond à ce que tu souhaites !

Option Explicit

Sub miseAJourProcedure()
Dim procedure As String
Dim ligneprocedure As Integer
Dim maxcolum As Integer
Dim lignelibre As Integer
Dim versioninit As Integer
Dim prfound As Range
Dim c As Integer, j As Integer

    procedure = InputBox("Quelle procedure voulez-vous mettre à jour?", "Saisie")
    Set prfound = Worksheets(2).Range("B6:B25").Find(What:=procedure, LookIn:=xlValues)

        If prfound Is Nothing Then
            MsgBox ("Nous n’avons pas trouvé la procédure demandée.")
        Else
            ligneprocedure = prfound.Row
            maxcolum = Worksheets(2).Cells(ligneprocedure, Columns.Count).End(xlToLeft).Column
            lignelibre = Worksheets(3).Cells(Rows.Count, "B").End(xlUp).Row + 1
            For c = 1 To maxcolum
                Worksheets(3).Cells(lignelibre, c).Value = Worksheets(2).Cells(ligneprocedure, c).Value
            Next
            Worksheets(2).Cells(lignelibre, 3).Value = Worksheets(2).Cells(ligneprocedure, 3).Value + 1
            For j = 6 To 24
                Worksheets(2).Cells(ligneprocedure, 25).Copy Worksheets(2).Cells(ligneprocedure, j)
            Next
            MsgBox ("La version de la procedure" + procedure + " Mise à jour effectuée")
        End If

End Sub

je te remettrai la macro telle qu'elle fonctionne, et donne un résultat

après il faudra voir si cela correspond à ce que tu souhaites

mais je m'attache pour le moment à la syntaxe

D'accord merci, je viens d'essayé mais le problème est que la ligne de la procédure que je met à jour disparaît quand je l'a met à jour .

J'ai essayé avec une autre sorte et aussi répondre au point iv du prof. Je le met ici je ne sais pas si c'est mieux de cette façon ou bien si on sais combiné les 2? C'est "miseajour2"

Je vais regarder l'énoncé (jusqu'à présent je me suis attaché à la syntaxe) ... mais j'avoue qu'il a l'esprit tordu, si si !

Cela dit, c'est un bon exercice pour apprendre à coder, avec de la RIGUEUR.

Je vais regarder l'énoncé (jusqu'à présent je me suis attaché à la syntaxe) ... mais j'avoue qu'il a l'esprit tordu, si si !

Cela dit, c'est un bon exercice pour apprendre à coder, avec de la RIGUEUR.

Oui surtout que c'est notre première année et que l'on a pas eu cours à cause du confinement et que avant ça je n'avais JAMAIS utilisé exel.... Du coup, c'est assez compliqué.

i.Demander à l’utilisateur quelle procédure il désire mettre à jour (sous-entendu «incrémenter la version de 1»).

1.Si l’encodage de l’utilisateur est bon, on continue

2.Sinon on arrête et on affiche un message d’erreur «Nous n’avons pas trouvé la procédure demandée»

ce point est ok !

ii.On récupère l’indice de la ligne qui contient la procédure en question(créer une fonction pour vous aider)

c'est bon aussi même si tu n'as pas créé une fonction comme demandé !

iii.On copie dans la feuille «Archive» (fonction Worksheets() en VBA), les éléments de cette ligne(colonne par colonne):

1.Pour ce faire, vous devez trouver la première ligne libre du tableau dans ArchivesÀutiliser(pour trouver la dernière ligne utilisée, et on ajoute un pour trouver la première ligne libre): Worksheets("Archives").Cells(Rows.Count, "B").End(xlUp).Row + 1

2.Vous devez ensuite copier colonne par colonne les valeurs de Personnel dans Archive, jusqu’à la dernière colonne complétée.À utiliser (pour trouver la dernière colonne complétée): Worksheets("Personnel").Cells(cRow, Columns.Count).End(xlToLeft).Column

c'est ok aussi

Au passage,

  • pourquoi la colonne A est masquée , et ne sert à rien !
  • dommage de ne pas avoir d'en-têtes dans Archives
  • je passe sur Archive sans s et avec un blanc, c'est un détail en écart avec la demande

iv.Vous incrémentez ensuite de 1 la version de la procédure.

c'est pas ok du tout !

Tu confonds ligneprocedure et ligne libre = manque de rigueur !

            Worksheets(2).Cells(ligneprocedure, 3).Value = Worksheets(2).Cells(ligneprocedure, 3).Value + 1

v.Vous réinitialisez la formule de la ligne en copiant et en collant la formule de base (stockée en fin de ligne de chaque procédure => Colonne masquée)

Il n'y a RIEN dans la colonne 25, du reste il n'y a pas de colonne cachée ...

Tu peux utiliser maxcolum pour 24 et maxcolum + 1 pour 25

Il te reste à sauvegarder cette fameuse formule !!

D'accord merci, je viens d'essayé mais le problème est que la ligne de la procédure que je met à jour disparaît quand je l'a met à jour

Pas étonnant donc, il n'y a rien en colonne 25, donc tu recopies du vide

Option Explicit

Sub miseAJourProcedure()
Dim procedure As String
Dim ligneprocedure As Integer
Dim maxcolum As Integer
Dim lignelibre As Integer
Dim versioninit As Integer
Dim prfound As Range
Dim c As Integer, j As Integer

    procedure = InputBox("Quelle procedure voulez-vous mettre à jour?", "Saisie")
    Set prfound = Worksheets(2).Range("B6:B25").Find(What:=procedure, LookIn:=xlValues)

        If prfound Is Nothing Then
            MsgBox ("Nous n’avons pas trouvé la procédure demandée.")
        Else
            ' ligne concernée par la procédure
            ligneprocedure = prfound.Row

            ' première ligne libre dans Archive
            lignelibre = Worksheets(3).Cells(Rows.Count, "B").End(xlUp).Row + 1

            ' dernière colonne à recopier
            maxcolum = Worksheets(2).Cells(ligneprocedure, Columns.Count).End(xlToLeft).Column

            ' recopie
            For c = 1 To maxcolum
                Worksheets(3).Cells(lignelibre, c).Value = Worksheets(2).Cells(ligneprocedure, c).Value
            Next

            ' incrément du n° de version
            Worksheets(2).Cells(ligneprocedure, 3).Value = Worksheets(2).Cells(ligneprocedure, 3).Value + 1

            ' recopie de la formule stockée colonne 25 ou maxcolum + 1
            For j = 6 To maxcolum
                Worksheets(2).Cells(ligneprocedure, maxcolum + 1).Copy Worksheets(2).Cells(ligneprocedure, j)
            Next

            ' message de fin
            MsgBox ("La version de la procedure" + procedure + " Mise à jour effectuée")
        End If

End Sub

Je t'ai volontairement tout détaillé étape par étape pour t'apprendre les base du débogage.

Rechercher des sujets similaires à "macro vba"