Vider les deux cellules si une autre est remplie

Imy55

XLDnaute Nouveau
Bonjour,
Je suis nouvelle sur le forum et j’espère vraiment votre aide. En fait, j’arrive pas à vider une cellule si une autre est remplie. J’ai déjà essayé avec une macro mais ça ne fonctionne pas.
Description du problème :
J’ai 3 cellule avec des listes déroulantes F13 prend comme valeur (4 ; 5), G13 (2 ;3), H13 (0, 1). Je veux quand l’une deux prend une valeur (ne soit pas vide) les deux autres soit se bloquent soit se vident.
Vous trouverez ci-joint mon fichier Excel.
Cordialement
Imy55
 

Pièces jointes

  • Grille écologique.xlsm
    23.3 KB · Affichages: 146
  • Grille écologique.xlsm
    23.3 KB · Affichages: 127
  • Grille écologique.xlsm
    23.3 KB · Affichages: 134

paspat

XLDnaute Nouveau
Re : Vider les deux cellules si une autre est remplie

Bonsoir,
est ce ce que vous cherchez ?
cordialement
 

Pièces jointes

  • Grille écologique.xlsm
    29.3 KB · Affichages: 221
  • Grille écologique.xlsm
    29.3 KB · Affichages: 201
  • Grille écologique.xlsm
    29.3 KB · Affichages: 213

Gorfael

XLDnaute Barbatruc
Re : Vider les deux cellules si une autre est remplie

Salut Imy55 et le forum
Comme c'est une macro simple, je n'ai pas commenté le code. C'est une macro qui remplace la tienne :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range, Cel As Range
Set Plage = Intersect(Target, Union([F13:H21], [F23:H28]))
If Plage Is Nothing Then Exit Sub

For Each Cel In Plage
    If Cel <> "" Then
        Select Case Cel.Column
            Case 6  'F
                Cel.Offset(0, 1).ClearContents
                Cel.Offset(0, 2).ClearContents
            Case 7  'G
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, 1).ClearContents
            Case 8  'H
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, -2).ClearContents
        End Select
    End If
Next Cel
End Sub
Pourquoi une boucle ? Tu peux être amenée à faire du copier/coller. La macro le prend en compte.
Normalement, avec une macro Change, on est tenu de bloquer la gestion des évènements, ce qui entraîne une gestion des erreurs. Mais comme on teste si la cellule n'est pas vide et qu'on rend vide les autres cellules, le blocage des évènement ne s'impose pas, ce qui allège le code.
A+
 
Dernière édition:

Imy55

XLDnaute Nouveau
Re : Vider les deux cellules si une autre est remplie

Bonsoir,
est ce ce que vous cherchez ?
cordialement

Bonsoir Paspat,
Oui, c’est exactement ce que je cherche.
Merci beaucoup c’est très gentil de ta part.

-------------------------------------------------------
J’ai un petit problème dans une autre grille qui est presque la même que celle que je vous ai envoyé, j’ai adapté la macro à cette dernière et il a fonctionné à meilleur sur la majorité du fichier mais elle m’a donné un message d’erreur « impossible de modifier une cellule fusionnée » et dans le débogage il me sélectionne la ligne « Target.Offset(0, -1).ClearContents ». Donc si j’ai bien compris dans la boucle il faut que je saute les lignes ou il y a des cellules fusionnées mais je sais pas comment.
La boucle est : For i=13 to 39 il faut sauter l’indice 20 et 31

-------------------------------------------------------
(Les copier/coller fonctionnent mais j'aime apprendre donc je je veux juste une petite explication pour : la fonctionnalité du Target.Offset(0, 1) et l’ utilisation du 0, 1, -1,..
Et est-ce que c'est le Flag qui permet d'afficher et de vider?)
-------------------------------------------------------

Merci Gorfael pour ta réponse ^^
Cordialement
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Vider les deux cellules si une autre est remplie

Salut Imy55 et le forum
Code:
J’ai un petit problème dans une autre grille qui est presque la même que celle que je vous ai envoyé,  j’ai adapté la macro à cette dernière et il a fonctionné à meilleur sur la majorité du fichier mais elle m’a donné un message d’erreur « impossible de modifier une cellule fusionnée » et dans le débogage il me sélectionne la ligne "Target.Offset(0, -1).ClearContents ". Donc si j’ai bien compris dans la boucle il faut que je saute les lignes ou il y a des cellules fusionnées mais je sais pas comment.
La boucle est : For i=13 to 39 il faut sauter l’indice 20 et 31
Je suppose que c'est du code de Paspat que tu parles
Remarque : si tu donnes un fichier d'essai avec les problèmes, en général, on les traite.

Pour gérer les cellules fusionnées, on peut utiliser différentes métodes :
- soit au lieu de traiter Target, on traite Target.mergeArea
- soit on exclut les cellules fusionnées : if target.cells.count >1 then exit sub
- soit on limite la plage de traitement de la macro aux cellules réellement concernées (comme j'ai fait dans la macro que j'ai proposée).
je veux juste une petite explication pour : la fonctionnalité du Target.Offset(0, 1) et l’ utilisation du 0, 1, -1,..
Target.offset(0,-1) : target décalée d'une colonne à gauche
Target.offset(0,1) :target décalée d'une colonne à droite
target.offset(x,y) : target déclalée de x lignes et de y colonne.
Et est-ce que c'est le Flag qui permet d'afficher et de vider?)
Tu utilises la macro Worksheet_Change, macro à lancement automatique. Le Flag dans la macro de Paspat sert à indiquer si le changement doit être pris en compte ou non

Pour expliquer le problème, une macro simple : si on change A1, on ajoute 1 au nombre entré. Je rentre manuellement 1 dans A1, je veux qu'il m'affiche 2. Le code de base serait du genre :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "A1" Then Range("A1") = Range("A1") + 1
End Sub
Mais Excel fait toujours ce que tu lui demandes et quelques (rares) fois ce que tu veux :
Tu entres manuellement 1 en A1 => la macro se lance => A1 = 2 => mais la feuille a changé => la macro se lance => A1 = 3 => mais la feuille a changé => la macro se lance... tu peux aller boire ton café avant qu'Excel n'arrive à sa limite et déclenche un dépassement de capacité :D
Comme d'habitude, il y a plusieurs méthodes pour éviter ça, et celle de Pasat en est une : on déclare une variable booléenne en global (elle ne se réinitialise pas à la fin de la macro)
On se retrouve avec ce code
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Flag Then Exit Sub
If Target.Address(0, 0) = "A1" Then
    Flag = True
    Range("A1") = Range("A1") + 1
    Flag = False
End If
End Sub
J'entre 1 en A1 => Flag=false => on passe le premier test
Target = "A1" = vrai => Flag devient True, A1 devient A1+1 => Changement qui lance une autre instance de la macro.
Mais comme Flag = Vrai, on sort, fin de la 2ème instance
et on retourne à la première juste après A1=A1+1
=> Flag=False => on sort de la première instance.

Flag ne sert qu'à inhiber les évènements Change créés par le code.
A+
 
Dernière édition:

Imy55

XLDnaute Nouveau
Re : Vider les deux cellules si une autre est remplie

Salut Gorfael,
J’aime bien ton code il fonctionne très bien. En fait je l’avais adapté à mon cas et c’est vraiment cool.
J’ai pas envoyé une pièce joint car j’aime bien apprendre et je pense que vous m’avez donné un très bon cours et si enrichissant et en plus gratuit LOL.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range, Cel As Range
Set Plage = Intersect(Target, Union([F13:H19], [F21:H30], [F23:H39], [I13:K19], [I21:K30], [I23:K39], [L13:N19], [L21:N30], [L23:N39], [O13:Q19], [O21:Q30], [O23:Q39]))
If Plage Is Nothing Then Exit Sub

For Each Cel In Plage
    If Cel <> "" Then
        Select Case Cel.Column
            Case 6  'F
                Cel.Offset(0, 1).ClearContents
                Cel.Offset(0, 2).ClearContents
            Case 7  'G
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, 1).ClearContents
            Case 8  'H
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, -2).ClearContents
            Case 9  'I
                Cel.Offset(0, 1).ClearContents
                Cel.Offset(0, 2).ClearContents
            Case 10  'J
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, 1).ClearContents
            Case 11  'K
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, -2).ClearContents
            Case 12  'L
                Cel.Offset(0, 1).ClearContents
                Cel.Offset(0, 2).ClearContents
            Case 13  'M
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, 1).ClearContents
            Case 14  'N
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, -2).ClearContents
            Case 15  '0
                Cel.Offset(0, 1).ClearContents
                Cel.Offset(0, 2).ClearContents
            Case 16  'P
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, 1).ClearContents
            Case 17  'Q
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, -2).ClearContents
        End Select
    End If
