Découpage macro trop longue avec conditions...

spilo

XLDnaute Nouveau
Bonjour,

Lors d'un test d'une macro* (que je n'ai pas terminée d'ailleurs !) j'ai un message d'erreur qui m'indique que l’exécution est impossible puisque la "procédure est trop longue" (limité à 64ko d'après ce que j'ai pu lire...).

J'ai essayé de procéder à plusieurs découpages et des appels avec CALL... sans succès ! je me retrouve toujours avec des message d'erreur suite aux conditions (ELSE sans IF, IF sans END, etc ...).

*Le but de cette macro est de faire avancer des joueurs dans un (ou des plutôt !) tableaux de compétition en double-cliquant sur certaines cases du tableau.

Ci-joint le fichier pour exemple.

Merci d'avance pour votre aide.
 

Pièces jointes

  • Pro_2013_2014_Copie.xlsm
    423.2 KB · Affichages: 41

Dranreb

XLDnaute Barbatruc
Re : Découpage macro trop longue avec conditions...

Bonjour.
Ce que vous dervriez surtout essayer, c'est une programmation plus intelligente basée sur des calculs de (Target.Row - 2) mod N avec N une puissance de 2 selon la colonne et sur (Target.Row - 2) \ N + UneConstante.
Ça déboucherait sur une procédure qui tiendrait sur une seule page de la fenêtre de code !
 

Misange

XLDnaute Barbatruc
Re : Découpage macro trop longue avec conditions...

Bonjour

Pour abonder dans le sens de Dranreb, il faut que tu reprennes les bases de ton classeur. Je dois dire qu'en ouvrant ton code ça fait peur !
rien qu'un petit truc : tu as plein de trucs du genre
Code:
Sub Case_D50()
    Range("D50").Select
    ActiveCell.FormulaR1C1 = "4"
    Range("D51").Select
    ActiveCell.FormulaR1C1 = ""
    Range("F51").Select
End Sub

a remplacer par

Code:
Sub Case_D50()
    Range("D50")=4
    Range("D51")=""
End Sub
Inutile de mettre une formule pour entrer une constante !

Ensuite tu as ce code une bonne centaine de fois alors que la seule chose qui varie c'est la cellule

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
activecell=4
activecell.offset(1,0)=""
activecell.offset(1,2).select
end sub
devrait remplacer une grande partie de ton code
il y a quelques types de déplacements à ce que j'ai pu voir, adapte en testant par exemple en début de macro si la cellule active est dans la colonne D, G ou autre

Vire les modules vides, ça ne sert à rien de les multiplier à l'infini et quand tu veux vérifier ton code ça t'oblige à ouvrir X modules vides pour rien.

Mon conseil : lire quelques bons tutos sur le VBA et n'utiliser l'enregistreur de macros que comme guide quand tu ne connais pas l'écriture d'une instruction. L'enregistreur est très bavard, il sélectionne les cellules avant d'y faire quelque chose ce qui est parfaitement inutile et le code généré est en général à 90% trop long.

Tu trouveras pleins de tutos VBA ici même et sur excelabo. Le temps que tu passeras à les lire te permettra d'en gagner 10 fois plus ensuite.
 

Paf

XLDnaute Barbatruc
Re : Découpage macro trop longue avec conditions...

bonjour à tous,

Une proposition pour simplifier :
dans Private Sub Worksheet_BeforeDoubleClick on appelle une fonction avec l'adresse de la cellule
dans la fonction on traite selon la colonne et la ligne

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
If Not Application.Intersect(Target, Range("D:D,G:G,J:J,M:M")) Is Nothing Then
    Macase (Target.Address)
End If
End Sub
Code:
Function Macase(Coord)
With Range(Coord)
    .Value = "4"
    .Offset(1, 0).Value = ""
    .Offset(0, 2).Select
End With
à adapter en fonction de la colonne et si ligne pair...

seul bémol à cette solution : les cellules fusionnées, puisque l'adresse transmise est l'adresse des deux cellules (ex : $J$12:$J$13)

bon courage
 

Dranreb

XLDnaute Barbatruc
Re : Découpage macro trop longue avec conditions...

