Macro lancée à chaque ligne selon valeur d'une cellule

Bonjour à tous,

Je viens ici après de longues heures de recherches sur plusieurs forums Excel sans succès, en espérant que l'un de vous pourra m'apporter son aide. Etant une grande novice en VBA, j'ai su me débrouiller pour créer quelques codes simples mais là je bloque completèment.

Ci-joint, un fichier "exemple" de ce que je souhaite faire (Essai_Forum).

Concrètement je souhaiterais que si le choix effectué en colonne G = Oui alors :

Copier/coller la valeur de la colonne E en colonne C (sachant que la colonne E contient une formule)

Copier/coller la valeur de la colonne F en colonne D

Puis effacer les contenus des colonnes F et G

Mon problème est que je n'arrive pas à appliquer ce code à chaque ligne sans que cela ne bug complètement.

De plus j'avais trouvé un "bout de code" me permettant d'enregistrer les données sur un autre onglet "historique" à chaque modification mais après plusieurs tentatives il ne fonctionne plus.

Comme les données sont confidentielles, j'ai créée ce fichier excel en exemple, j'ai dû supprimer mes essais de code car Excel ne fonctionnait plus et se fermait.

Merci à quiconque me viendrait en aide !

Marlène

32essai-forum.xlsx (12.09 Ko)

Bonjour Marlene4242

Bienvenue sur le forum !

Il y a un problème dans ton énoncé

Marlene4242 a écrit :

Copier/coller la valeur de la colonne F en colonne DPuis effacer les contenus des colonnes F et G

donc il n'y a plus de formule en F

Ou alors tu souhaites qu'elle se "régénère" automatiquement ?

Bonjour,

Merci à vous de vous intéresser à mon sujet.

Il n'y a pas de formule en colonne F mais en colonne E.

Cdlt,

Marlène

(re)

effectivement je suis été allé trop vite

par contre pendant que nous y sommes est-il possible de concevoir le problème de cette façon :

  1. tu coches la colonne G à OUI/NON selon les cas
    ET SEULEMENT APRES
  2. tu appuies sur un bouton (que j'installe en lien avec la macro-cmde) pour faire les transferts de colonnes

Re

Pourquoi pas ?! Toutes les solutions proposées sont bonnes à prendre !

Merci !

Marlène

(re)

Ok alors je regarde comme ça !

Merci à vous, en attente de vos nouvelles ! =)

Bonjour marlene4242

