Microsoft 365 VBA : Si une cellule contient alors

Chessnocoma

XLDnaute Junior
Bonjour,

Je bloque sur une macro assez simple elle est censé retourné une valeur dans la colonne J si une cellule est égal à S11.
Sachant que la colonne A résulte d'une formule, cela ne fonctionne pas.
Je ne peux pas utiliser de formule car du type Si(A1="S11"; S11;"") voila pourquoi j'essaie de le faire sous VBA.
Si j'écrit manuellement S11 dans la colonne cela fonctionne.

Mon code actuel est le suivant :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 And Target.Column = 1 Then

Select Case Target.Value
Case "S11"
Cells(Target.Row, 11) = "S11"

Case Else
Cells(Target.Row, 11) = ""

End Select
End If
End Sub

Je vous joint un fichier, dans l'idéal, si la colonne B contient "S11" alors dans la colonne J je retrouve S11.

Merci de votre aide,

A bientôt,

Jessy
 

Pièces jointes

  • Test si cellule contient.xlsm
    14.1 KB · Affichages: 48
Solution
Bonsoir le fil

Il fait gris dehors, faut que je m'occupe
Alors voici comment ...je perds mon temps dans VBA
(alors qu'un tableau structuré et les formules idoines pourraient suffire)
• Mais je me demande bien pourquoi le demandeur veut du VBA

VB:
Private Sub Worksheet_Change(ByVal T As Range)
If T.Column <> 2 Then Exit Sub
T(1, 10) = IIf(T = "S11", "S11", Null)
T(1, 0) = IIf(T = "S11", "S11", Null)
End Sub

fanfan38

XLDnaute Barbatruc
Bonjour
T'étais pas loin
Case Is = "S11"
Mais j c'est 10 et pas 11?
donc
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Target.Column = 1 Then
        Select Case Target.Value
        Case Is = "S11"
            Cells(Target.Row, 10) = "S11"
        Case Else
            Cells(Target.Row, 10) = ""
       End Select
    End If
End Sub
par contre tu parles de colonne B?
A+ François
 

Chessnocoma

XLDnaute Junior
Bonjour à tous et merci de vos réponses,

Dans mon fichier de base toutes les données proviennent de formules donc je ne peux pas me baser sur la modification de la cellule comme prévu initialement pour lancer le code, car ces cellules ne seront jamais modifier manuellement c'est ma première contrainte.

Je ne peux pas utiliser de formule dans la colonne K car je souhaite intégrer cette fonction dans un fichier plus large qui si cette colonne n'est pas vide Excel me colore une forme.

Dans ce fichier, j'ai fait plusieurs test et si dans la colonne K, je note une formule, et même si la formule me renvoie à rien, Excel détecte tout de même que la cellule n'est pas vide car il y a une formule dedans et donc me colore la forme.

Du coup je me suis dit que si je pouvais contourner le problème facilement avec cette fonction

A bientôt,
Jessy
 

Chessnocoma

XLDnaute Junior
Bonjour,

Après plusieurs test voici une macro qui répond au besoin, j'ai mis dans la colonne A la formule suivante :
=SI(ESTNUM(CHERCHE("S11";B1));"S11";"")
Ce qui me permets de ne pas avoir de formule dans la colonne K.

Sub Test ()
Dim cellule As Range
For Each cellule In Range("A:A")
Select Case cellule.Value
Case "S11"
cellule.Offset(0, 10) = "S11"
End Select
Next cellule
End Sub

A bientôt et merci beaucoup,

Jessy
 

soan

XLDnaute Barbatruc
Inactif
@Chessnocoma, le fil,

Bonjour Jessy,

Select Case .. End Select sert à tester plusieurs cas ; donc pour un seul cas,
un seul test
If suffit ; pour 2 cas seulement, utiliser : If .. Then .. Else ;
pour 3 cas et plus, utiliser selon les cas
ElseIf ou Select Case :
VB:
Dim pays$, capitale$

If pays = "France" Then
  capitale = "Paris"
ElseIf pays = "Angleterre" Then
  capitale = "Londres"
ElseIf pays = "Espagne" Then
  capitale = "Madrid"
ElseIf pays = "Italie" Then
  capitale = "Rome"
End If
la même chose en version Select :
VB:
Dim pays$, capitale$

Select Case pays
  Case "France": capitale = "Paris"
  Case "Angleterre": capitale = "Londres"
  Case "Espagne": capitale = "Madrid"
  Case "Italie": capitale = "Rome"
End Select
pour ton code VBA avec un seul test, je l'ai donc réécrit ainsi :
VB:
Sub Test()
  Dim cellule As Range
  For Each cellule In Columns("A")
    If cellule = "S11" Then cellule.Offset(, 10) = "S11"
  Next cellule
End Sub
pour éviter de référencer toute la colonne A :
VB:
Sub Test()
  Dim dlg&, lig&: Application.ScreenUpdating = 0
  dlg = Cells(Rows.Count, 1).End(xlUp).Row
  For lig = 3 To dlg
    With Cells(lig, 1)
      If .Value = "S11" Then .Offset(, 10) = "S11"
    End With
  Next lig
End Sub
attention : le code VBA ci-dessus suppose que tu as une ligne d'en-têtes
en ligne 2, et que ta première ligne de données est la ligne 3.


soan
 

soan

XLDnaute Barbatruc
Inactif
@Chessnocoma

ton fichier en retour, version n° 1.

y'a aucune formule, même pas en colonne A. ;)

les "x" en A1:A3 et en K1:K3 sont là pour te montrer que la macro
va les remplacer par "S11" ou les effacer, selon les cas.

Ctrl e ➯ pour une ligne donnée, ça met "S11" en A et en K si B
contient "S11", sinon, ça efface le contenu de A et K.


VB:
Option Explicit

Sub Essai()
  Dim dlg&, lig&: Application.ScreenUpdating = 0
  dlg = Cells(Rows.Count, 2).End(xlUp).Row
  If dlg = 1 And IsEmpty([B1]) Then Exit Sub
  For lig = 1 To dlg
    With Cells(lig, 2)
      If InStr(.Value, "S11") > 0 Then
        .Offset(, -1) = "S11": .Offset(, 9) = "S11"
      Else
        .Offset(, -1) = Empty: .Offset(, 9) = Empty
      End If
    End With
  Next lig
End Sub
si tu modifies les données de B, n'oublie pas de faire Ctrl e
pour actualiser les résultats de A et K.


soan
 

Pièces jointes

  • Test si cellule contient v1.xlsm
    14.5 KB · Affichages: 22
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@Chessnocoma

ton fichier en retour, version n° 2.

y'a aucune formule, même pas en colonne A. ;) (bis repetita)

cette fois, y'a plus de macro à lancer ; ça fait le job "à la volée" :
tu as juste à modifier, ajouter, ou supprimer une donnée en
colonne B ➯ ça met "S11" en A et K ou ça les efface.

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .CountLarge > 1 Then Exit Sub
    If .Column <> 2 Then Exit Sub
    Application.ScreenUpdating = 0
    If InStr(.Value, "S11") > 0 Then
      .Offset(, -1) = "S11": .Offset(, 9) = "S11"
    Else
      .Offset(, -1) = Empty: .Offset(, 9) = Empty
    End If
  End With
End Sub
soan
 

Pièces jointes

  • Test si cellule contient v2.xlsm
    13.5 KB · Affichages: 19

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Il fait gris dehors, faut que je m'occupe
Alors voici comment ...je perds mon temps dans VBA
(alors qu'un tableau structuré et les formules idoines pourraient suffire)
• Mais je me demande bien pourquoi le demandeur veut du VBA

VB:
Private Sub Worksheet_Change(ByVal T As Range)
If T.Column <> 2 Then Exit Sub
T(1, 10) = IIf(T = "S11", "S11", Null)
T(1, 0) = IIf(T = "S11", "S11", Null)
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re
=>Chess:
Cette syntaxe VBA n'est ni mieux, ni pire.
Nulle part, assurément, on pourra le lire.
(Sauf peut-être dans un vieux grimoire estonien dédié au Grand Tabulateur US)
C'est une petite syntaxe "à la sauce Staple" ,qui vit sa vie de syntaxe dans son VBE.
C'est qu'il faut en trouver de l'occupation pour déconfiner en paix.
;)

Surtout que j'ai fini d'étendre ma lessive et de passer l'aspi.
Ah oui, il me reste les carreaux à faire
(/note à moi-même pour plus tard- P.Lewis Tribute)
Bon, bah je vais mettre mon tableurier pour ce faire.
;)
 
Dernière édition:

Chessnocoma

XLDnaute Junior
Bonsoir à tous,

Merci pour toutes vos réponses !
J'ai pu me dépatouiller en contournant le problème, mais je vais reprendre votre code, j'ai l'impression que le temps de traitement est plus long en faisant utilisant ma méthode qui est je l'avoue un peu bancale

Je vais essayé de me plonger dedans pour apprendre au maximum !

Merci beaucoup soan et stapple

A bientôt,

Jessy
 

Discussions similaires

Réponses
5
Affichages
125

Statistiques des forums

Discussions
311 725
Messages
2 081 949
Membres
101 851
dernier inscrit
vaiata