Autres accelerer les fonction

samia89

XLDnaute Nouveau
bonjour tt le monde j'ai besoin de votre svp y a t'il un moyen d’accelerer ces fonctions car elle sont très lentes

VB:
=INDEX(Mouvement!$F$1:$F$9959;MIN(SI((Mouvement!$B$7:$B$1000="sortie")*(Mouvement!$C$7:$C$1000=$A$1)*(NB.SI(A$4:A4;Mouvement!$F$7:$F$1000)=0);LIGNE(Mouvement!$F$7:$F$1000))))&""

Code:
=SI($A5="";"";SOMMEPROD((Mouvement!$F$7:$F$1000=$A5)*(Mouvement!$C$7:$C$1000=$A$1)*(Mouvement!$G$7:$G$1000)*(Mouvement!$B$7:$B$1000="sortie")))

voila l'image du tableau sur le quel je travail e je vous joint mon classeur pour bien voir le problème de lenteur au moment d'exécution des fonctions j’espère vous lire bien tôt
image002.jpg
 

Pièces jointes

  • fonctions.xlsm
    104.5 KB · Affichages: 19

samia89

XLDnaute Nouveau
C'est la première fois que je vois ça. Normalement le message affiche aussi en dessous l'Err.Description. Quelle est elle ?
Si vous tentiez de l'enregistrer manuellement sur votre dossier de complément (donné par Application.UserLibraryPath) comme fichier de type "Complément Excel (*.xlam)" que se passerait-il ?
Instalation abondonnée recommandation ne prenez pas le projet CLsCAs de ce classeur précurseur comme référence dans un autre projet
 

Dranreb

XLDnaute Barbatruc
Il faut d'abord régler le problème de l'installation du CBxLCtlA. Ça m'inquiète cette histoire là.
Non, ça c'est après, mais avant quand il fait :
Err.Clear: Me.SaveAs ChNomF, FileFormat:=xlOpenXMLAddIn
If Err Then MsgBox "Impossible d'enregistrer le complément." _
& vbLf & "Erreur " & Err & " :" & vbLf & Err.Description, _
vbCritical, Titre: Exit Function
qu'est-ce qu'il met comme Err.Description ?
C'est d'autant plus bizarre que l'installation du GigIdx avait bien marché, or il procède exactement de la même façon !

Je joins le générateur d'UserForm permettant de créer celui que j'ai montré.
 

Pièces jointes

  • GénérateurUFm.xlsm
    425.3 KB · Affichages: 11

samia89

XLDnaute Nouveau
Il faut d'abord régler le problème de l'installation du CBxLCtlA. Ça m'inquiète cette histoire là.
Non, ça c'est après, mais avant quand il fait :qu'est-ce qu'il met comme Err.Description ?
C'est d'autant plus bizarre que l'installation du GigIdx avait bien marché, or il procède exactement de la même façon !

Je joins le générateur d'UserForm permettant de créer celui que j'ai montré.
y a erreur a l'ouverture du classeur GénérateurUFm excel a rencontre un contenu illisible dans GénérateurUFm......
bon si pas méchant je vais travailler directe avec la premier solution VBA que tu ma proposer tout a l'heur elle fonctionne très bien et merci pour tout
 

samia89

XLDnaute Nouveau
Instalation abondonnée recommandation ne prenez pas le projet CLsCAs de ce classeur précurseur comme référence dans un autre projet
Je joins quand même le classeur équipé de l'UserForm, à tout hasard.
Réessa
désolé pour le derangement
voila le message d'erreur a l'ouverture de CBxLCtlA il est impossible d'enregistrer le compliment erreur 1004
la méthode 'SaveAs' de l'objet'_workbook' a échoué
 

Dranreb

XLDnaute Barbatruc
Il me vient une idée : dans VBE, faites ALT+OO (Outils/Options…), voyez onglet Général, rubrique Récupération d'erreur.
Si c'est Arrêt sur toutes les erreurs qui est coché, ça explique tout.
Même Arrêt sur les erreurs non gérées n'est pas idéal, je vous conseille de cocher Arrêt dans le module de classe.
Mais dans ce cas pourquoi diable l'installation du GigIdx avait marché ???
Je l'ai refaite chez moi sans problème.
 