Next Cel
End Sub

Merci beaucoup
Imy55
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Vider les deux cellules si une autre est remplie

Salut Imy55 et le forum
et en plus gratuit LOL.
Faux ! Tu as l'obligation d'aider quand tu peux !

Jute une remarque sur ton code
Code:
Set Plage = Intersect(Target, Union([F13:H19], [F21:H30], [F23:H39], [I13:K19], [I21:K30], [I23:K39], [L13:N19], [L21:N30], [L23:N39], [O13:Q19], [O21:Q30], [O23:Q39]))[/SIZE][/FONT][/COLOR][/QUOTE]Pour moi, c'est trop complexe. On va juste regarder ta plage F:H =>
[COLOR=black][FONT=Palatino Linotype][SIZE=3]Union([F13:H19], [F21:H30], [F23:H39]) Si je la lis, tu regarde la plage de 19 à 39, sauf la ligne 20 (idem pour les autres plages qui sont concomitantes). il suffit de déclarer la plage de 13 à 39, et de refuser de traiter les valeurs de la ligne 20.

On peut regarder ton select case de la même manière : tu as 4 fois le même code : [F, G, H], [I, J, K], [L, M, N] et [O, P ,Q]
Comme ce n'est pas facile de travailler avec les lettres, on va s'occuper des numéros de colonnes. On a donc :
(6,7,9), (9,10,11), (12,13,14), (15,16,17)
Comme c'est un phénomène cyclique, on va utiliser Modulo, qui donne le reste après une division entière
Sur une feuille Excel, j'utiliserais : [/SIZE][/FONT][/COLOR][CODE]=MOD(COLONNE();3)
Ce qui donne le reste après une division par 3 : mes 4 triplets se transforment en (0, 1, 2)

Ce qui donne au final :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range, Cel As Range
Set Plage = Intersect(Target, [F13:Q39])
If Plage Is Nothing Then Exit Sub

For Each Cel In Plage
    If Cel.Row <> 20 And Cel <> "" Then
        Select Case Cel.Column Mod 3
            Case 0  'F, I, L, O
                Cel.Offset(0, 1).ClearContents
                Cel.Offset(0, 2).ClearContents
            Case 1  'G, J, M, P
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, 1).ClearContents
            Case 2  'H, K, N, Q
                Cel.Offset(0, -1).ClearContents
                Cel.Offset(0, -2).ClearContents
        End Select
    End If
Next Cel
End Sub
Le but d'une simplification n'est que très rarement esthétique : Plus le code est lisible (et court), moins tu risques des erreurs.
C'est rarement pendant la création du code (quoique). Mais c'est souvent longtemps après te l'être sorti de la tête, lors d'une modification "simple" que ça prend son importance.

