Simplification VBA

Bonjour tout le monde,

J'exécute une macro qui divise un nombre de succès par un nombre d’événements total en fonction des semaines.

J'ai fait une macro pour cela car les éléments des différents tableaux vont changer dans le temps (je n'ai pas mis la formule ici).

J'ai fait cette macro ("test") à la main, c'est-à-dire que j'éxécutais et la macro enregistrait mes mouvements.

Cependant, j'ai l'impression qu'avec "ActiveCell" c'est très long lors de l’exécution (à savoir que mon tableau est beaucoup plus grand en vrai).

Pensez-vous que le code est simplifiable en supprimant les "activecell" afin que la macro soit plus rapide ? Si oui pouvez-vous me montrer s'il-vous-plait ?

Merci d'avance,

J'espère avoir été clair mais n'hésitez pas à me demander plus de précision.

Simon

Sub test()

'

' test Macro

'

'

ActiveCell.FormulaR1C1 = "=R[-30]C[2]/R[-30]C[-1]"

Range("F38").Select

ActiveCell.FormulaR1C1 = "=R[-29]C[1]/R[-29]C[-2]"

Range("G38").Select

ActiveCell.FormulaR1C1 = "=R[-28]C/R[-28]C[-3]"

Range("H38").Select

ActiveCell.FormulaR1C1 = "=R[-27]C[-1]/R[-27]C[-4]"

Range("I38").Select

ActiveCell.FormulaR1C1 = "=R[-26]C[-2]/R[-26]C[-5]"

Range("J38").Select

ActiveCell.FormulaR1C1 = "=R[-25]C[-3]/R[-25]C[-6]"

Range("E39").Select

ActiveCell.FormulaR1C1 = "=R[-21]C[2]/R[-21]C[-1]"

Range("F39").Select

ActiveCell.FormulaR1C1 = "=R[-20]C[1]/R[-20]C[-2]"

Range("G39").Select

ActiveCell.FormulaR1C1 = "=R[-19]C/R[-19]C[-3]"

Range("H39").Select

ActiveCell.FormulaR1C1 = "=R[-18]C[-1]/R[-18]C[-4]"

Range("I39").Select

ActiveCell.FormulaR1C1 = "=R[-17]C[-2]/R[-17]C[-5]"

Range("J39").Select

ActiveCell.FormulaR1C1 = "=R[-16]C[-3]/R[-16]C[-6]"

Range("E40").Select

ActiveCell.FormulaR1C1 = "=R[-12]C[2]/R[-12]C[-1]"

Range("F40").Select

ActiveCell.FormulaR1C1 = "=R[-11]C[1]/R[-11]C[-2]"

Range("G40").Select

ActiveCell.FormulaR1C1 = "=R[-10]C/R[-10]C[-3]"

Range("H40").Select

ActiveCell.FormulaR1C1 = "=R[-9]C[-1]/R[-9]C[-4]"

Range("I40").Select

ActiveCell.FormulaR1C1 = "=R[-8]C[-2]/R[-8]C[-5]"

Range("J40").Select

ActiveCell.FormulaR1C1 = "=R[-7]C[-3]/R[-7]C[-6]"

End Sub

6test.xlsm (18.41 Ko)

Bonjour,

Assez surprenant que tu puisses avoir besoin d'une macro ...

La structure de ton tableau contient des ratios ... donc dès que les valeurs de tes plages D8:G13, D18:G23 et D28:G33 sont modifiées ... les résultats corrects s'affichent ...

Bonjour,

L'enregistreur de macro reproduit "bêtement" chacune de tes actions, et ne produit pas un code utilisable en l'état pour automatiser/généraliser un processus. Il sert au mieux à te donner la syntaxe pour certaines instruction.

Si tu tiens à passer par VBA, je te conseille de commencer par te former un peu, par exemple en lisant les sections de cours du site.

Effectivement, ActiveCell est inutile voir risqué selon sur quelle feuille tu exécutes ta macro...

VBA n'a pas besoin de "voir" ("Activate") ni de "sélectionner" ("Select") un objet (par exemple un cellule) pour travailler dessus, il suffit de bien préciser sa référence... Par exemple : Sheets("Feuil1").Range("A1") correspond à la cellule Feuil1!A1.

Ensuite, l'intérêt de VBA pour ce type d'application est de ne pas inscrire une formule dans la cellule, mais directement le résultat en dur (ce qui rend ton fichier moins lourd, par la même occasion). Exemple :

With Sheets("Feuil1") 'Tout objet qui commence par un "." se rattache à cette feuille
    .Range("A1") = .Range("B1")/.Range("C1") 'Inscrit en A1 le résultat de B1/C1
End With

On peut aussi utiliser une boucle pour parcourir les lignes et répéter l'opération :

With Sheets("Feuil1")
    DerniereLigne = 100
    For Ligne = 1 To DerniereLigne 'Boucle sur les lignes
        .Range("A" & Ligne) = .Range("B" & Ligne)/.Range("C" & Ligne) 
    Next Ligne
End With

Bonjour James et Pedro,

Sur cet exemple ça n'a que peu d'utilité en effet ahah.

D'accord merci beaucoup. Donc il n'est pas possible de transformer ce code en un code sans les activecell et en indiquant juste les cellules et en donnant la formule associée ?

Merci beaucoup,

Simon

Re,

Tu peux tester le code suivant

