Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

séparation des code dans la meme Sub

Ilino

XLDnaute Barbatruc
Forum Bonjour
Question d’ordre générale
Je souhaite un code ou une syntaxe pour séparer mes codes dans la meme sub.. est il possibl ?
grazie
 

Ilino

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

re
exemple dans la fonction Private Sub Worksheet_Change

Code:
'
Private Sub Worksheet_Change(ByVal Target As Range)

'1ere code-------------------------------------------------
Dim mem, sel As Range
If Target.Areas.Count = 1 Then
  Application.EnableEvents = False
  mem = Target.Formula
  Set sel = Selection
  Application.Undo
  Target = mem
  sel.Select
  Application.EnableEvents = True
End If
'----------------------------------------------------------------

'2 eme code-------------------------------------------------
If Target.Column = 18 And Target(1) = "Achevée" _
  Then Target(1, 21) = Date
  
If Target.Column = 18 And Target(1) <> "Achevée" _
  Then Target(1, 21) = ""
'----------------------------------------------------------------

'3 eme code-------------------------------------------------
If Intersect(Target, [E5:E25]) Is Nothing Then Exit Sub
Dim ntab&, lettre$, n&, i&
Target.Select
Application.ScreenUpdating = False
ntab = Val([E5])
Rows("6:2066").Hidden = True
For ntab = 1 To ntab
  Rows(4 + 2 * ntab).Resize(2).Hidden = False
  lettre = Chr(64 + ntab)
  n = Val([E5].Offset(2 * ntab))
  i = Application.Match(lettre, [A:A], 0) - 1
  Rows(i & ":" & i + 2 * n + 1).Hidden = False
  i = Application.Match("Total " & lettre, [A:A], 0) - 1
  Rows(i).Resize(2).Hidden = False
Next
'---------------------------------------------------------------------


End Sub
A+
 

job75

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

Bonsoir Ilino, camarchepas,

Utiliser la variable Static flag :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Static flag As Boolean 'mémorise la variable
If flag Then Exit Sub
flag = True

'1ere code-------------------------------------------------
Dim mem, sel As Range
If Target.Areas.Count = 1 Then
  mem = Target.Formula
  Set sel = Selection
  Application.Undo
  Target = mem
  sel.Select
End If
'----------------------------------------------------------------

'2 eme code-------------------------------------------------
If Target.Column = 18 And Target(1) = "Achevée" _
  Then Target(1, 21) = Date
 
If Target.Column = 18 And Target(1) <> "Achevée" _
  Then Target(1, 21) = ""
'----------------------------------------------------------------

'3 eme code-------------------------------------------------
If Not Intersect(Target, [E5:E25]) Is Nothing Then
  Dim ntab&, lettre$, n&, i&
  Target.Select
  Application.ScreenUpdating = False
  ntab = Val([E5])
  Rows("6:2066").Hidden = True
  For ntab = 1 To ntab
    Rows(4 + 2 * ntab).Resize(2).Hidden = False
    lettre = Chr(64 + ntab)
    n = Val([E5].Offset(2 * ntab))
    i = Application.Match(lettre, [A:A], 0) - 1
    Rows(i & ":" & i + 2 * n + 1).Hidden = False
    i = Application.Match("Total " & lettre, [A:A], 0) - 1
    Rows(i).Resize(2).Hidden = False
  Next
End If
'---------------------------------------------------------------------

flag = False
End Sub
Les Application.EnableEvents ne sont plus nécessaires.

Edit : le 2ème code ne fonctionne pas... Mais maintenant je vais me coucher.

Bonne nuit.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

Bonjour Ilino, le forum,

Le 2ème code fonctionne très bien, il faut aller voir la colonne AL.

Finalement autant utiliser les Application.EnableEvents :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
On Error Resume Next 'sécurité

'1ere code-------------------------------------------------
Dim mem, sel As Range
If Target.Areas.Count = 1 Then
  mem = Target.Formula
  Set sel = Selection
  Application.Undo
  Target = mem
  sel.Select
End If
'----------------------------------------------------------------

'2 eme code-------------------------------------------------
If Target.Column = 18 And Target(1) = "Achevée" _
  Then Target(1, 21) = Date
 
If Target.Column = 18 And Target(1) <> "Achevée" _
  Then Target(1, 21) = ""
'----------------------------------------------------------------

'3 eme code-------------------------------------------------
If Not Intersect(Target, [E5:E25]) Is Nothing Then
  Dim ntab&, lettre$, n&, i&
  Target.Select
  Application.ScreenUpdating = False
  ntab = Val([E5])
  Rows("6:2066").Hidden = True
  For ntab = 1 To ntab
    Rows(4 + 2 * ntab).Resize(2).Hidden = False
    lettre = Chr(64 + ntab)
    n = Val([E5].Offset(2 * ntab))
    i = Application.Match(lettre, [A:A], 0) - 1
    Rows(i & ":" & i + 2 * n + 1).Hidden = False
    i = Application.Match("Total " & lettre, [A:A], 0) - 1
    Rows(i).Resize(2).Hidden = False
  Next
End If
'---------------------------------------------------------------------

Application.EnableEvents = True

End Sub
J'ai ajouté On Error Resume Next au cas où l'on entre des valeurs d'erreur en colonne R ou en E5.

A+
 

camarchepas

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

Bonjour Ilino,Job,

@ Job, Bravo pour le décodage du besoin , en fait l'on veut effectuer l'ensemble de la routine sans être perturbé par le traitement qu'elle même effectue .

Et oui , , la solution avec le flag est qu'en même à retenir si l'on travail dans les userforms , où là si je ne m'abuse , les événementiels ne sont pas débrayables .
 

Ilino

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

Bonjour Forum, bonjour JOB
merci infiniment pour ton aide
Donc je peux generaliser ton code de cette maniere pour toutes les Private sub

Private Sub Worksheet_Change(ByVal c As Range)
Application.EnableEvents = False
On Error Resume Next 'sécurité
'1er code
............

'2eme code
.....

'3code
......

Etc....

Application.EnableEvents = True
End Sub
n'est ce pas ?
NB:
je n'arrive pas a declarer deux variable dans
Private Sub Worksheet_selectionChange(ByVal c As Range, ByVal Target As Range) ???
A+
GRAZIE
 
Dernière édition:

camarchepas

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

Re à tous ,

Et non pas possible , ce sont des procédures événementielles avec des paramètres bloqués ,

Si tu veux passer un autre paramètre , il faut dans un module standard définir une variable public
 

job75

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

je n'arrive pas a declarer deux variable dans
Private Sub Worksheet_Change(ByVal c As Range, ByVal Target As Range) ???

Tu devrais savoir qu'il n'est pas possible de modifier la syntaxe des macros événementielles.

On peut par contre changer le nom des arguments.

Hello camarchepas, à 1 minute près.

A+
 

Ilino

XLDnaute Barbatruc
Re : séparation des code dans la meme Sub

Bonjour a tous
voila ci dessous mon code avec deux variables Target et C
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range, ByVal c As Range) 

Target.Name = "Cible" 'coller texte sans modifier le format cellule

If ActiveSheet.Name = "FGP 2014" Then
    With ActiveSheet.Shapes("CommandButton109")
     .Top = c.Top - 25
     .Left = c.Left + 150
    End With
 

    With ActiveSheet.Shapes("CommandButton15")
    .Top = c.Top - 25
    .Left = c.Left + 195
    End With
End If

End Sub
a quel niveau je modified mon code ?
GRAZIE
 
Dernière édition:
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…