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 Sub

it'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 Sub

voici le fichier :

8exo-ericw.xlsm (13.25 Ko)

screen

* sélectionne A6 ; appuie sur la touche SupprA6 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!!

7rooming-list.xlsm (268.92 Ko)

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

Rechercher des sujets similaires à "ajout terme valeur"