Formule remplacée par une macro ?

Salut !

Voilà je me posais une question...

J'ai un tableur excel dans lequel j'ai parfois beaucoup de colonnes qui dépendent d'une seule autre colonne.

En gros, j'ai une colonne (la colonne Q) qui contient des dates de départ. Si date de départ il y a, je saisis la description du départ avec les 15 colonnes qui suivent (date d'arrivée, type de départ, etc).

Petit soucis, parfois il n'y a pas de dates et je dois par exemple mettre dans la cellule Q21 la valeur "Non" ou "A revoir"... ce qui rend pas mal de colonne pour cette ligne inutiles. SI Q21="Non" alors les colonnes allant de R21 à AF21 doivent aussi afficher "Non".

J'ai donc créé cette formule (qui marche) : =SI(Q21="Non";"Non";SI(Q21="A revoir";"A revoir";""))

Seulement voilà, je ne trouve pas très pratique d'étendre cette formule à une quinzaine de colonne car à chaque fois que je vais écrire dans une cellule qui d'apparence est vide, j'écris en réalité par dessus une formule. Ce qui peut amener à des confusions dans le cas où par exemple je souhaite changer ultérieurement la valeur de la cellule présente dans la colonne Q.

Est-ce qu'une formule peut être remplacée par des macros ? Je reconnais ne pas trop m'y connaitre en ce qui concerne ces dernières.

Merci.

Bonsoir,

Il semble que le "Non" ou "A revoir" soit juste une information à ton usage, puisque tu saisis directement les autres colonnes.

Dans ce cas une MFC d'alerte mettant la ligne en noir (ou autre couleur) devrait suffire pour t'alerter.

Cordialement

Salut,

Skezor a écrit :

Est-ce qu'une formule peut être remplacée par des macros ?

Bien entendu

Afin d’y voir plus clair, il faudrait avoir ton fichier ou un fichier modèle à disposition.

Cordialement.

MFerrand a écrit :

Bonsoir,

Il semble que le "Non" ou "A revoir" soit juste une information à ton usage, puisque tu saisis directement les autres colonnes.

Dans ce cas une MFC d'alerte mettant la ligne en noir (ou autre couleur) devrait suffire pour t'alerter.

Cordialement

En fait je compte tirer des conclusions en faisant des tableaux croisés dynamiques et ces cellules doivent donc obligatoirement être remplies par un "Non" ou un "A revoir".

J'ai ajouté un fichier test en pièce jointe.

Bonjour,

Dans le fichier ci-joint, si tu écris ‘A revoir’ ou ‘Non’ dans la colonne Q, ce texte est reporté dans les colonnes R à AB (donc 11 colonnes et non pas 15 comme tu l’indiques) de cette ligne. Si un texte est déjà en place dans l’une de cellule (comme il y a des textes dans les cellules S4 et U4), il n’est pas effacé.

La casse n’a pas d’importance, tu peux inscrire ‘A revoir’ ou ‘Non’ en minuscules, majuscules, un peu ''comme ça te chante''.

Si tu écris un autre mot que ‘A revoir’ ou ‘Non’, rien ne se passe.

Si nécessaire, on pourrait prévoir que si tu remplaces ‘A revoir’ par ‘Non’ ou le contraire, tous les mots de la ligne soient remplacés (les ‘A revoir’ par des ‘Non’ et le contraire, mais pas les autres mots) ou n’importe qu’elle autre amélioration dont tu aurais besoin.

Amicalement.

Merci beaucoup beaucoup, c'est vraiment ce que je cherchais !

Yvouille a écrit :

Bonjour,

Dans le fichier ci-joint, si tu écris ‘A revoir’ ou ‘Non’ dans la colonne Q, ce texte est reporté dans les colonnes R à AB (donc 11 colonnes et non pas 15 comme tu l’indiques) de cette ligne.