De même, les commentaires à chaque ligne sont peu utiles.
Par contre, une instruction que tu n'utilises pas souvent, demande un petit commentaire.
Ou une astuce hyper géniale, que tu n'as trouvée qu'après maintes réflexions sur le code, est facilement compréhensible avec un tout petit texte (au lieu de t'arracher les cheveux).
A+
 
Dernière édition:

Imy55

XLDnaute Nouveau
Re : Vider les deux cellules si une autre est remplie

Salut Imy55 et le forumFaux ! Tu as l'obligation d'aider quand tu peux !

Jute une remarque sur ton code
Code:
Set Plage = Intersect(Target, Union([F13:H19], [F21:H30], [F23:H39], [I13:K19], [I21:K30], [I23:K39], [L13:N19], [L21:N30], [L23:N39], [O13:Q19], [O21:Q30], [O23:Q39]))[/SIZE][/FONT][/COLOR][/QUOTE]Pour moi, c'est trop complexe. On va juste regarder ta plage F:H =>
[COLOR=black][FONT=Palatino Linotype][SIZE=3]Union([F13:H19], [F21:H30], [F23:H39]) Si je la lis, tu regarde la plage de 19 à 39, sauf la ligne 20 (idem pour les autres plages qui sont concomitantes). il suffit de déclarer la plage de 13 à 39, et de refuser de traiter les valeurs de la ligne 20.

On peut regarder ton select case de la même manière : tu as 4 fois le même code : [F, G, H], [I, J, K], [L, M, N] et [O, P ,Q]
Comme ce n'est pas facile de travailler avec les lettres, on va s'occuper des numéros de colonnes. On a donc :
(6,7,9), (9,10,11), (12,13,14), (15,16,17)
Comme c'est un phénomène cyclique, on va utiliser Modulo, qui donne le reste après une division entière
Sur une feuille Excel, j'utiliserais : [/SIZE][/FONT][/COLOR][CODE]=MOD(COLONNE();3)
Ce qui donne le reste après une division par 3 : mes 4 triplets se transforment en (0, 1, 2)

Premièrement désolé de ne pas te remercier avant j’avais un problème de connexion et j’arrive juste de voir la réponse.
Merci pour la correction ton code est vraiment très simple mais fort coté résonnement. Vraiment je regrette le fait de ne pas s’enregistrer sur ce Forum depuis longtemps. Je suis sûr que je vais apprendre beaucoup de choses.
Je sais que je demande beaucoup d’aide mais je vous promets dès que j’apprends un truc je vais plus l’oublier.
Le problème que j’ai pour le moment est d’altérer les valeurs de deux cellules :
J’ai deux cellule A et B elles peuvent prendre deux valeurs 1 ou 0 (liste déroulante) je veux quand A prend comme valeur 1, B prend 0 et le contraire.

------------------
A liste (0;1)
------------------
------------------
B liste (0;1)
------------------
--------------------------------------------------------------------
Si:
------------------
A =0
------------------
donc
------------------
B =1
------------------
--------------------------------------------------------------------
Si:
------------------
A =1
------------------
donc
------------------
B =0
------------------


Merci encor une fois.
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Vider les deux cellules si une autre est remplie

Salut Imy55 et le forum
Je sais que je demande beaucoup d’aide mais je vous promets dès que j’apprends un truc je vais plus l’oublier.
Ça, ça m'étonnerait ;). On oublie toujours. Par contre, on finit toujours par retrouver.
Plutôt que de compter sur ma mémoire, je me suis fait un dossier où je mets les fichiers avec les macros intéressantes, en commentant abondamment le code.
Le problème que j’ai pour le moment est d’altérer les valeurs de deux cellules :
J’ai deux cellule A et B elles peuvent prendre deux valeurs 1 ou 0 (liste déroulante) je veux quand A prend comme valeur 1, B prend 0 et le contraire.
Comme toujours, il y a une multitude de manière de traiter le problème. C'est la même chose que précédemment. Pour préciser, on va appeler les cellules A1 et B1. La macro :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Change
Application.EnableEvents = False
If Target.Address(0, 0) = "A1" Then
    If Target = 1 Then
        [B1] = 0
    Else
        [B1] = 1
    End If
End If
If Target.Address(0, 0) = "B1" Then
    If Target = 1 Then
        [A1] = 0
    Else
        [A1] = 1
    End If
End If

Sortie_Change:
Application.EnableEvents = True
Exit Sub
Err_Change:
MsgBox Err.Description, vbOKOnly + vbCritical, "Erreur Excel n°" & Err.Number
Resume Sortie_Change
End Sub
elle semble plus complexe que la précédente, donc, je vais l'expliquer :
À la base, elle est simple : si je change A, je change B et inversement.

Si on fait le fonctionnement dans le détail, on se retrouve avec :
Changement manuel de A => Lancement de la macro => macro change B =>lancement de la macro => change A => lancement de la macro => etc...
Et on se retrouve avec une boucle sans fin qui ne rend pas la main.

Donc, il faut interdire que le changement par la macro relance la macro. Il y a plusieurs possibilités (par variable globale, par exemple). J'en ai pris une : Bloquer la gestion des évènements : EnableEvents.
Au début de la macro, je bloque les évènements, je change B => rien ne se passe, et je remets en fonctionnement la gestion.

Il faut se rappeler qu'Excel est bête ! Il fait toujours exactement ce que tu lui demandes, et quelques (rares) fois ce que tu veux.

Si une erreur survient pendant le déroulement d'une macro, Excel arrête où qu'il se trouve dans le code de la macro, émet un message d’avertissement et sort de la macro. Il ne se préoccupe pas de la gestion des évènements bloquée, il sort, ne repasse donc pas sur sa remise en route et tu te retrouves avec des changements qui ne lancent aucune macro.
Donc, même quand ce n'est pas "nécessaire" (comme ici, puisqu'une erreur Excel est plus qu'improbable), je m'oblige à gérer les erreurs Excel

La gestion des erreurs :
On Error Goto Err_Change : en cas d'erreur Excel, celui-ci continue directement à l'adresse Err_Change
Err_Change: => les ":" indique que c'est une adresse
MsgBox => une boîte de dialogue, donnant les mêmes informations qu'Excel (numéro d'erreur et description, ça peut être utile)
Resume Sortie_Change => Excel continue le programme à l'adresse Sortie_Change
Sortie_Change: => adresse où continue excel et où, avant de finir la macro, je remets la gestion des évènements en route.

