IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Utiliser une worksheet function avec 60000 lignes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Utiliser une worksheet function avec 60000 lignes
    Bonjour,

    J'ai un programme excel qui doit realiser des "somme si" environ 60000 fois.
    J'ai essayé 2 types de codes differents sous vba, mais à chaque fois, l'execution est trop longue et la macro bug avant de pouvoir se terminer :

    Code 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 2 To nbLigneSynthese2 + 1
     
    Synthese.Cells(i, 7) = Application.WorksheetFunction.SumIf(Reglements.Cells(2, colonneBPReglements).Resize(nbLigneReglements, 1), Synthese.Cells(i, 7), Reglements.Cells(2, colonneMontantReglements).Resize(nbLigneReglements, 1))
    Next i

    Code 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Synthese.Cells(i, 7).resize(nbLigneSynthese2,1) = Application.WorksheetFunction.SumIf(Reglements.Cells(2, colonneBPReglements).Resize(nbLigneReglements, 1), Synthese.Cells(i, 7).resize(nbLigneSynthese2,1), Reglements.Cells(2, colonneMontantReglements).Resize(nbLigneReglements, 1))

    (Je ne suis pas sur que le code 2 marche..)

    Pour info : la variable nbLigneSynthese2 equivaut à peu pres a 60000 lignes.
    Et Reglements ainsi que Synthese sont les noms de feuilles excel.
    Les autres variables sont des variables globales.

    Auriez vous une idée pour que j'arrive à éxecuter ce type de code??
    Merci

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 855
    Points : 28 774
    Points
    28 774
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai essayé 2 types de codes differents sous vba, mais à chaque fois, l'execution est trop longue et la macro bug avant de pouvoir se terminer :
    Quel est le message d'erreur ?
    Comment est déclarée la variable i ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    La variable i est déclaré en long.
    Il n'y a pas de message d'erreur car c'est excel qui se met a bugger au bout de quelques minutes (pas de réponse.. et je dois redemarrer excel). Pourtant ce n'est pas un probleme de PC car j'ai une bonne config.
    Je pense que le probleme vient du fait qu'avec mon code, il passe sans arret entre 60000lignes excel, pour revenir à vba. Et il le fait 60000 fois..

    N'y aurait-il pas un moyen de fonctionner en vecteur ou en tableau pour économiser le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reglements.Cells(2, colonneBPReglements).Resize(nbLigneReglements, 1)
    (nbLigneReglements = 60000 à peu pres)

  4. #4
    Membre habitué
    Homme Profil pro
    Consultant comptable
    Inscrit en
    Mai 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant comptable

    Informations forums :
    Inscription : Mai 2011
    Messages : 137
    Points : 160
    Points
    160
    Par défaut
    Mais tu es obligé de faire un resize à chaque ligne ?
    tu ne peux pas le faire en final avec une procédure qui gèrera ton format ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je ne comprends pas bien ta réponse??

    Ce que je pensais faire (mon 1er code), c'était faire une boucle for allant de 1 à 60000, et qui générait à chaque fois le somme si.
    Or dans la formule somme si, on doit prendre toute la plage de donnée pour pouvoir faire la somme..ce qui explique le resize.

    Comment est ce que je pourrais faire autrement?

  6. #6
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour kirareuel,

    Si je traduis bien ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Synthese.Cells(i, 7) = Application.WorksheetFunction.SumIf(Arg1, Arg2, Arg3)
    avec :
    Arg1 = Reglements.Cells(2, colonneBPReglements).Resize(nbLigneReglements, 1) 'plage de cellules qui doit être évaluée par le critère.
    Arg2 = Synthese.Cells(i, 7) 'critère qui définit les cellules à ajouter.
    Arg3 = Reglements.Cells(2, colonneMontantReglements).Resize(nbLigneReglements, 1) 'cellules réelles à ajouter si les cellules correspondantes dans la plage correspondent au critère.

    Le deuxième paramètre (Arg2) fait référence à la cellule qui reçoit également le résultat. A priori, tu obtiens donc une référence circulaire .

    Cordialement.

Discussions similaires

  1. Utiliser une DLL Delphi avec C#
    Par h8ciz dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/09/2007, 16h46
  2. Utiliser une image DirectX avec GDI?
    Par Fynchi dans le forum DirectX
    Réponses: 11
    Dernier message: 02/11/2006, 09h36
  3. Réponses: 7
    Dernier message: 11/10/2006, 13h35
  4. [WD10] Utiliser une fonction OpenGL avec pointeur (int)
    Par Zoons dans le forum WinDev
    Réponses: 3
    Dernier message: 06/07/2006, 16h38
  5. utiliser une expression régulliere avec la methode getelementbyid
    Par rootdaoud dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/05/2006, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo