Remplacer des formules par VBA

  • Initiateur de la discussion Initiateur de la discussion Aloha
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Aloha

XLDnaute Accro
Bonjour,

Pour chaque personne dans une liste je calcule une feuille avec plein de valeurs, puis je copie les valeurs personne par personne dans un autre classeur.
Etant donné qu'il y a beaucoup de formules c'est assez lent.
Comment devrais-je procéder pour remplacer les formules par du code VBA pour accélérer les opérations?

Merci pour tout tuyau.

Aloha
 
Re : Remplacer des formules par VBA

Re 🙂,
Voici le code corrigé, sans copier la liste du personnel
Code:
Sub Test()
Application.ScreenUpdating = False
Dim MonDico As Object, c As Range, I As Integer, Tableau
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Sheets("Service1").Range([B1], [B1].End(xlToRight))
If c.Value <> "" Then MonDico.Item(c.Value) = c.Value
Next c
Tableau = MonDico.Items
Call tri(Tableau, 0, MonDico.Count - 1)
Application.SheetsInNewWorkbook = MonDico.Count
Workbooks.Add
Application.SheetsInNewWorkbook = 3
ActiveWorkbook.SaveAs Filename:= _
    "C:\Documents and Settings\Administrateur\Bureau\Heures 2009\Récolte des fiches" _
        & "\Service1\Fiches individuelles Service1.xls" _
        , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False
Windows("Base.xls").Activate
For I = 0 To MonDico.Count - 1
Windows("Fiche individuelle.xls").Activate
Sheets("Fiche individuelle").Range("P3").FormulaR1C1 = Tableau(I)
Sheets("Fiche individuelle").Range("B1:P66").Copy
Windows("Fiches individuelles Service1.xls").Activate
With Sheets("Feuil" & I + 1).Range("A1")
    .PasteSpecial Paste:=xlPasteValues, _
        Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    .PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    .PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
End With
Sheets("Feuil" & I + 1).PageSetup.PrintArea = "$A$1:$O$66"
Sheets("Feuil" & I + 1).Name = Tableau(I)
Application.ExecuteExcel4Macro "PAGE.SETUP(,,0.7,0.2,0.2,0.2,,,TRUE,TRUE,1,9,true ,,,,,0.2,0.2,FALSE,FALSE)"
Next I
Windows("Base.xls").Activate
Application.ScreenUpdating = True
End Sub
Sub tri(A, Gauc, Droi) ' Tiré de Jacques Boisgontier
Dim Ref, G, D, Temp
   Ref = A((Gauc + Droi) \ 2)
   G = Gauc: D = Droi
   Do
     Do While A(G) < Ref: G = G + 1: Loop
     Do While Ref < A(D): D = D - 1: Loop
     If G <= D Then
       Temp = A(G): A(G) = A(D): A(D) = Temp
       G = G + 1: D = D - 1
     End If
   Loop While G <= D
   If G < Droi Then Call tri(A, G, Droi)
   If Gauc < D Then Call tri(A, Gauc, D)
End Sub
Pour tes SommeProd, je voie pas trop ce que tu attends de VBA 😱...
Bonne soirée 😎
 
Re : Remplacer des formules par VBA

Bonjour,

Merci pour ton code.

Je l'ai testé, et après une modification, il fonctionne.

Je ai comparé son fonctionnement avec celui de ma macro enregistrée où le code est répété autant de fois qu'il y a de personnes. Le tien met 3'40", le mien 3'50"!

Le fait que cela dure presque aussi longtemps avec ton code plus performant tient, je me répète et j'en suis sûr, à mes formules.

Pour bien me faire comprendre: les formules servent à aller prendre des valeurs existantes, dans la feuille "Database", et dans la feuille "Personnel". D'où ma question s'il n'y a pas moyen de récupérer ces valeurs d'une manière à exiger moins de performance de Excel.

Les critères pour prendre les valeurs: le nom de la personne, le mois, et le paramètre, dans la feuille "Database" où les chiffres produits mois par mois (heures travaillées, de congé, de maladie, de formation, supplémentaires) sont collectés, et le nom, et les données liées au contrat de travail (nombre d'heures par semaine, heures à travailler toute l'année, heures de congé disponible etc.) sont calculées par service dans la feuille "Personnel" qui va prendre les données de base dans la feuille du service en question.

A+

Aloha
 
Re : Remplacer des formules par VBA

Re 😎,
Vu que c'est seulement une valeur changée (le nom) qui déclenche tes calculs, on ne gagnera rien à arrêter le calcul automatique et le remettre quand ça nous intéresse...
D'après les stats vues sur le forum, les formules sont plus rapides que les fonctions personnalisées, donc rien à gratter de ce côté là...
La seule possibilité serait de remplir la feuille avec les résultats des calculs VBA, ce qui va être compliqué, et pas forcément plus rapide...
Par contre, les temps que j'ai observés étaint de l'ordre de quelques secondes, donc c'est bien tes SommeProd qui sont en cause...
Bonne journée 😎
 
Re : Remplacer des formules par VBA

Salut,

OK, je pense qu'on peut en rester là alors.
Je te remercie beaucoup pour ton fidèle soutien sans lequel je n'en serais pas là!

J'ai d'ailleurs d'autres projets dont un où la démarche serait contraire à celle de ce sujet: il s'agit de prendre des valeurs dans des fiches et de les mettre ligne pare ligne dans un tableau, toujours à la première ligne libre.

Si cela peut t'intéresser, je vais lancer le fil dans l'immédiat.

Merci encore

A très bientôt

Aloha
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
236
Retour