Il y a d'autres méthodes de gestion des erreurs, mais celle-ci me convient, l'isolant du reste du programme.

P'te précision : Je ne suis ni devin, ni télépathe, toi non plus (je présume). Je limite mes explications (quoique), pour ne pas (trop) indisposer.
Il y a "l'aide" Excel. Mais avec les difficultés que j'ai à m'en servir, même quand je sais ce que je cherche... Donc, normalement, j'explique.
Mais s'il reste du code que tu ne comprends pas, demandes !
Les dépanneurs, en général, détaillent le fonctionnement de leur code sans problème, si on leur demande... sauf, quelques uns quand ils ne pourraient que recopier le texte de l'aide.
A+
 
Dernière édition:

Imy55

XLDnaute Nouveau
Re : Vider les deux cellules si une autre est remplie

Merci pour ta réponse j’ai essayé d’adapter le code à mon cas mais j’ai pas réussi (comme toujours)
Voici ma grille
 

Pièces jointes

  • Concurrence.xlsm
    23.5 KB · Affichages: 83

Gorfael

XLDnaute Barbatruc
Re : Vider les deux cellules si une autre est remplie

Salut Imy55 et le forum
Rome ne s'est pas faite en un jour.
Ton plus gros problème est... que tu considère Excel comme intelligent ! C'est un "autiste" : hyper performant dans son domaine, mais incapable de voir l'évidence qui demanderait une action
ton code (enfin, une partie) :
Code:
    If Target.Address(0, 0) = "J" Then
        If Target = 1 Then
        Select Case Cel.Column
                Case 6  'F
                [F] = 0