Dranreb

XLDnaute Barbatruc
Oui j'y répondrai sans doute. Mais le principe c'est de ne JAMAIS travailler directement avec des cellules individuelles. Toujours passer par des tableaux VBA dynamiques. Il prend pratiquement autant de temps à accéder à une seule cellule qu'à 100000 d'un coup !
Je joins à tout hasard le CBxlCtla au cas ou il aurait subi des dégâts au transfert la 1ère fois.

Si ça ne va toujours pas, est-ce que la tentative manuelle comme décrite au poste #13 indiquerait pourquoi ? Essayez !
Le chemin du dossier de compléments c'est généralement C:\Users\………\AppData\Roaming\Microsoft\AddIns. Vous devez y avoir déjà le GigIdx.xlam
 

Pièces jointes

  • CBxLCtlA.xlsm
    168.5 KB · Affichages: 5
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui, c'est normal, c'était juste l'UserForm sans encore aucune programmation dedans.
J'ai l'impression que le code indiqué pourrait ce réécrire en utilisant la fonction Gigogne. Voir l'aide, et s'inpirer de l'autre procédure.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Une piste pour la réponse à la première question: utilisation d'une fonction personnalisée matricielle : RecapJour(....)
L'utilisation est expliquée dans le fichier. Cela semble être rapide.

Le code de la fonction est dans module1:
VB:
Function RecapJour(xSource As Range, Action As String, leJour As Date)
Dim t, dico, i&, j&, N&, plage, r, res
   t = xSource.Value2
   Set plage = Application.Caller
   ReDim res(1 To plage.Rows.Count, 1 To plage.Columns.Count)
   For i = 1 To UBound(res): For j = 1 To UBound(res, 2): res(i, j) = "": Next j: Next i
   Set dico = CreateObject("scripting.dictionary")
   dico.CompareMode = vbTextCompare
   For i = 1 To UBound(t)
      If LCase(t(i, 1)) = LCase(Action) And t(i, 2) = leJour Then
         If Not dico.Exists(t(i, 5)) Then N = N + 1: dico(t(i, 5)) = N
      End If
   Next i
   If dico.Count = 0 Then RecapJour = res: Exit Function
   ReDim r(1 To dico.Count, 1 To 4)
   For i = 1 To UBound(t)
      If LCase(t(i, 1)) = LCase(Action) And t(i, 2) = leJour Then
         N = dico(t(i, 5))
         r(N, 1) = t(i, 5): r(N, 2) = r(N, 2) + t(i, 6)
         r(N, 3) = t(i, 7): r(N, 4) = r(N, 4) + t(i, 6) * t(i, 7)
      End If
   Next i
   On Error Resume Next
   For i = 1 To UBound(r): For j = 1 To UBound(r, 2): res(i, j) = r(i, j): Next j: Next i
   RecapJour = res
End Function
 

Pièces jointes

  • samia89- fonctions- v1.xlsm
    112.3 KB · Affichages: 11

samia89

XLDnaute Nouveau
Bonjour à tous,

Une piste pour la réponse à la première question: utilisation d'une fonction personnalisée matricielle : RecapJour(....)
L'utilisation est expliquée dans le fichier. Cela semble être rapide.

Le code de la fonction est dans module1:
VB:
Function RecapJour(xSource As Range, Action As String, leJour As Date)
Dim t, dico, i&, j&, N&, plage, r, res
   t = xSource.Value2
   Set plage = Application.Caller
   ReDim res(1 To plage.Rows.Count, 1 To plage.Columns.Count)
   For i = 1 To UBound(res): For j = 1 To UBound(res, 2): res(i, j) = "": Next j: Next i
   Set dico = CreateObject("scripting.dictionary")
   dico.CompareMode = vbTextCompare
   For i = 1 To UBound(t)
      If LCase(t(i, 1)) = LCase(Action) And t(i, 2) = leJour Then
         If Not dico.Exists(t(i, 5)) Then N = N + 1: dico(t(i, 5)) = N
      End If
   Next i
   If dico.Count = 0 Then RecapJour = res: Exit Function
   ReDim r(1 To dico.Count, 1 To 4)
   For i = 1 To UBound(t)
      If LCase(t(i, 1)) = LCase(Action) And t(i, 2) = leJour Then
         N = dico(t(i, 5))
         r(N, 1) = t(i, 5): r(N, 2) = r(N, 2) + t(i, 6)
         r(N, 3) = t(i, 7): r(N, 4) = r(N, 4) + t(i, 6) * t(i, 7)
      End If
   Next i
   On Error Resume Next
   For i = 1 To UBound(r): For j = 1 To UBound(r, 2): res(i, j) = r(i, j): Next j: Next i
   RecapJour = res
