Trop de calculs tue le calcul...

kioups

XLDnaute Occasionnel
Bonsoir à tous !

J'ai un classeur avec beaucoup de fonctions personnalisés (dans plus de 20 000). Paraît-il que ça gagnerait du temps...

Le problème, c'est que dès que je rentre une donnée dans une cellule, même si elle n'est pas concernée par un calcul. Ca part pour des heures de calcul... J'exagère, 2 bonnes minutes...

J'ai ce problème sous 2007, je l'avais déjà avant...

J'essaie de rendre mon fichier à peu près propre avant de le mettre en lien...

Kioups
 

JCGL

XLDnaute Barbatruc
Re : Trop de calculs tue le calcul...

Bonjour à tous,

J'ai un classeur avec beaucoup de fonctions personnalisés (dans plus de 20 000)

Je me permettrais un Oups mon cher kiOups....

20 000 fonctions personnalisées... Pas dans le même fichier... Et même si c'est dans plusieurs....

Ou bien j'ai bien compris... Et tu es bon pour pour le Zop (plutôt qu'un bêtisier mon cher Doc Banner :)) ou bien je fais amende honorable mais il faut un ordi de la NASA pour faire tes calculs...

A+ à tous
 
Dernière édition:

soenda

XLDnaute Accro
Re : Trop de calculs tue le calcul...

Bonjour le fil, JCGL, kioups

Bouton Office/ Options Excel
Onglet "Formules"
Sous "Mode de calcul", cocher le bouton radio "Manuel"
puis "Ok"

Ou

Dans le ruban, onglet "Formules", Options de calcul (tout à fait à droite), cocher "Manuel"

Et pour calculer la feuille, cliquer sur "Calculer la feuille"

C'est vrai que 20 000 ... Ca fait beaucoup :D

A plus
 

nolich

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

Bonsoir kioups, JCGL et Soenda, bonsoir à toutes et à tous :)

soenda à dit:
C'est vrai que 20 000 ... Ca fait beaucoup :D

Surtout en fonctions personnalisées, à moins que 20000 soit le nombre de cellules dans lesquelles il y a une fonction personnalisée ;)

Dans ce cas, il serait peut-être bon de vérifier si Application.Volatile est à True et le supprimer si c'est le cas, non ?

@+
 

kioups

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

Bonsoir à tous !

Oui, c'est dans 21 800 cellules (pour l'instant, on devrait bien atteindre les 30 000) ! Le "cellules" a disparu quand j'ai envoyé mon message, je ne comprends pas... :D

Soenda : je ne veux pas que mes calculs se fassent sur demande, mais quand ils ont besoin d'être faits (en règle générale, quand la ligne qui les concerne est modifié).

Nolich : où puis-je vérifier cet "application.volatile" ?

Merci à vous !
 

kioups

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

A priori, je n'ai pas d'applications volatiles...

Comme je l'ai dit dans le forum 2007, j'ai 19000 formules identiques qui calculent des trucs sur des lignes. Je peux m'arranger pour qu'elles fassent leurs calculs sur 4 cellules au lieu de faire sur toute la ligne, ça serait ptete plus rapide ?

Enfin, ça m'explique pas pourquoi des calculs se font alors que je modifie une cellule qui n'en demande pas...

Voilà quasiment tout mon script VBA. Il manque juste une fonction pas très utile et la Sub Remplissage, elle n'est pas complète, mais c'est normal...

Code:
Option Explicit