Target.Address(0, 0) => excel renvoie l'adresse en relatif/relatif de target : colonne et ligne. Si tu veux traiter comme ça, à condition qu'on ne dépasse pas la colonne 26 (Z), il aurai fallu écrire :
If left(Target.Address(0, 0),1) = "J" Then
ce qui donne sur une feuille de calcul, le début d'une formule :
Si(Gauche(target;1)="J";....

Select Case Cel.Column : pour qu'Excel comprenne ce que tu veux dire, il fallait lui définir ce qu'est Cel (Set Cel =...) ou faire Select case Target.column, vu que Target est déjà défini pour Excel.

Le raisonnement (l'algorithme) est là. Même si ce n'est pas le mien, il est aussi bon.
Je pense que le mien est meilleur :p, uniquement (outre que c'est moi qui l'ait fait), parce qu'il tient compte d'un possible Copier/Coller sur plusieurs cellules.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'Déclaration =====================================
Dim Plage As Range, Cel As Range
'MEI =============================================
On Error GoTo Err_Change
Application.EnableEvents = False
'Colonne F ======================================
Set Plage = Intersect(Target, Union([F18:F37], [F42:F54], [F59:F74], [F79:F92]))
If Not (Plage Is Nothing) Then
    For Each Cel In Plage
        If Cel = 1 Then
            Cells(Cel.Row, "J") = 0
        Else
            Cells(Cel.Row, "J") = 1
        End If
    Next Cel
End If
'Colonne J ======================================
Set Plage = Intersect(Target, Union([J18:J37], [J42:J54], [J59:J74], [J79:J92]))
If Not (Plage Is Nothing) Then
    For Each Cel In Plage
        If Cel = 1 Then
            Cells(Cel.Row, "F") = 0
        Else
            Cells(Cel.Row, "F") = 1
        End If
    Next Cel
End If

Sortie_Change:
    Application.EnableEvents = True
    Exit Sub
Err_Change:
    MsgBox Err.Description, vbOKOnly + vbCritical, "Erreur Excel n°" & Err.Number
    Resume Sortie_Change
End Sub
Je dissocie la colonne F de la colonne J, c'est plus facile à comprendre :
les deux traitements sont similaires. La vraie différence avec ton code, c'est qu'à chaque fois, Excel sait sur quelle ligne il doit travailler, parce que je le lui dis. Une autre macro qui ressemble plus à la tienne :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'Déclaration =====================================
Dim Plage As Range, Cel As Range
'MEI =============================================
On Error GoTo Err_Change
Application.EnableEvents = False
'Création de Plage -------------------------------
Set plage = Intersect(Range("F:F,J:J"), Range("18:37,42:54,59:74,79:92,97:99"))
Set plage = Intersect(Target, plage)    'cellules modiifées de F & J
'Traitement ======================================
If Not (Plage Is Nothing) Then
'S'il existe au moins une cellule de F ou J qui a été modifiée
    For Each Cel In Plage
    'Pour chaque cellule modifiée
        Select Case Cel.Column
            Case 6  'colonne F
                If Cel = 1 Then             'si F=1
                    Cells(Cel.Row, "J") = 0
                Else                        'sinon => F=0
                    Cells(Cel.Row, "J") = 1
                End If
            Case 10 'colonne J
                If Cel = 1 Then             'si J=1
                    Cells(Cel.Row, "F") = 0
                Else                        'sinon => J=0
                    Cells(Cel.Row, "F") = 1
                End If
        End Select
    Next Cel
End If

Sortie_Change:
    Application.EnableEvents = True
    Exit Sub
Err_Change:
    MsgBox Err.Description, vbOKOnly + vbCritical, "Erreur Excel n°" & Err.Number
    Resume Sortie_Change
End Sub

Sub test()
Application.EnableEvents = True
End Sub
Je l'ai un peu plus commentée.
Ayant fait des tests, en pas-à-pas, je me suis retrouvé avec la macro qui ne fonctionnait plus => normal, je l'ai interrompue brutalement, en plein milieux, donc sans passer sur la sortie obligatoire. Comme je suis lent, j'ai mis quelque temps à m'en rendre compte, et j'ai découvert une nouvelle façon de définir plage. Comme Excel n'accepte pas de mélanger Rows et Columns, j'ai tout passé en Range.
J'ai aussi créé une macro pour relancer manuellement la gestion des évènements.

Là, on voit bien qu'on a des plages de F et de J, dont on traite les modifications.

Si on veut "planter" le système, on peut toujours : F18=1 (macro met J18=0) => copier F18 => sélection de J19, J20, F19, F20 => coller : J19, J20, F19, F20 passent à 1 => lancement de la macro => Plage=(J19:J20,F19:F20) => traitement un par un :
J19=1 => F19=0 => J20=1 => F20=0 => on arrive sur le traitement des F19 et F20 => comme ils sont à 0 (du fait de la macro), Les J passent à 1 (rien ne change).
C'est dû au fait qu'excel ne remet pas dans l'ordre tarjet.

Là, tu vois le but des dépanneurs : résoudre un problème qu'ils n'auraient jamais eu, pour découvrir une autre manière d'utiliser Excel. Faut pas croire qu'on travaille gratuitement. On travaille pour augmenter ou modifier notre savoir, tout comme les demandeurs !
C'est ça la notion d'entraide des forums (outre gonfler mon ego;)).
A+

Edit : Je pense que la macro, avant de tester les 0 ou 1, devrait vérifier la présence de texte dans les colonnes C et G (ou range("Cx").mergearea (idem pour G) pour être plus précis, vu que ce sont des cellules fusionnées).
 
Dernière édition:

Imy55

XLDnaute Nouveau
Re : Vider les deux cellules si une autre est remplie

Merci pour l’aide,
Tes codes marches toujours très bien. T’es le meilleur.
Je veux juste s’avoir est ce que j’ai la possibilité d’ouvrir mes feuilles .xlsm dans des forms VB6 ou le VB.net
Cela fait 4 mois que je cherche cette solution mais en vain et il me reste moins d’une semaine pour déposé mon projet.
Cordialement
Imy55
 

Discussions similaires

Statistiques des forums

Discussions
312 345
Messages
2 087 477
Membres
103 555
dernier inscrit
Chtio