Normalement (si j'ai bien compris le problème...)

C'était tout simple en réalité !

47essai-forum-v1.xlsm (24.09 Ko)

Re bonjour,

C'est génial, merci beaucoup !!

Je m'étais borné à ce que le code s'active en choississant "oui" dans la liste mais c'est bien plus simple et assez intuitif avec un bouton aussi !

J'essaie de l'appliquer à mon autre fichier et vous tient au courant du résultat !

Marlène

(re)

Ok

Et surtout (plus qu'intuitif) c'est surtout plus rapide... un temps pour la saisie, un temps pour la validation !

Tiens moi au courant de la suite...


Marlene4242 a écrit :

C'est génial, merci beaucoup !!

Re bonjour Andrea,

C'est excellent, ça marche à la perfection, merci beaucoup !

Notamment pour tes commentaires dans la macro qui m'ont permis de comprendre le code !

Je met cette discussion en "résolu" et te remercie mille fois de m'avoir sorti de cette galère !

Bonne soirée,

Marlène

(re)

Marlene4242 a écrit :

C'est excellent, ça marche à la perfection, merci beaucoup !

Marlene4242 a écrit :

Notamment pour tes commentaires dans la macro qui m'ont permis de comprendre le code !

en général je commente toujours mes macro-cmdes, c'est plus facile à comprendre et à maintenir !

Bonjour Andrea,

Pourrais-tu m'aider pour ajouter une ligne à ce code afin qu'avant que la macro se lance les données de la ligne soient enregistrées sur un autre onglet intitulé "historique" afin que les valeurs des cellules modififées soient enregistrées quelque part avant les modifications ?

Je te remercies par avance si tu trouvais une solution,

Marlène

Enfet,

Je me demande ce que je dois rajouter à ce code (ci-dessous), pour que quand la ligCpt,20 = oui alors il faut copier les données colonne A,B,J,K et L de la ligne en feuille "Histo" et qu'a chaque lancement de la macro cela me copie les lignes en dessous des autres dans le classeur "Histo".

Je ne sais pas si c'est plus clair.

Dim ligDeb, ligFin As Long

Dim colDeb, colFin As Long

Dim ligCpt, colCpt As Long

ligDeb = 3 ' Debut du tableau en ligne 2 Histo

colDeb = 1 ' -- -- -- -- colonne 1

Cells(ligDeb, colDeb).Select ' Se positionner au debut

Selection.End(xlDown).Select ' Aller a la fin

ligFin = Selection.Row ' Retenir la ligne de fin

Application.EnableEvents = False ' Pour eviter les procedures evenementielles qui viendraient perturber le traitement en cours

Application.ScreenUpdating = False ' Pour aller plus vite en evitant d'afficher les modifs en cours

For ligCpt = ligDeb To ligFin ' De la 1ere ligne du tableau jusqua la Derniere

If UCase(Cells(ligCpt, 20)) = "OUI" Then ' SI VALIDATION = OUI ALORS traiter...

Cells(ligCpt, 10) = Cells(ligCpt, 12).Value ' C = E (NE ACTUEL deveint NE VISE) ** avec value pour ne copier que la valeur et non la formule

Cells(ligCpt, 11) = Cells(ligCpt, 18) ' D = F (DATE DER EVAL = DATE EVAL)

Cells(ligCpt, 18) = "" ' F = "" (DATE EVAL effacee)

Cells(ligCpt, 20) = "" ' G = "" (VALIDATION = "")

End If ' FIN du SI

Next ' Ligne Suivante

Application.EnableEvents = True ' Remettre en place le traitement des procedures evenementielles

Application.ScreenUpdating = True ' Remettre en place l'affichage de l'ecran

End Sub ]

Merci !

Bonjour marlenne4242

Sub Valider()

Dim ligDeb, ligFin As Long
Dim colDeb, colFin As Long
Dim ligCpt, colCpt As Long

Dim ligDebLog, ligFinLog As Long
Dim colDebLog As Long
Dim colCptLog As Long

    Worksheets("HISTO").Select
    ligDebLog = 2                           ' a modifier en fonction de la premiere ligne utilisable dans HISTO
    colDebLog = 1                           ' - -        -  -        -  -  -        colonne -         -    -
    Cells(ligDebLog, colDebLog).Select      ' Se positionner au debut
    Selection.End(xlDown).Select            ' Aller a la fin
    ligFinLog = Selection.Row               ' Retenir la ligne de fin

    Worksheets("????").Select
    ligDeb = 2                      ' Debut du tableau en ligne 2
    colDeb = 1                      ' --    -- --      -- colonne 1
    Cells(ligDeb, colDeb).Select    ' Se positionner au debut
    Selection.End(xlDown).Select    ' Aller a la fin
    ligFinLog = Selection.Row       ' Retenir la ligne de fin

    Application.EnableEvents = False                    ' Pour eviter les procedures evenementielles qui viendraient perturber le traitement en cours
    Application.ScreenUpdating = False                  ' Pour aller plus vite en evitant d'afficher les modifs en cours
    For ligCpt = ligDeb To ligFin                       ' De la 1ere ligne du tableau jusqua la Derniere
        If UCase(Cells(ligCpt, 7)) = "OUI" Then         ' SI VALIDATION = OUI ALORS traiter...

            For colCptLog = 1 To 7
                Worksheets("HISTO").Cells(ligFinLog, colCptLog) = Worksheets("????").Cells(colCptLog)
            Next
            ligFinLog = ligFinLog + 1

            Cells(ligCpt, 3) = Cells(ligCpt, 5).Value   '   C = E (NE ACTUEL deveint NE VISE)  ** avec value pour ne copier que la valeur et non la formule
            Cells(ligCpt, 4) = Cells(ligCpt, 6)         '   D = F (DATE DER EVAL = DATE EVAL)
            Cells(ligCpt, 6) = ""                       '   F = "" (DATE EVAL effacee)
            Cells(ligCpt, 7) = ""                       '   G = "" (VALIDATION = "")
        End If                                          ' FIN du SI
    Next                                                ' Ligne Suivante
    Application.EnableEvents = True                     ' Remettre en place le traitement des procedures evenementielles
    Application.ScreenUpdating = True                   ' Remettre en place l'affichage de l'ecran
End Sub

voici comme le code... j'ai mis toute la procédure pour que tu vois où mettre quoi...

évidement il faut remplacer les ???? (dans worksheets("????") ) par le nom de la feuille où se trouve le tableau "corrigé" par la procédure !

Merci beaucoup,

Je suis parti du boulot et je n'ai donc pas acces au fichier, j'essaie lundi et te tiens au courant.

Bon week end !

Marlène

RE bonjour,

Avec ce code, plus rien ne marche, il s'éxécute bien mais au final il ne remplit pas sa fonction au niveau du classeur "normal" et il ne me copie rien sur "histo", il va juste se situer sur la ligne 1048576.

Marlène

Bonjour marlene4242

Voilà. J'ai "réparé" le code... le 15/01 j'avais écris "ça" en vitesse de mémoire ! résultat "ça" bug

Normalement cette fois "ça" doit fonctionner !

Explications :

J'ai créé un onglet HISTO dans lequel je fais les copies avant les transferts de colonne

Seules les lignes modifiées sont transférer !

24essai-forum-v2.xlsm (26.99 Ko)

Bonjour Andrea73,

Dans l'ensemble le code marche sauf que dès que la deuxième ligne est remplie dans mon onglet "histo" alors ça ne marche plus et ça bug.

Marlène

je t'en demande encore un peu mais est-il possible de préciser quelles cellules je veux qu'il copie dans l'onglet "histo" ou je dois nécessairement copier toute la ligne ?

[Je viens de voir que cela marche bien pourtant dans le fichier exemple, je vais encore chercher un peu pourquoi ça ne marche pas sur mon fichier ducoup, merci !]

Après fermeture/ ouverture du fichier, cela marche bien !

C'est super merci beaucoup !

Bonjour marlene4242

Marlene4242 a écrit :

Dans l'ensemble le code marche sauf que dès que la deuxième ligne est remplie dans mon onglet "histo" alors ça ne marche plus et ça bug.

chez moi ça tourne très bien !
Marlene4242 a écrit :

je t'en demande encore un peu mais est-il possible de préciser quelles cellules je veux qu'il copie dans l'onglet "histo" ou je dois nécessairement copier toute la ligne ?

il suffit que tu précise lesquelles !

andrea73 a écrit :

il suffit que tu précises lesquelles !

Rechercher des sujets similaires à "macro lancee chaque ligne valeur"