Simplification d une commande repetitive.

Résolu
lilikel Messages postés 20 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 12 septembre 2008 - 22 août 2008 à 12:26
cs_denis11 Messages postés 1 Date d'inscription vendredi 5 septembre 2008 Statut Membre Dernière intervention 7 septembre 2008 - 5 sept. 2008 à 21:21
Bonjour a tous,

J'ai redigee la macro suivante




Sub macro1()
If Range("i25") Like "0*" Then
    Range("l25") = "RA2000"
ElseIf Range("i25") Like "9*" Then
    Range("l25") = "UO1000"
Else
    Range("l25") = ""
End If
End Sub

Mon probleme est le suivant: les 30 lignes suivantes doivent etre parametrees de la meme maniere. Or si j'applique une telle macro pour 4 lignes mon fichier fonctionne au ralenti.
Y a t il moyen de simplifier cette commande pour les 30 lignes: un equivalent de recopier vers le bas ou par une formule globale??

merci beaucoup par avance

13 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
22 août 2008 à 14:57
Salut
Est ce que ceci ralentit beaucoup ton fichier

Sub macro1()
Dim i As Long
   Application.ScreenUpdating = False
   
   For i = 25 To 55
       If Range("i" & CStr(i)) Like "0*" Then
           Range("l" & CStr(i)) = "RA2000"
       ElseIf Range("i" & CStr(i)) Like "9*" Then
           Range("l" & CStr(i)) = "UO1000"
       Else
           Range("l" & CStr(i)) = vbNullString
       End If
   Next i
   Application.ScreenUpdating = True
End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i€n
Pensez: Réponse acceptée
3
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
22 août 2008 à 21:41
Bonjour ,

Voici le code que je te propose.
Il permet de déclencher le macro quand une saisie est effectuée dans la plage [I25:I55].

-------------------------------------------------

 Private Sub Worksheet_Change(ByVal Target As Range)
 '----------------------------------------------'
 'Programme en VBA Excel 2000
 'Lance le macro sur saisie dans la plage [I25:I55]
 '----------------------------------------------'
  
  Dim LigneSelectionnée As Long
  Dim ColonneSelectionnée As Long
 
  Dim LigneTableauHaut As Long
  Dim LigneTableauBas As Long
  Dim ColonneTableauGauche As Long
  Dim ColonneTableauDroite As Long
  
  'Attribution des limites du tableau pour lancement Macro
    LigneTableauHaut = 25
    LigneTableauBas = 55
    ColonneTableauGauche = 9
    ColonneTableauDroite = 9
   
  'Numero Ligne et Colonne selectionnées
   LigneSelectionnée = Target.Row
   ColonneSelectionnée = Target.Column
  
  'Lance le macro dans la plage [I25:I55]
  If LigneSelectionnée >= LigneTableauHaut And _
     LigneSelectionnée <= LigneTableauBas And _
     ColonneSelectionnée >= ColonneTableauGauche And _
     ColonneSelectionnée <= ColonneTableauDroite Then
    
     'Appelle le macro1
      Call macro1
   End If
 
 End Sub
-------------------------------------------------
La plage [I25:I55] doit est formaté en "Texte"

Bonne Travail.
3
lilikel Messages postés 20 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 12 septembre 2008
22 août 2008 à 15:10
Tout d'abord merci pour ta reponse

mais en fait le code ne marche pas.
Mais je pense que ca doit etre moi qui est fait une erreur
Dans l'element sheet 1 j ai ecris ceci pour appeler ma macro mais je suis quasiment sure que c est pas ca



Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("i" & CStr(i)) Then
    Call macro1
    End If
End sub


Qu'en penses tu ?
0
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
22 août 2008 à 15:42
Bonjour lilikel ,

Quelle est le but de cette fonction

Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("i" & CStr(i)) Then
    Call macro1
    End If
End sub

A++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lilikel Messages postés 20 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 12 septembre 2008
22 août 2008 à 15:49
bonjour dedenet2,



jrivet m a propose cette macro





Sub macro1()
Dim i As Long
   Application.ScreenUpdating = False
      For i = 25 To 55
       If Range("i" & CStr(i)) Like "0*" Then
           Range("l" & CStr(i)) = "RA2000"
       ElseIf Range("i" & CStr(i)) Like "9*" Then
           Range("l" & CStr(i)) = "UO1000"
       Else
           Range("l" & CStr(i)) = vbNullString
       End If
   Next i
   Application.ScreenUpdating = True
End Sub







pour remplacer ma macro, qui repetee sur plusieur ligne ralentit le fichier.
Mais pour l appliquer il me semble qu il faut que j appelle la macro par une fonction mais je ne sais pas quoi designer comme target .
Apres il se peut que j ai mal compris la manip
0
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
22 août 2008 à 16:07
Re....
Ok , tu ne reponds pas à ma question.Je me suis peut être mal exprimé.

A quel moment veux tu enclenchés ta macro ?

A+
0
lilikel Messages postés 20 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 12 septembre 2008
22 août 2008 à 16:12
oups desolee


En fait je voudrait que la macro se declenche chaque fois qu une donnee est saisie dans une cellule appartenanta a la plage i25:i55.
0
lilikel Messages postés 20 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 12 septembre 2008
26 août 2008 à 09:56
merci a tous les 2 c est parfait
La macro fonctionne bien et le declenchement aussi sans aucun ralentissement

merci beaucoup
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
26 août 2008 à 10:07
Re,
Ou bien on se sert des fonction mise à disposition par Excel pour savoir si une Cellule est contenu dans une plage (Fonction InterSec) plus sympa non?

Private Sub Worksheet_Change(ByVal Target As Range)
   If InRange(Target, Range("I25:I55")) Then Call macro1
End Sub<hr />

Function InRange(Range1 As Range, Range2 As Range) As Boolean
' returns True if Range1 is within Range2
Dim InterSectRange As Range
   Set InterSectRange = Application.Intersect(Range1, Range2)
   InRange = Not InterSectRange Is Nothing
   Set InterSectRange = Nothing
End Function<hr />
, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i€n
Pensez: Réponse acceptée
0
lilikel Messages postés 20 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 12 septembre 2008
26 août 2008 à 10:13
salut

en fait je debute totalement en vba....
autant j ai compris les commandes faites precedement autant celle la j ai du mal a comprendre ce qu elle fait
Si c etait ds l aide d excel je suis desolee. le mien est configuree en anglais il se peut que je sois passe dessus sans comprendre.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
26 août 2008 à 10:36
Re,
Bah il n'y pas beaucoup à comprendre,
InRange  Retourne Vrai si Range1 est COntenu dans Range2 donc ici Vrai si Target est contenu dans la plage I25:I55

@+: Ju£i€n
Pensez: Réponse acceptée
0
dedenet2 Messages postés 372 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 22 juillet 2013 2
26 août 2008 à 18:37
Bonjour ,
Jrivet , pas mal aussi cette fonction !
A+
0
cs_denis11 Messages postés 1 Date d'inscription vendredi 5 septembre 2008 Statut Membre Dernière intervention 7 septembre 2008
5 sept. 2008 à 21:21
0
Rejoignez-nous