À priori ça commencerait comme ça :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim LSrc As Long, CSrc As Long, LCbl As Long, CCbl As Long
LSrc = Target.Row: CSrc = Target.Column
Select Case CSrc
   Case 4
      If LSrc < 2 Then Exit Sub
      Target.Value = 4: Target.Offset(1 - ((LSrc - 2) Mod 2) * 2).ClearContents
      LCbl = LSrc - (LSrc - 2) Mod 4 + ((LSrc - 2) Mod 4) \ 2 + 1
      CCbl = 6
   Case 7
      If LSrc < 3 Then Exit Sub
      If (LSrc - 3) Mod 4 > 1 Then Exit Sub
      Target.Value = 4: Target.Offset(1 - ((LSrc - 3) Mod 2) * 2).ClearContents
      LCbl = LSrc - (LSrc - 3) Mod 8 + (((LSrc - 3) Mod 8) \ 4) * 2 + 1
      CCbl = 9
Et ça finirait comme ça :
VB:
   End Select
Cancel = True
Me.Cells(LCbl, CCbl).Select
End Sub
Remarque: ce sera peut être plus facile comme ça:
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim LSrc As Long, CSrc As Long, LCbl As Long, CCbl As Long, LBase As Long, LRel As Long
LSrc = Target.Row: CSrc = Target.Column
Select Case CSrc
   Case 4
      If LSrc < 2 Then Exit Sub
      LRel = (LSrc - 2) Mod 4: LBase = LSrc - LRel
      Target.Value = 4: Me.Cells(LSrc + 1 - (LRel Mod 2) * 2, CSrc).Value = Empty
      LCbl = LBase + LRel \ 2 + 1
      CCbl = 6
   Case 7
      If LSrc < 3 Then Exit Sub
      LRel = (LSrc - 3) Mod 8: LBase = LSrc - LRel
      If LRel Mod 4 > 1 Then Exit Sub
      Target.Value = 4: Me.Cells(LSrc + 1 - (LRel Mod 2) * 2, CSrc).Value = Empty
      LCbl = LBase + (LRel \ 4) * 2 + 1
      CCbl = 9
   Case 10
      If LSrc < 4 Then Exit Sub
      LRel = (LSrc - 4) Mod 16: LBase = LSrc - LRel
      If LRel Mod 8 > 3 Then Exit Sub
      Target.Value = 4: Me.Cells(LSrc + 2 - (LRel Mod 4) * 2, CSrc).Value = Empty
      LCbl = LBase + LRel \ 4 + 4
      CCbl = 12
   Case 13
      If LSrc < 8 Then Exit Sub
      LRel = (LSrc - 8) Mod 32: LBase = LSrc - LRel
      If LRel Mod 16 > 3 Then Exit Sub
      Target.Value = 4: Me.Cells(LSrc + 2 - (LRel Mod 4) * 2, CSrc).Value = Empty
      LCbl = LBase + LRel \ 8 + 8
      CCbl = 15
   Case 16
   …
   Case Else: Exit Sub
   End Select
Cancel = True
Me.Cells(LCbl, CCbl).Select
End Sub
En supprimant la ligne 514, quitte à augmenter la hauteur de la 515, une bonne partie du code pourrait servir aussi aux 1/8 de finale.
 
Dernière édition:

spilo

XLDnaute Nouveau
Re : Découpage macro trop longue avec conditions...

Misange, je prend note de ton conseil et vais oublier l'enregistreur !

Ouah ! Dranreb je suis Bluffé par ce code, qui fonctionne à merveilles !
Mais pour l'utiliser en "production" je préfère le maitriser parfaitement ...

Avec quelques tutoriels sur les déplacements je commence à cerner les fonctions de déplacements, mais qu'est-ce que ces "Mod" exactement (Mod 2, Mod 4, Mod 8) ?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Découpage macro trop longue avec conditions...

Bonjour.
Curseur texte sur cet opérateur Mod, la touche F1 vous enseigne qu'il permet de diviser deux nombres en ne renvoyant que le reste.
Le "\" quant à lui permet d'effectuer une division entière.
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 132
Membres
103 127
dernier inscrit
willwebdesign