Adresse cellule modifiée
Bonjour,
je n'arrive pas à mettre le classeur joint car trop volumineux
objectif comparaison de cellule ou de sélection entre feuille 1 et 2 ou 3 et 4.
1- pour chaque cellule modifiée (count=1) je lance sub verifcellbycell dans workbook sheetchange
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
a = 1
b = 2
c = 3
e = 4
If Target.Count = 1 Then
If mdp1 = True And Sheets(a).ProtectContents = False _
And Sheets(b).ProtectContents = False And Sheets(c).ProtectContents = False _
And Sheets(e).ProtectContents = False Then
verificationcellbycell
End If
End If
If Target.Count > 1 Then
If mdp1 = True And Sheets(a).ProtectContents = False _
And Sheets(b).ProtectContents = False And Sheets(c).ProtectContents = False _
And Sheets(e).ProtectContents = False Then
verificationselectionbyselection
End If
End If
End Sub
Puis dans verifcellbycell
Sub verificationcellbycell()
a = 1
b = 2
c = 3
e = 4
If ActiveSheet.Index = a Then
Set d = Sheets(b)
ElseIf ActiveSheet.Index = b Then
Set d = Sheets(a)
End If
If ActiveSheet.Index = c Then
Set d = Sheets(e)
ElseIf ActiveSheet.Index = e Then
Set d = Sheets(c)
End If
If ActiveSheet.Index = a Or ActiveSheet.Index = b Then
If d.Cells(ligne, colonne).Value = "" Or Cells(ligne, colonne).Value = "" Then
d.Cells(ligne, colonne).Interior.ColorIndex = xlNone
Cells(ligne, colonne).Interior.ColorIndex = xlNone
Exit Sub
End If
End If
If ActiveSheet.Index = a Or ActiveSheet.Index = b Then
If d.Cells(ligne, colonne).Value = Cells(ligne, colonne).Value Then
Cells(ligne, colonne).Interior.ColorIndex = 4
Else
Cells(ligne, colonne).Interior.ColorIndex = 3
End If
End If
If ActiveSheet.Index = c Or ActiveSheet.Index = e Then
If d.Cells(ligne, colonne).Value = "" Or Cells(ligne, colonne).Value = "" Then
d.Cells(ligne, colonne).Interior.ColorIndex = xlNone
Cells(ligne, colonne).Interior.ColorIndex = xlNone
Exit Sub
End If
End If
If ActiveSheet.Index = c Or ActiveSheet.Index = e Then
If Cells(ligne, colonne).Value = d.Cells(ligne, colonne).Value Then
Cells(ligne, colonne).Interior.ColorIndex = 4
Else
Cells(ligne, colonne).Interior.ColorIndex = 3
End If
End If
End Sub
par ex : si je suis dans la feuille 1, je souhaiterais comparer la valeur de la cellule modifiée de la feuille 1 à la même dans la feuille 2 et changer la couleur suivant les tests
mais je n'arrive pas à récupérer l'adresse de la cellule modifiée dans le sub verifcellbycell ! (je n'arrive pas à récupérer dans les variables ligne et colonne la valeur de la ligne et colonne de la cellule modifiée)
2- mon fichier est super long à l'ouverture et fermeture car assez volumineux (5,5Mo). Pourtant 5 macros pas compliquées. Mais j'ai des sub qui affiche ou masque des lignes et colonnes. cela peut provenir de cela ?
ex : affichage colonne
Sub affichagecolonne()
a = 1
b = 2
Sheets(a).Range("BG:BN").EntireColumn.Hidden = False
Sheets(b).Range("BG:BN").EntireColumn.Hidden = False
Sheets(a).Select
Range("C5").Select
End Sub
Merci pour votre aide,
merci
jasserin
edit Dan : enlevé Urgent du titre du sujet. Merci de lire les règles du forum
Bonjour
Ce que je ferais pour ton 1er problème
Macro dans ThisWorkbook
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
If mdp1 = True And Sheets(1).ProtectContents = False _
And Sheets(2).ProtectContents = False And Sheets(3).ProtectContents = False _
And Sheets(4).ProtectContents = False Then
If Target.Count = 1 Then
verificationcellbycell Target
Else
verificationselectionbyselection
End If
End If
End SubMacro dans un module standard
Sub verificationcellbycell(Cellule As Range)
Dim Ws As Worksheet
Select Case ActiveSheet.Index
Case 1
Set Ws = Sheets(2)
Case 2
Set Ws = Sheets(1)
Case 3
Set Ws = Sheets(4)
Case 4
Set Ws = Sheets(3)
End Select
If Cellule = "" Or Ws.Range(Cellule.Address) = "" Then
Cellule.Interior.ColorIndex = xlNone
Ws.Range(Cellule.Address).Interior.ColorIndex = xlNone
ElseIf Cellule = Ws.Range(Cellule.Address) Then
Cellule.Interior.ColorIndex = 4
Else
Cellule.Interior.ColorIndex = 3
End If
End SubPour ton 2ème problème voir
https://forum.excel-pratique.com/applications/degraissez-le-mammouth-t4627.html
Bonjour,
Merci beaucoup banzai !
Pb résolu !
à bientôt
jasserin
Bonjour banzai64,
Juste une question dans l'appel de la macro verifcationcellbycell, il y a le mot target en suivant, peux tu m'expliquer pourquoi ?
merci beaucoup,
jasserin
Bonjour
Le moyen le plus simple de transmettre quelle cellule vient d'être modifiée
On pourrait utiliser une variable globale mais inutile dans ce cas
rebonjour banzai64,
autant battre le fer.... je conserve donc le mot target mais je ne pige pas...peux tu m'expliquer un peu plus ce que cet argument implique ? ou alors une doc sur ce type d'écriture pour l'appel d'une macro avec un argument associé ?
si je comprends bien, l'argument de workbook sheetchange (sh as object, byval as target) renvoie la feuille du changement dans sh et la cellule modifiée dans target. le fait de mettre dans l'appel de la macro verifcationcellbycell le mot target transmet l'adresse de ma cellule à la macro ? si c'est cela, je comprends pourquoi on m'a indiqué dernièrement de ne pas mettre de variable public car pour moi c'était le seul moyen (que je voyais) pour transmettre la valeur d'une variable de this workbook dans une macro.
Si tu peux confirmer ou corriger mon raisonnement..
parce que j'ai également une autre macro pour comparer des sélection. c'est à dire si dans la feuille 2 par exemple, je colle plusieurs cellules d'un même coup, je souhaiterais comparer la sélection collée dans la feuille 2 aux cellules de la même sélection dans la feuille 1. En fait, j’inscris dans la variable "u" l'adresse de la sélection collée dans la feuille 2 et je vais comparer chaque cellule de cette sélection avec celle de la feuille 1. cela bug à If Cellule = "" Or Ws.Range(Cellule.Address) = "" Then
message incompatibilité de type ???
Sub verificationselectionbyselection( cellule As Range)
u = Selection.Address
a = 1
b = 2
c = 3
e = 4
Select Case ActiveSheet.Index
Case a
Set Ws = Sheets(b)
Case b
Set Ws = Sheets(a)
Case c
Set Ws = Sheets(e)
Case e
Set Ws = Sheets(c)
End Select
For Each cell In Range(u)
If Cellule = "" Or Ws.Range(Cellule.Address) = "" Then
Cellule.Interior.ColorIndex = xlNone
Ws.Range(Cellule.Address).Interior.ColorIndex = xlNone
ElseIf Cellule = Ws.Range(Cellule.Address) Then
Cellule.Interior.ColorIndex = 4
Else
Cellule.Interior.ColorIndex = 3
End If
Next cell
End Sub
encore merci pour ton aide,
et désolé au grand manitou pour le mot urgent, j'avais pas lu..
merci
jassserin
Bonjour
jasserin a écrit :si je comprends bien, l'argument de workbook sheetchange (sh as object, byval as target) renvoie la feuille du changement dans sh et la cellule modifiée dans target.
Exact : Mais Target peut représenter LES cellules modifiées
Macro à placer dans ThisWorkbook
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
If mdp1 = True And Sheets(1).ProtectContents = False _
And Sheets(2).ProtectContents = False And Sheets(3).ProtectContents = False _
And Sheets(4).ProtectContents = False Then
verificationcellbycell Target
End If
End SubMacro à placer dans un module standard
Option Explicit
Sub verificationcellbycell(Cellule As Range)
Dim Ws As Worksheet
Dim Cel As Range
If Cellule.Count > 1 Then
For Each Cel In Cellule
verificationcellbycell Cel
Next Cel
Exit Sub
End If
Select Case ActiveSheet.Index
Case 1
Set Ws = Sheets(2)
Case 2
Set Ws = Sheets(1)
Case 3
Set Ws = Sheets(4)
Case 4
Set Ws = Sheets(3)
End Select
If Cellule = "" Or Ws.Range(Cellule.Address) = "" Then
Cellule.Interior.ColorIndex = xlNone
Ws.Range(Cellule.Address).Interior.ColorIndex = xlNone
ElseIf Cellule = Ws.Range(Cellule.Address) Then
Cellule.Interior.ColorIndex = 4
Else
Cellule.Interior.ColorIndex = 3
End If
End SubComme cela tout les cas seront traités
super !
merci beaucoup pour la leçon. je prends note !
encore merci pour les explications
bonne fin de journée