Reduction de code VBA, double boucle (For i = 1 To...next i)

mulpha

XLDnaute Nouveau
Bonjour a tous,

Tout d'abord merci pour votre aide grace à toutes vos questions/réponses j'avance beaucoup plus vite dans l'apprentissage du VBA !

J'aimerais avoir une petite aide concernant le code ci-dessous qui me permet de passer les données de 2012 en 2011 puis de 2013 en 2012 (etc...).
Ce code marche bien mais j'aimerais le réduire fortement
Voici le code en question :

image.jpg
a = 13 'ligne 13
b = 14 'ligne 14... .. .

c2012 = 23 'colonne Y ....
'--------------------
For i = 1 To Count

Range(Cells((a + (i * 69)), c2012), Cells((b + (i * 69)), c2012)).Select

Selection.Copy

Cells(a + (i * 69), cdec11).Select
' ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False '
Next i

....
J'écris cette formule dans mon module une dixaine de fois
..
.

For i = 1 To Count

Range(Cells((x + (i * 69)), c2012), Cells((y + (i * 69)), c2012)).Select

Selection.Copy

Cells(x + (i * 69), cdec11).Select
' ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False '
Next i

Ensuite je change les années. 2012 qui se re-copiait en dec-11 deviens 2013 qui se copie en 2012

For i = 1 To Count

Range(Cells((x + (i * 69)), c2013), Cells((y + (i * 69)), c2013)).Select

Selection.Copy

Cells(x + (i * 69), c2012).Select
' ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False '
Next i


Des idées ???

Merci par avance !
 

Pièces jointes

  • image.jpg
    image.jpg
    37.8 KB · Affichages: 90
  • image.jpg
    image.jpg
    37.8 KB · Affichages: 97
  • image.jpg
    image.jpg
    37.8 KB · Affichages: 95

mulpha

XLDnaute Nouveau
Re : Reduction de code VBA, double boucle (For i = 1 To...next i)

Voici ma macro en entière dans ce fichier ci joint:

J'ai vidé tous les chiffres de ma feuilles excel pour des raisons de confidentialité.

Merci d'avance
 

Pièces jointes

  • ex Classeur.xls
    175 KB · Affichages: 95
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Reduction de code VBA, double boucle (For i = 1 To...next i)

Salut mulpha et le forum
J'ai juste jeté un œil pour l'instant, et de petites remarques anodines :
- Utiliser un nom comme count pour déclarer une variable est un bon moyen d'avoir des problèmes : Excel se réserve un certains nombres de mots qu'il utilise. Laisse-les lui, c'est lui le chef. Où ne t'étonne pas des problèmes qu'il pourrait te faire.
- Si tu déclares une variable en nombre (integer, long ou double), sa remise à zéro est 0, pas du texte !
Il faut rester cohérent dans ce que tu fais. Même si Excel est extrêmement permissif, ça ne sert à rien de rechercher les ennuis.
A+
 

kjin

XLDnaute Barbatruc
Re : Reduction de code VBA, double boucle (For i = 1 To...next i)

Bonjour,
Ce qui m'esplante toujours, c'est ce genre de question où le demandeur s'imagine que l'on va facilement deviner comment fonctionne son classeur et balance une page de code sans le moindre petit mot d'explication...rien, nada, le désert, je vous passe le bébé, dem... vous avec ça
kjin:mad:
 

Gorfael

XLDnaute Barbatruc
Re : Reduction de code VBA, double boucle (For i = 1 To...next i)

Salut mulpha et le forum
Tu me dis ca pour quel partie ?
Module 1 : zone de déclaration
Public Compt As Integer, C As Integer, Wip As Variant, Btec As Variant
J'ai changé Count en Compt, ça risquait de me donner des boutons !
Module de l'USF fm_MsgBoxINPUT
Code:
Private Sub ButtonAnnuler_Click()
 Compt = ""
 C = ""
 Wip = ""
Unload Me
End
End Sub
J'ai pas cherché bien loin, mais la remise à zéro des variables Compt (integer => c'est une ligne => déclaration en long, car elle peut dépasser les 32768) et C (integer) doit être 0 et non "".

Perso, je n'aime pas coller un End dans un sous-programme. Je préfère toujours quitter une macro principale par sa sortie, ce qui évite des problèmes quand on utilise des instructions qui portent sur Excel et non sur une feuille (celles qui débutent par Application).

Ton code est tellement lourd à décoder que je ne cherche même pas à le comprendre. J'ai quand même réduit un peu la premier partie :
Code:
' --------------------------------------------------------------------------------------

                      ' 1ere partie
                      '----------------------
For i = 1 To Compt
    Range(Cells(((13 - 4) + (i * 69)), c2012), Cells(((13 - 4) + (i * 69)), c2012)).Copy
    Cells((13 - 4) + (i * 69), cdec11).PasteSpecial Paste:=xlValues
Next i
For X = 26 To 32
    For i = 1 To Compt
        Range(Cells(((13 - 4) + (i * 69)), X), Cells(((13 - 4) + (i * 69)), X)).Copy _
                                                        Cells((13 - 4) + (i * 69), X - 1)
    Next i
Next X
     
' ATTENTION LD's non calculé
ActiveSheet.Cells.Calculate
                      ' 2ieme partie
                      '----------------------
Des petites règles simples que j'utilise :
- J'essaie de voir les similitudes, pour regrouper.
- Je n'utilise qu'un minimum de variables. Créer une variable pour l'utiliser en constante ne me semble pas utile, sauf pour lui attribuer un nom explicite.
- mettre en automatique pour remettre en manuel à la ligne suivante ne sert à rien. Il vaut mieux lancer un ordre de calcul (range(...).calculate ou sheets("...).calculate)

Même si je réponds, ce que dit kjin (salut) est réel : on n'est ni devin, ni télépathe, ni utilisateur de ton fichier.
A+
 
Dernière édition:

mulpha

XLDnaute Nouveau
Re : Reduction de code VBA, double boucle (For i = 1 To...next i)

Je ne suis désolé je pensais que la réduction de mon code qui nécéssite d'avoir 2-3 boucles d'imbriqué les unes dans les autres était quelque chose que vous saviez faire plus ou moins facilement.
Sorte de "truc et astuces" qu'ont les codeurs pour faire certains type de code...

Je vais essayer de refaire quelque chose de plus explicite demain probablement
 

Discussions similaires

Réponses
3
Affichages
567

Statistiques des forums

Discussions
312 074
Messages
2 085 067
Membres
102 770
dernier inscrit
mathieu.lemaitre