Oui j'ai encore pas mal de colonnes à ajouter et dans celles-ci 4 seront dépendantes du contenu de la colonne Q.

J'ai d'ailleurs essayé d'étendre la macro à des colonnes supplémentaires mais c'est pas gagné pour le moment.

Ton code :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        If Target = "Non" Or Target = "A revoir" Then
            For i = 18 To 28  ' Colonnes R à AB
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Target
            Next i
        End If
    End If

End Sub

La petite modification que j'ai faite (en vain).

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        If Target = "Non" Or Target = "A revoir" Then
            For i = 18 To 29  ' Colonnes R à AC
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Target
            Next i
        End If
    End If

End Sub

Je commence à apprendre les cours VBA à coté, peut-être je trouverais quelque chose en rapport avec mon problème.

Re,

Je me suis fait avoir comme un petit garçon.

En fait il restait des formules dans ton fichier et c’est celles-ci qui inscrivaient les bons textes et non pas ma macro

Donc voici un nouveau code qui devrait fonctionner maintenant.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        Application.EnableEvents = False
        If Target = "Non" Or Target = "A revoir" Then
            For i = 18 To 29  ' Colonnes R à AC
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Target
            Next i
        End If
        Application.EnableEvents = True
    End If

End Sub

Par contre ce code est sensible à la casse. Si tu veux éviter ce problème, il faudrait y effectuer une petite modification complémentaire.

Amicalement.

Ok super je viens de tester et ça marche ! C'est sûr que si la casse n'a pas d'importance c'est mieux mais ça reste un luxe, tu m'as déjà beaucoup aidé.

Bonsoir,

Dans le fichier ci-joint j'ai placé le code ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, Référence As String

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 18 To 29  ' Colonnes R à AC
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

End Sub

Tu peux donc écrire les textes 'a REVoiR' et 'nON' un peu comme tu l'entends ; le résultat final sera 'A revoir' et 'Non', même pour la cellule de base de la colonne Q.

Si tu veux pouvoir écrire 'A revoir' avec ou sans accent sur le a, il faudra modifier légèrement le code

Chaleureusement.

C'est magique, je vais gagner un temps fou, merci.

Par contre je viens de tester et je suis face à une légère difficulté, le code que tu m'as donné ne permet d'activer d'autres codes. Un exemple étant parfois plus explicite qu'un long discours je me permet de t'envoyer mon nouveau code ainsi qu'une nouvelle version du fichier.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, Référence As String

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 18 To 29  ' Colonnes R à AC
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("AC:AC")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 30 To 31  ' Colonnes AD à AE
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

End Sub

En gros je veux faire le même code pour les colonnes AD et AE reposant sur le contenu de la colonne AC dont son contenu repose lui-même à travers ton code sur le contenu de la colonne Q. Seulement je dois manuellement réécrire "Non" en AC pour que le second code s'active. Suis-je en train de côtoyer les limites d'excel ou il est possible d'améliorer le code ?

