Ajout d'un terme si valeur dans cellule
Salut
Je souhaite qu'un mot ou groupe de mots (selon ce que je définis dans la macro) s'ajoute automatiquement à la valeur d'une cellule de la ligne 3 dès que j'écris une valeur numérique dans la cellule de cette ligne.
Pour essayer j'ai définis seulement 6 colonnes (A - F) mais en fait je souhaite que cela soit sur toute la ligne 3.
Mais la macro suivante copie le terme #Rooms: l'un à la suite de l'autre à l'infini même dans les cellules vides (et pas un dans chaque cellule non vide) puis bloque l'application Excel qui parfois même se ferme!
Qu'est ce qui ne va pas dans cette macro?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Range("A3:F3")
If c.Value <> "" Then c.Value = "#Rooms: " & c.Value
Next
End Sub
Bonjour Ericw,
Essaye comme ceci,
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Range("A3:F3")
If IsEmpty(c) = False And IsNumeric(c) Then c.Value = "#Rooms: " & c
Next
End Subit's perfect thanks!!
I would like to add something like that: if the cell in row 6 is empty then the cell in row 3 in the same column will be deleted from contents
I tried to do that but it doesn't work
Dim c1 As Range
Dim c2 As Range
For Each c2 In Range("A6:FF6")
If IsEmpty(c2) = True Then c1.Range("A3:FF3").Value.ClearContents
Next
oups, j'ai repondu en Anglais, par habitude
Hi ericw, Florian53,
je te propose ce code VBA :
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If Intersect(Target, [A6:F6]) Is Nothing Then Exit Sub
If IsEmpty(.Value) Then .Offset(-3).ClearContents Else _
If IsNumeric(.Value) Then .Value = "#Rooms: " & .Value
End With
End Sub(j'ai fait un gros effort pour traduire mon code VBA en anglais)
is it ok ?
dhany
ca ne fonctionne pas
les cellules de la lignes 3 ne se vident pas de leur contenu lorsque les celulles de la ligne 6 se vident...
* supposons que tu as X dans les cellules A3:F3 et A6:F6
* sélectionne A6 ; appuie sur la touche Suppr ➯ ça efface à la fois A6 et A3
même chose pour les colonnes B à F (une seule colonne à la fois).
n'est-ce pas cela que tu voulais ?
as-tu mis le code dans le module de la feuille et pas dans Module1 ?
dhany
@ericw
lis d'abord mon post précédent, puis celui-ci.
attention : dans mon code précédent, y'a un bug pour l'écriture de "#Rooms: " & .Value !
j'ai oublié de désactiver les événements avant, puis de les réactiver après ; code corrigé :
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If Intersect(Target, [A6:F6]) Is Nothing Then Exit Sub
If IsEmpty(.Value) Then
.Offset(-3).ClearContents
Else
If IsNumeric(.Value) Then
Application.EnableEvents = False
.Value = "#Rooms: " & .Value
Application.EnableEvents = True
End If
End If
End With
End Subvoici le fichier :
* sélectionne A6 ; appuie sur la touche Suppr ➯ A6 et A3 sont effacés en même temps
* toujours en A6, saisis 1 et appuie sur Entrée ➯ tu as de nouveau #Rooms: 1
colonnes B à F : ça marche de la même façon, une seule colonne à la fois.
à te lire pour avoir ton avis.
dhany
En effet, si j'efface manuellement la valeur de la cellule de la ligne 6 elle efface aussi celle de la ligne 3.
Mais la valeur de la cellule 6 s'inscrit et s'efface selon une macro qui se trouve dans l'onglet "general" : lorsque des dates sont inscrites /modifiées / effacées dans cet onglet alors elles sont également inscrites/mise à jour/effacées dans les cellules de la ligne 6.
Donc lorsque j'efface les dates de l'onglet "general" les dates sont effacées dans l'onglet "daily" (ligne 6) MAIS la macro n'efface pas les valeurs de la ligne 3 pour les mêmes colonnes qui ont perdu leur valeur dans la ligne 6...
La macro précédente (voir ci-dessous) [qui ajoutait automatiquement un terme à la valeur numérique qu'on inscrivait manuellement dans les cellules de la ligne 3] fonctionnait.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Range("A3:F3")
If IsEmpty(c) = False And IsNumeric(c) Then c.Value = "#Rooms: " & c
Next
End Sub
Le problème était qu'une fois qu'ils y avait déjà des choses écrites dans les cellules des lignes 3 et 6 dans l'onglet "daily", lorsqu'on effectuait un changement ou qu'on effaçait des dates des colonnes F et G dans l'onglet "general", les dates s'effaçaient / se modifiaient effectivement de la ligne 6 en conséquence, MAIS les données déjà écrites en haut à la ligne 3 restaient là-bas..
Cela donnait une situation selon laquelle il n'y avait rien à la ligne 6 de la même colonne mais la cellule à la ligne 3 au-dessus était encore remplie avec l'ancienne valeur...
C'est pourquoi je cherche une macro qui efface la valeur de la ligne 3 à condition que la cellule de la ligne 6 soit vide (je rappelle que la ligne 6 se vide automatiquement et non manuellement en appuyant sur DELETE)
Je joins le fichier
J'espère que c'est un peu plus clair maintenant.
Et merci pour tout!!
Si je décris le processus d'une manière plus simple cela donne ceci:
si A6 est vide (ou se vide son contenu) alors A3 aussi sera sans couleur de fond ni texte (no background color and clear contents in cell A3)
sinon,
si A6 possède une valeur alors:
si A3 est vide = couleur de fond gris clair
sinon, si A3 est rempli = couleur de fond neutre (ie, le fond gris disparait)
et cela continue pour chaque colonne l'une après l'autre...
Ci-après plusieurs exemples de scénarios possibles avec leurs résultats espérés:
A6 reçoit une valeur (automatiquement) ==> A3 se colore en gris clair dans le fond
A6 se vide de son contenu (automatiquement) ==> A3 perd sa couleur de fond
A6 reçoit une valeur (automatiquement) ==> A3 se colore en gris clair dans le fond ==> A3 reçoit une valeur (manuellement) ==> A3 perd sa couleur de fond
A6 se vide de son contenu (automatiquement) ==> A3 perd sa couleur de fond + son contenu est effacé (clear content)
Il ne faut pas oublier que les données de cet onglet sont tous inscrit automatiquement (c'est à dire que l'utilisateur n'inscrit pas lui-même la valeur des cellules en cliquant sur ENTER) à l'exception des valeurs de la ligne 3 qui sont, elles, précisées manuellement.
Ci-après un truc que j'ai essayé de fabriquer mais bien entendu je me suis emmelé les pinceaux
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Dim d As Range
For Each c In Range("A3:BZ3")
If IsEmpty(c) = False And IsNumeric(c) Then c.Value = "#Rooms: " & c
Next
For Each d In Range("a6:bz6")
For Each c In Range("a3:bz3")
If IsEmpty(d) = True Then c.Interior.ColorIndex = 0 And c.Value.ClearContents And d.Interior.ColorIndex = 0
Next
If IsEmpty(d) = False Then d.Interior.ColorIndex = 37 'if cell in row 6 is filled
Next
For Each c In Range("a3:bz3")
If IsEmpty(c) = True Then c.Interior.ColorIndex = 15 ' if cell in row 3 is empty then color background is grey (but only if THERE IS DATA in cell in row 6
If IsEmpty(c) = False Then c.Interior.ColorIndex = 0 ' if cell in row 3 is filled then color background is removed
Next
End Sub
bref...
Je me répond à moi-même.
je me suis arrangé pour les couleur avec le format conditionnel
et finalement je vois que la macro que Dhany m'a proposé finalement fonctionne donc le problème est résolu!!
merci merci merci!
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If Intersect(Target, [A6:BZ6]) Is Nothing Then Exit Sub
If IsEmpty(.Value) Then
.Offset(-3).ClearContents
Else
If IsNumeric(.Value) Then
Application.EnableEvents = False
.Value = "#Rooms: " & .Value
Application.EnableEvents = True
End If
End If
End With
End Sub
Bonjour Eric,
tu a écrit :je vois que la macro que Dhany m'a proposé finalement fonctionne donc le problème est résolu!!
merci merci merci!
merci pour ton retour, et pour avoir passé le sujet en résolu !
bonne fin de week-end.
dhany