Problème de changement de texte dans cellule

[Résolu]
Signaler
Messages postés
7
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
11 septembre 2008
-
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
-
Bonjour,

Je débute en VBA. J'aimerai que le texte d'une cellule change par rapport à une autre. J'ai créé le code suivant :

Private Sub Worksheet_Change(ByVal Target As Range)

If Range("F21").Text = "Texte 1" Then
Range("C23").Value = "Reponse1"
ElseIf Range("F21").Text = " Texte2" Then
Range("C23").Value = "Reponse1"
Else: Range("C23").Value = "Reponse2"
End If

End Sub

L'idée étant que la Cellule C23 affiche "Reponse" 1 si la F21 affiche "Texte 1" ou "Texte 2". Sinon, elle affichera "Reponse 2".

Cela fonctionne, mais il y a un long lag (5 secondes environ) à chaque fois que la fonction est appelée. Comment faire ?


Merci

10 réponses

Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
l'évenement change dans VBA excel ne s'applique que pour l'objet woksheet
donc pas possible de l'utiliser pour la cellule
et comme je n'ai jamais utilisé VBA pour ce genre d'action je ne vois pas trop que te dire
peut être utiliser target
Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.column <>6 Or target.row<>21 then exit sub  'sortir imédiatement si ce n'est pas la cellule F21 qui a été modifiée 
 If Range("F21").Text "Texte 1" Or  Range("F21").Text " Texte 2" Then
         Range("C23").Value = "Reponse1"
 Else
          Range("C23").Value = "Reponse2"
 End If
        

End Sub

c'est de la bidouille mais ça doit marcher

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

bonjour,

la fonction conditionnelle SI serait plus adaptée.. à mon avis; le code vba est inutile ici... à moins que ce ne soit pour apprendre.

remarque : les ":" après le else, je suppose que cette une erreur de frappe car sinon, c'est interprété comme une étiquette, me semble-t-il..
ensuite, utilise la methode Range("C23).Formula au lieu de text et value. (si mes souvenirs sont bons)

thierry la fronde
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
bonjour
tu dis :" L'idée étant que la Cellule C23 affiche "Reponse" 1 si la F21 affiche "Texte 1" ou "Texte 2". Sinon, elle affichera "Reponse 2".
"
alors pourquoi ne l'écris tu pas dans ta macro ?If Range("F21").Text "Texte 1" Or  Range("F21").Text " Texte2" Then

         Range("C23").Value = "Reponse1"

 Else
          Range("C23").Value = "Reponse2"

 End If

correspondrait mieux à ce que tu veux faire

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
7
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
11 septembre 2008

En effet, c'est plus simple comme ça, mais le résultat est le même :

Ca fonctionne, mais une fois le texte changé dans C23, il y a un lag d'environ cinq secondes.

A quoi est-ce du ? Cette condition demande-t-elle autant de calcul que ça au CPU ?
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
en fait ton probleme de lag vient à mon avis de l'évenement dans lequel tu as mis ton code
car quand il s'éxécute et qu'il change la valeur de la cellule C23 il se relance puisque c'est un changement dans la worksheet et de ce fait il s'éxécute un grand nombre de fois

un autre détail dans ton code il faudrait choisir si c'est " .text " ou  ".value" mais éviter de mélanger ces deux propriétés non que ça change grand chose dans le cas présent mais c'est plus propre

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
7
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
11 septembre 2008

Oui, en effet, j'ai pensé à ça. Actuellement, mon événement c'est Worksheet_Change. Tu me conseilles quoi ? J'ai pas encore bien saisi tous les événements.

Sinon, merci pour le tuyau. C'est quoi la différence entre .texte et .value ? Tant qu'on reste dans les textes uniquement, on peut utiliser .texte, sinon faut utiliser .value ? C'est bien ça ?

Un gros merci en tout cas !
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
dans quel évenement le mettre ... cela dépend du reste de ton code et de ce que tu veux obtenir
quand à value plutot que text  le différence et que value renvoit  une donnée de type variant
alors que text renvoit une donnée de type string
donc un texte en .value se code avec 22 octets de plus qu'en .text
pour de petites applis ce n'est pas tres grave mais pour des trucs bien trapus ça peut  ralentir l'éxécution de façon sensible
String
(longueur fixe), Longueur de la chaîne, 1 à environ 65 400, ----
Variant
(nombres), 16 octets, Toute valeur numérique, avec la même plage de valeurs
qu'une donnée de type Double, ----
Variant
(caractères), 22 octets + longueur de la chaîne, Même plage de valeurs qu'une donnée de type
String de longueur variable

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
7
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
11 septembre 2008

D'acc, merci pour les précisions quant à text/value.

Quant à ce que je veux obtenir, c'est pour l'instant rien de plus que ça : changer le texte d'une cellule en fonction de celui d'une autre.

Est-ce possible de créer une fonction dont l'événement est le changement d'une cellule (et non pas d'une worksheet, comme c'est le cas actuellement) ? Si oui, comment (syntaxe) ?

En tout cas merci, très chouette ce forum !
Messages postés
7
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
11 septembre 2008

En effet, ça fonctionne nickel, merci pour le truc !
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
Salut,

Pour completer la reponse de pile_poil :

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
     If .Address (RowAbsolute:=False, ColumnAbsolute:=False) = "F21" then          If  .Text "Texte 1" Or  .Text " Texte 2" Then
                 Range("C23").Value = "Reponse1"
         Else
                 Range("C23").Value = "Reponse2"
         End If    
    End if
End with 
End Sub

A+