Ah et autre petite question, si je veux appliquer ton code à différentes colonnes qui ne sont pas mitoyennes (par exemple aux colonnes allant de R à AC ainsi qu'à la colonne AJ) comment m'y prendre de la meilleure façon ?

Pour l'instant l'idée que j'ai en tête donnerait ça mais je suppose qu'il y a moyen d'éliminer pas mal de lignes de codes pour le simplifier :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, Référence As String

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 18 To 29  ' Colonnes R à AC
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 36 To 36  ' Colonne AJ
                If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

End Sub

Et, vraiment, encore merci !

Re,

Skezor a écrit :

Suis-je en train de côtoyer les limites d'excel

Non, ne te fais pas de soucis ; pour l’instant tu es encore à peu près à 1,4385 années-lumière du début de la première limite

Pour l’instant tes demandes sont assez compliquées car je dois tout d’abord essayer de comprendre ce que tu désires réaliser et ensuite essayer de comprendre comment tu as imaginé résoudre ce problème en corrigeant – souvent un peu comme un apprenti-sorcier – mes codes.

Je vais donc prendre un problème après l’autre et te dire comment je résoudrais – si je l’ai bien compris – ton problème ci-dessous :

Skezor a écrit :

En gros je veux faire le même code pour les colonnes AD et AE reposant sur le contenu de la colonne AC dont son contenu repose lui-même à travers ton code sur le contenu de la colonne Q.

J’ai compris que tu désires que les colonnes AD et AE soient également remplies si tu inscrits « A revoir » ou « Non » dans la colonne Q et ai modifié la ligne ci-dessous en conséquence.
For i = 18 To 31 ' Colonnes R à AE

Si ce n’est pas ce que tu désires, expliques-moi mieux où tu veux arriver. Lorsque le premier problème sera résolu on pourra passer au second.

Pour l’instant je pense que tu ferais mieux d’essayer de comprendre mes codes en me posant les questions sur les passages que tu ne comprends pas, plutôt que de vouloir tenter tout et n’importe quoi.

Je te conseille également d’utiliser l’aide d’Excel qui est souvent excellente (en plaçant le curseur sur un terme d’une macro que tu ne comprends pas et en tapant F1) et d’aller faire un tour sur mon fil ci-dessous.

https://forum.excel-pratique.com/cours-astuces/methodes-point-d-arret-et-pas-a-pas-t59460.html?hilit=arr

Amicalement.

Amicalement.

Re,

Voici un deuxième tableur ci-joint dont je ne me servirais pas (juste pour l'exemple).

En gros sur ce tableur les colonnes allant de D à K sont directement dépendantes du contenu présent dans la colonne C. Étant donné que s'il n'y a pas de première date de départ il n'y aura forcément pas de seconde date de départ, etc.

Si je comprend bien, le code devrait donc se faire de cette façon :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, Référence As String

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("C:C")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 4 To 11  ' Colonnes D à K
               If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

End Sub

Seulement voilà, je souhaite le rendre un peu plus complet en faisant en sorte que les colonnes G et H soient "dépendantes" à travers le code non pas de la colonne C mais de la colonne F.

Comme ça s'il y a bien une deuxième date de départ (colonne F) mais que je n'ai pas encore toutes les informations et bien je peux mettre un "A revoir" qui s'applique aussi aux colonne G et H.

Et en continuant ce principe j'aurais fait de même pour les colonnes J et K par rapport à la colonne I.

Je sais vraiment pas si j'explique bien, désolé si c'est pas le cas. ^^

Le code auquel je pense donc serait celui-ci :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer, Référence As String

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("C:C")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 4 To 6  ' Colonnes D à F
               If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

If Target.Count > 1 Then Exit Sub

    If Not Application.Intersect(Target, Range("F:F")) Is Nothing Then
        Application.EnableEvents = False
        If LCase(Target) = "non" Or LCase(Target) = "a revoir" Then
            If LCase(Target) = "non" Then Référence = "Non"
            If LCase(Target) = "a revoir" Then Référence = "A revoir"
            For i = 7 To 8  ' Colonnes G et H
               If Cells(Target.Row, i) = "" Then Cells(Target.Row, i) = Référence
            Next i
        End If
        Target = Référence
        Application.EnableEvents = True
    End If

End Sub

Je vais jeter un coup d’œil à ce que tu m'as envoyé.

Re,

Je veux bien te donner un coup de main, mais ce serait quand même bien que tu écoutes également ce que j’ai à te dire.

Je t’ai dit que nous ne devions traiter qu’un seul problème à la fois – au risque de tout mélanger et de perdre un temps énorme – et tu ne trouves rien de mieux que de me poser une nouvelle question par rapport à un nouveau fichier. Je peux donc te dire que je refuse de traiter cela avant que tu aies vu mon précédent travail et que tu aies pris position par rapport à celui-ci.

Secondement je t’ai dit que vu ton état d’avancement en VBA, il valait mieux que tu te contentes pour l’instant de comprendre les macros existantes qui fonctionnent plutôt que de vouloir essayer tout et n’importe quoi à tort et à travers. Tes essais sont aberrants et montrent que tu n’y comprends encore pas grand-chose pour l’instant.

En résumé, nous pourrions continuer à avancer – mais gentiment, un problème après l’autre – avec ton fichier et en parallèle, tu pourrais commencer à t’intéresser aux codes fournis pour essayer de savoir ce que fait telle ou telle instruction.

Amicalement

Yvouille a écrit :

Je t’ai dit que nous ne devions traiter qu’un seul problème à la fois – au risque de tout mélanger et de perdre un temps énorme – et tu ne trouves rien de mieux que de me poser une nouvelle question par rapport à un nouveau fichier. Je peux donc te dire que je refuse de traiter cela avant que tu aies vu mon précédent travail et que tu aies pris position par rapport à celui-ci.

Sur le fichier d'origine il y a encore des colonnes qui vont s'ajouter au fur et à mesure décalant alors tout l'agencement du tableur... je préférais donc traiter mon problème (qui est donc ici le même) en l'isolant et en le transposant sur un autre fichier (le dernier que j'ai envoyé) afin d'avoir un exemple le plus simple possible sur lequel travailler. De plus comme tu l'a constaté je suis vraiment pas bon sur excel et je trouvais ça plus facile d'apprendre à partir d'un fichier le plus petit/léger possible. Loin de moi la volonté d'ignorer ce que tu disais précédemment ! ^^

Comme ça ne te convient pas je m'en excuse.

Yvouille a écrit :
Skezor a écrit :

En gros je veux faire le même code pour les colonnes AD et AE reposant sur le contenu de la colonne AC dont son contenu repose lui-même à travers ton code sur le contenu de la colonne Q.

J’ai compris que tu désires que les colonnes AD et AE soient également remplies si tu inscrits « A revoir » ou « Non » dans la colonne Q et ai modifié la ligne ci-dessous en conséquence.

En fait non je voudrais que les colonnes AD et AE soient également remplies si j'inscris "A revoir" ou "Non" dans la colonne AC.

Et j'aimerai que la colonne AC soit remplie si j'inscris "A revoir" ou "Non" dans la colonne Q.

Si je t’ai bien compris, si tu inscrits ‘A revoir’ en Q, tu voudrais que la colonne AC ait ‘A revoir’. Ensuite, si tu inscrits ‘Non’ en AC, il faudrait que AD et AE aient ‘Non’. Puis si tu inscrits à nouveau ‘A revoir’ en Q, AC aurait ‘A revoir’, mais AE et AD auraient toujours ‘Non’. Est-ce bien ça ?

Oui c'est exactement ça.

Skezor a écrit :

Oui c'est exactement ça.

Fallait le dire tout de suite

Bonnes salutations.

Re,

Super !!!

Et du coup pour la seconde partie de mon problème... Si je veux par exemple ce même code mais qu'en plus de cela la colonne AF fonctionne comme la colonne AC (et les colonnes précédentes).

En gros s'il y a inscrit dans la colonne Q "A revoir" ou "Non" je souhaite qu'il y ai la même chose dans la colonne AF.

Comment m'y prendre dans le code ?

Salut,

Pour l’instant, ton code effectue deux opérations bien distinctes lors de deux évènements différents ; A) lorsque tu modifies la colonne Q et B) lorsque tu modifies la colonne AC. Je n’ai pas compris lors duquel de ces deux évènements tu veux que la colonne AF se modifie en plus ou est-ce encore lors d’un troisième évènement ?

Amicalement.

Re,

J'aimerais que la colonne AF se modifie lors de l'évènement A.

Rechercher des sujets similaires à "formule remplacee macro"