Sub Ratios()
Dim i As Long, j As Long
For i = 38 To 40
    For j = 5 To 10
      Cells(i, j).Formula = "=G" & 8 + (i - 38) * 10 + j - 5 & "/D" & 8 + (i - 38) * 10 + j - 5
    Next j
Next i
End Sub

En expèrant que cela t'aide

Donc il n'est pas possible de transformer ce code en un code sans les activecell et en indiquant juste les cellules et en donnant la formule associée ?

Si bien sûr, mais avec une structure un peu plus conventionnelle de tes données, tu pourrais te passer de VBA et faire ton tableau à l'aide d'un Tableau Croisé Dynamique, simple, fiable et rapide...

Rebonjour tout le monde,

Merci pour ce code James c'est super.

Pedro, dans mon cas j'ai vraiment besoin de faire ce que j'ai fait sachant que dans mes tableaux, ce n'est pas des valeurs mais des formules qui dépendent de la date.

Est-ce possible cependant de garder toutes les étapes comme dans mon code et de les transformer pour que ce soit plus rapide ?

Merci beaucoup pour votre temps,

Simon

J'ai l'impression que l'on a du mal à ce comprendre... Je vais aller au bout de la démonstration pour le TCD, je laisse James apporter son expertise pour VBA.

2test-1.xlsx (16.37 Ko)

Rebonjour tout le monde,

Merci pour ce code James c'est super.

Simon

De rien ...

Content que cela te dépanne ...

Merci pour tes remerciements ...

Merci Pedro,

Cependant dans mon cas (qui est plus complexe que ce que je vous ai fourni), l'utilisation d'un TCD est impossible... J'avais déjà demandé sur ce forum pour la méthode et ça ne fonctionnait pas.

Désolé de ne pas être clair. Je cherche en fait à remplacer chaque ligne ( exemple :

Range("BJ12").Select

ActiveCell.FormulaR1C1 = "=""Nbr cas ""&R1C60&"" - ""&MONTH(R8C88)"

) par une ou deux lignes de code qui optimiserait la rapidité sans sélectionner la cellule à chaque fois mais en implémentant directement la formule dedans. (Pas besoin que quand je run le code je vois qu'il sélectionne la cellule pour être clair).

Merci d'avance,

SImon

Re,

J'avoue être un peu perdu ...

Deux questions :

1. Est-ce-que la macro fonctionne ... ou pas ...?

2. Le fichier test d'hier contient les formules qui mettent également à jour tous les intitulés automatiquement ... ou ou non ...?

Re,

Désolé je ne suis pas clair.

Oui la macro fonctionne et c'est super sympa merci beaucoup.

Maintenant j'ai une autre question : est-il possible de remplacer ces deux lignes de codes (c'est un exemple de ligne) :

ActiveCell.FormulaR1C1 = _

"=COUNTIFS(C[-36],R1C60,C[-35],MONTH(R8C88),C[-72],""=810"",C[-33],1)"

par une ligne de code qui affecterait directement à la cellule la formule sans la sélectionner au préalable.

Merci,

Simon

Une piste :

Range("BJ12").Select
ActiveCell.FormulaR1C1 = "=""Nbr cas ""&R1C60&"" - ""&MONTH(R8C88)"
'Devient :
Range("BJ12").FormulaR1C1 = "=""Nbr cas ""&R1C60&"" - ""&MONTH(R8C88)" 'Possibilité 1
Range("BJ12") = "Nbr cas " & Range("BH1") & " - " & Month(Range("CJ8")) 'Possibilité 2
Cells(12, 62) = "Nbr cas " & Cells(1, 60) & " - " & Month(Cells(8, 88)) 'Possibilité 3

Re,

Je peux te confirmer ... que tu n'es vraiment pas clair ... mais pas clair du tout ...!!!

Tu as déjà posé cette question de ' principe ' ...

" Comment insérer une formule dans une cellule ... sans avoir à la sélectionner ..."

La macro qui insère tes Ratios ... effectue exactement ce que tu demandes 18 fois ... !!!

Si maintenant ... tu as besoin d'autres formules ... à d'autres endroits ... tu peux bien sûr t'inspirer de cette macro ...

Bonne Continuation ...

James,

Je crois que je m'embrouille un peu, désolé...

James,

Peux-tu, s'il-te-plait, me montrer comment créer une macro dans ces conditions comme tu l'as fait la première fois ?

Cela m'aiderait énormément pour mon travail et pour ma compréhension.

Je vais regarder les cours ce soir comme vous m'avez dit.

Je te remercie par avance c'est très gentil,

Simon

2test2.xlsx (11.54 Ko)

James,

Je crois que je m'embrouille un peu, désolé...

D'où l'idée de se former à VBA avant de se lancer dans des choses qu'on ne maîtrise pas...

Re,

Sub Ratios2()
Dim i As Long, j As Long
  For i = 15 To 17
      For j = 83 To 88
        Cells(i, j).Formula = "=BN" & 7 + (i - 15) * 10 + j - 83 & "/BK" & 7 + (i - 15) * 10 + j - 83
      Next j
  Next i
  For i = 18 To 20
      For j = 83 To 88
        Cells(i, j).Formula = "=BV" & 7 + (i - 18) * 10 + j - 83 & "/BS" & 7 + (i - 18) * 10 + j - 83
      Next j
  Next i
End Sub

@ Simon_Lbb

Il ne reste plus qu'à savoir si la macro remplit sa fonction ... ou pas ...

Bonjour James,

Elle remplit sa fonction avec brio

Merci pour votre aide précieuse,

Simon

Rechercher des sujets similaires à "simplification vba"