Sub Importation_Journée(Nom As String)
'
Dim NumeroJournee As Integer
Dim JoueursJournee As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim NomJoueur As String
Dim NbreJoueursTotal, NJ, N1, NN, N2 As Integer
Dim ColonneJoueur As Integer
'
' Sélection de la feuille
    Nom = Split(Nom, "\")(UBound(Split(Nom, "\")))
    Windows(Nom).Activate
' Rajout des deux calculs
    Cells(4, 1).Select
    ActiveCell.FormulaR1C1 = _
        "=VALUE(IF(RIGHT(LEFT(R[-1]C,14))=""e"",RIGHT(LEFT(R[-1]C,13)),RIGHT(LEFT(R[-1]C,14),2)))"
    Cells(7, 1).Select
    ActiveCell.FormulaR1C1 = "=VALUE(LEFT(R[-1]C,2))"
    NumeroJournee = Cells(4, 1).Value
    JoueursJournee = Cells(7, 1).Value
    Cells(4, 1).Value = ""
    Cells(7, 1).Value = ""
' Suppression des bordures
    Cells.Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
' Suppression du fusionnage
    Selection.UnMerge
' Sélection des matchs de la journée
    Range("B9:C18").Select
    Selection.Copy
' Copie dans le classeur
    Windows("Classeur L1 2008-2009").Activate
    Cells(6 + 18 * (NumeroJournee - 1), 2).Select
    ActiveSheet.Paste

        
' Sélection d'un joueur
    For i = 1 To JoueursJournee
        Windows(Nom).Activate
        NomJoueur = Cells(8, 8 + 4 * (i - 1))
    ' Savoir si le joueur existe déjà ou pas
        NbreJoueursTotal = Workbooks("Classeur L1 2008-2009").Worksheets("Feuil1").Range("B1").Value
        k = 1
        Do While k < NbreJoueursTotal + 1
            If Workbooks("Classeur L1 2008-2009").Worksheets("Feuil1").Cells(4, 15 + 3 * (k - 1)).Value = NomJoueur Then
                ColonneJoueur = 15 + 3 * (k - 1)
                Exit Do
            Else
                k = k + 1
            End If
        Loop
    ' Copie du nom du joueur
        If k = NbreJoueursTotal + 1 Then
            ColonneJoueur = 15 + 3 * NbreJoueursTotal
            Cells(8, 8 + 4 * (i - 1)).Select
            Application.CutCopyMode = False
            Selection.Copy
            Windows("Classeur L1 2008-2009").Activate
            Cells(4, ColonneJoueur).Select
            ActiveSheet.Paste
        ' Fusionnage des cellules
            Range(Cells(4, ColonneJoueur), Cells(4, ColonneJoueur + 2)).Select
            Application.CutCopyMode = False
            With Selection
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlBottom
                .WrapText = True
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False
            End With
            Selection.Merge
        ' Copie des votes du joueur
            Windows(Nom).Activate
            Range(Cells(9, 8 + 4 * (i - 1)), Cells(18, 9 + 4 * (i - 1))).Select
            Selection.Copy
            Windows("Classeur L1 2008-2009").Activate
            Cells(6 + 18 * (NumeroJournee - 1), ColonneJoueur).Select
            ActiveSheet.Paste
        Else
            Windows(Nom).Activate
            Range(Cells(9, 8 + 4 * (i - 1)), Cells(18, 9 + 4 * (i - 1))).Select
            Selection.Copy
            Windows("Classeur L1 2008-2009").Activate
            Cells(6 + 18 * (NumeroJournee - 1), ColonneJoueur).Select
            ActiveSheet.Paste
        End If
    Next i

            
End Sub

Sub Remplissage()
Dim i As Integer, j As Integer, k As Integer

For i = 1 To 38
    
        For k = 1 To 50
            Cells(16 + 18 * (i - 1), 17 + 3 * (k - 1)).FormulaR1C1 = "=IF(COUNTBLANK(R[-10]C:R[-1]C)=10,"""";Bonus(R[-10]C:R[-1]C)"
    
Next i
End Sub



Public Function NbJoueurs(Li As Range)
Dim i As Integer, R As Integer, N As Integer
    NbJoueurs = 0
    R = Li.Row
    For i = 1 To 50
        If Cells(R, 15 + 3 * (i - 1)).Value <> "" Then
            NbJoueurs = NbJoueurs + 1
        End If
    Next i
    If NbJoueurs = 0 Then
        NbJoueurs = ""
    End If
End Function

Public Function Nb1(Li As Range)
Dim i As Integer, R As Integer
    Nb1 = 0
    R = Li.Row
    If Cells(R, 7) = "" Then
    Nb1 = ""
    Else
    For i = 1 To 50
        If Cells(R, 15 + 3 * (i - 1)).Value > Cells(R, 16 + 3 * (i - 1)).Value Then
            Nb1 = Nb1 + 1
        End If
    Next i
    Nb1 = Nb1 / Cells(R, 7)
    End If

End Function


Public Function NbN(Li As Range)
Dim i As Integer, R As Integer
    NbN = 0
    R = Li.Row
    If Cells(R, 7) = "" Then
    NbN = ""
    Else
    For i = 1 To 50
        If Cells(R, 15 + 3 * (i - 1)).Value = Cells(R, 16 + 3 * (i - 1)).Value And Cells(R, 15 + 3 * (i - 1)).Value <> "" Then
            NbN = NbN + 1
        End If
    Next i
    NbN = NbN / Cells(R, 7)
    End If

End Function

Public Function NB2(Li As Range)
Dim i As Integer, R As Integer
    NB2 = 0
    R = Li.Row
    If Cells(R, 7) = "" Then
    NB2 = ""
    Else
    For i = 1 To 50
        If Cells(R, 15 + 3 * (i - 1)).Value < Cells(R, 16 + 3 * (i - 1)).Value Then
            NB2 = NB2 + 1
        End If
    Next i
    NB2 = NB2 / Cells(R, 7)
    End If

End Function

Public Function Bonus1N2(i As Variant, j As Double, k As Double)
Dim a As String, b As String, c As String
    
        If i <> 0 And i < 0.2 Then
            a = "1"
            Else
            a = "-"
        End If
        If j <> 0 And j < 0.2 Then
            b = "N"
            Else
            b = "-"
        End If
        If k <> 0 And k < 0.2 Then
            c = "2"
            Else
            c = "-"
        End If
        Bonus1N2 = a & b & c
    
End Function

Public Function Points(ProDom, ProExt, Ligne)

Dim ScoDom, ScoExt, B1, BN, B2 As Variant

ScoDom = Cells(Ligne.Row, 4).Value
ScoExt = Cells(Ligne.Row, 5).Value
B1 = Cells(Ligne.Row, 8).Value
BN = Cells(Ligne.Row, 9).Value
B2 = Cells(Ligne.Row, 10).Value
If ProDom = "" Or ProExt = "" Then
    Points = ""
Else
    If ScoDom = "" Or ScoExt = "" Then
    Points = ""
    Else
    If ((ProDom - ProExt) * (ScoDom - ScoExt) < 0) Or (ProDom = ProExt And ScoDom <> ScoExt) Or (ProDom <> ProExt And ScoDom = ScoExt) Then
        Points = 0
    Else
    If ProDom <> ScoDom Or ProExt <> ScoExt Then
        Points = 1
    Else
    Select Case ProDom
        Case Is > 3: Points = 5
        Case 3
            Select Case ProExt
                Case Is > 1: Points = 5
                Case Else: Points = 4
            End Select
        Case 2
            Select Case ProExt
                Case Is > 2: Points = 5
                Case 2: Points = 4
                Case Else: Points = 3
            End Select
        Case 1
            Select Case ProExt
                Case Is > 2: Points = 5
                Case 2: Points = 4
                Case Else: Points = 2
            End Select
        Case 0
            Select Case ProExt
                Case Is > 2: Points = 5
                Case 2: Points = 4
                Case 1: Points = 3
                Case 0: Points = 2
            End Select
    End Select
    End If
    If (ProDom > ProExt And B1 < 0.1) Or (ProDom = ProExt And BN < 0.1) Or (ProDom < ProExt And B2 < 0.1) Then
        Points = Points + 2
        ElseIf (ProDom > ProExt And B1 < 0.2) Or (ProDom = ProExt And BN < 0.2) Or (ProDom < ProExt And B2 < 0.2) Then
            Points = Points + 1
    End If
    End If
    End If
End If
End Function

Public Function NbVainqueurs(Ligne)
Dim i As Integer
Dim ScoDom As Variant
Dim ScoExt As Variant
ScoDom = Cells(Ligne.Row, 4).Value
ScoExt = Cells(Ligne.Row, 5).Value
If ScoDom = "" Or ScoExt = "" Then
    NbVainqueurs = ""
    Else
    NbVainqueurs = 0
    For i = 1 To 50
        If (Cells(Ligne.Row, 15 + 3 * (i - 1)).Value > Cells(Ligne.Row, 16 + 3 * (i - 1)) And ScoDom > ScoExt) Or (Cells(Ligne.Row, 15 + 3 * (i - 1)).Value = Cells(Ligne.Row, 16 + 3 * (i - 1)) And ScoDom = ScoExt) Or (Cells(Ligne.Row, 15 + 3 * (i - 1)).Value < Cells(Ligne.Row, 16 + 3 * (i - 1)) And ScoDom < ScoExt) Then
            NbVainqueurs = NbVainqueurs + 1
        End If
    Next i
End If
End Function

Public Function Bonus(Votes As Range)
Dim i As Integer
Bonus = 0
For i = 1 To 10
     If
End Function
 

kioups

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

Bonjour à tous !

soenda : merci beaucoup !

MJ13 : pas de souci, je n'ai pas de données confidentielles du tout ! Je suis au taf, j'essaie de voir ça cet après-midi quand je serai à la maison !
 

kioups

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

Rebonjour !

Un fichier .zip est disponible ici :

Cijoint.fr - Service gratuit de dépôt de fichiers

Il contient 3 fichiers :
- Classeur L1 2008-2009
- 1ère journée
- 34ème journée

Je vous explique le principe...
On fait des pronostics sur la L1 avec plusieurs copains, via un site (sitepbt.free.fr, si ça en tente de jeter un oeil...). Le webmaster du site nous permet d'exporter les pronostics du site vers un fichier Excel. Ces fichiers sont plus ou moins du style des fichiers 1ère journée et 34ème journée. Ce sont d'ailleurs des exportations du site que j'ai très légèrement modifiés (sans incidence pour la suite).

Mon classeur a pour but de regrouper tous les votes de chaque journée, calculer les points obtenus et diverses stats.

Comme vous pouvez l'avoir sous les yeux, le classeur "Classeur" ne comporte actuellement que des cellules de calcul. Il n'y a aucun votes.
Pour récupérer les votes des fichiers "Journées", j'utilise les macros Importation_Journée (module 1) et Ouvrir_Fermer_Classeur (module 3). Cette dernière macro n'est pas de moi du tout ! Merci à vbacrumble (entre autres, désolé d'oublier les autres.... mais vbacrumble m'a beaucoup aidé jusqu'à présent !).
Pour importer les votes d'une journée, je fais CTRL + MAJ + O puis je choisis le fichier souhaité (en l'occurrence 1ère journée ou 34ème journée). Ca, ca fonctionne ! Vous pouvez essayer... C'est moche, hein ??? M'enfin, ça fonctionne... je pense...
Dans le module 1, il y a une macro Remplissage (qui n'a pas l'air finie... Faux ! En fait, elle m'a servi pour remplir petit à petit les cellules avec mes formules personnalisées). Et elle n'a pas fini de me servir....
En-dessous, il y a toutes les fonctions que j'utilise... pour le moment, y'en aura encore un paquet ! A noter que j'ai eu un bug bizarre... Les colonnes H et J retournent des nombres et pas les formules..... Histoire de gestion de confidentialité, je pense...

Ce que je vous propose, c'est d'importer les deux journées dans le classeur puis de voir ce qui se passe quand on modifie une cellule. Les utilisateurs seront amenés à remplir les résultats des matchs (colonnes D et E) et ça doit faire ramer... mais même en modifiant une cellule sans intérêt (colonne A, par exemple), ça ralentit...

Voili, voilou, je crois que j'ai dit beaucoup de choses, et certainement pas tout...

merci d'avance !

Kioups
 

kioups

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

Ah ben, c'est comique ça...

Avec 3 journées, ça avait l'air de fonctionner très bien. J'ai fermer mon classeur sans sauvegarder (pour ne plus avoir ces 3 journées dans mon classeur et parce que c'est fastidieux de les effacer...).

Je ferme donc puis rouvre mon classeur... Et là, ça rame dès que je modifie un truc.... bizarre...

Edit : je retente après avoir posté le message et ça rame plus... je n'y comprends rien...
 

vbacrumble

XLDnaute Accro
Re : Trop de calculs tue le calcul...

Bonjour



Cette fois-ci je ne peux rien pour toi

sauf si tu ajoutes une version xls de tes fichiers

(je n'ai pas Excel 2007)


Et comme nous ne sommes pas sur le forum spécifique à Excel 2007.


Rassures-moi , le code VBA issu de mon clavier ne te pose pas problème j'espère ?
 

kioups

XLDnaute Occasionnel
Re : Trop de calculs tue le calcul...

Remarque, ça serait plus simple pour mes utilisateurs si je passais en .xls

Je fais ça de suite...

Pour ton code, non, pas de souci, l'ouverture-fermeture du classeur se fait sans problème !

C'est bizarre, le classeur .xls est beaucoup plus gros que le classeur .xlsm

Voici le lien

Cijoint.fr - Service gratuit de dépôt de fichiers

Merci !

Kioups
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 370
Messages
2 087 693
Membres
103 641
dernier inscrit
anouarkecita2