End Function

bonjour mapomme merci pour ton aide oui le code fonction très bien il affiche les resultats rapidement
Bonjour à tous,

Une piste pour la réponse à la première question: utilisation d'une fonction personnalisée matricielle : RecapJour(....)
L'utilisation est expliquée dans le fichier. Cela semble être rapide.

Le code de la fonction est dans module1:
VB:
Function RecapJour(xSource As Range, Action As String, leJour As Date)
Dim t, dico, i&, j&, N&, plage, r, res
   t = xSource.Value2
   Set plage = Application.Caller
   ReDim res(1 To plage.Rows.Count, 1 To plage.Columns.Count)
   For i = 1 To UBound(res): For j = 1 To UBound(res, 2): res(i, j) = "": Next j: Next i
   Set dico = CreateObject("scripting.dictionary")
   dico.CompareMode = vbTextCompare
   For i = 1 To UBound(t)
      If LCase(t(i, 1)) = LCase(Action) And t(i, 2) = leJour Then
         If Not dico.Exists(t(i, 5)) Then N = N + 1: dico(t(i, 5)) = N
      End If
   Next i
   If dico.Count = 0 Then RecapJour = res: Exit Function
   ReDim r(1 To dico.Count, 1 To 4)
   For i = 1 To UBound(t)
      If LCase(t(i, 1)) = LCase(Action) And t(i, 2) = leJour Then
         N = dico(t(i, 5))
         r(N, 1) = t(i, 5): r(N, 2) = r(N, 2) + t(i, 6)
         r(N, 3) = t(i, 7): r(N, 4) = r(N, 4) + t(i, 6) * t(i, 7)
      End If
   Next i
   On Error Resume Next
   For i = 1 To UBound(r): For j = 1 To UBound(r, 2): res(i, j) = r(i, j): Next j: Next i
   RecapJour = res
End Function



bonjour mapomme merci pour ton aide oui le code fonction bien il affiche les résultats rapidement
ma 2eme question et ce que en peut associer un autre critère de recherche a 'A1'date' on ajoutent la cellule 'E1' pour inséré par ex des nom client' et le résultat finale doit être de cette façon:

quand j'ajoute un nom 'qui se trouve dans ma base de donné' dans la cellule ' E1' le résultat doit afficher uniquement ' le détail des sortie pour le nom 'E1' de la date inséré dans 'A1'




et merci encor une fois
 

samia89

XLDnaute Nouveau
Oui, c'est normal, c'était juste l'UserForm sans encore aucune programmation dedans.
J'ai l'impression que le code indiqué pourrait ce réécrire en utilisant la fonction Gigogne. Voir l'aide, et s'inpirer de l'autre procédure.
Oui, c'est normal, c'était juste l'UserForm sans encore aucune programmation dedans.
J'ai l'impression que le code indiqué pourrait ce réécrire en utilisant la fonction Gigogne. Voir l'aide, et s'inpirer de l'autre procédure.

merci comme meme pour ton aide Dranreb
 

samia89

XLDnaute Nouveau
Re,

Pour le critère 'Client", on a ajouté un 4ème argument à la fonction RecapJour(...)
Voir fichier joint.

rebonjour mapomme tt fonction bien mais y a un petit problème j'ai oublier de le souligner dans le poste précédent si que quand la cellule 'E1' et vide le résultat doit être tout de même afficher tout les résultat des sortie de la date inséré dans "A1'
toutes mes excuses et merci encor une fois
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 184
dernier inscrit
amiko