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 :

Débutant // Problème code VBA


Sujet :

Macros et VBA Excel

  1. #21
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Re
    J'avais mis le total en fin de tableau, voici pour le mettre en début de tableau.
    Pour ce qui est de L et M, c'est juste en variante, tu choisiras ce que tu veux, dans la colonne L, seul la valeur est mise, en colonne M c'est la formule qui est inscrite (je vois pas trop l'intérêt ceci dis, ça aurait un sens de le faire uniquement si les valeur venaient a changer après la mise en place des formules.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Sub Sakarov()
    Dim TheCel As Range
    Dim FirstCel As Range
    Dim TheSh As Worksheet
    Dim LFirstCel As Long, LLastCel As Long
     
    'Initialisation de variables
    Set TheSh = Sheets("Feuil1")
     
    With TheSh 'permet de ne pas avoir a répeter TheSh a chaque fois, si vba rencontre un . il rajouetra TheSh devant
        'On marque la cellule A2 comme etant la 1ere de la serie
        Set FirstCel = .Range("A2")
     
        Do
            'On boucle de la cellule FirstCel+1ligne jusqu'a la derniere cellule non vide du tableau (+1 ligne qui servira a finir la boucle Do car elle sera vide)
            For Each TheCel In .Range(FirstCel.Offset(1, 0), .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0))
                'On regarde si le contenu des 2 cellules est différent
                If FirstCel.Value <> TheCel.Value Then
                    'TheCel represente une cellule contenant une valeur differente
                    'On memorise les lignes de la 1ere et derniere ligne
                    LFirstCel = FirstCel.Row
                    'On utilise donc la ligne superieur (offset(-1,...)) qui correspond a al derniere ligne contenant la mm valeur que FirstCel
                    LLastCel = TheCel.Offset(-1, 0).Row
                    'Et on met la somme dans la colonne L (offset(0,11)) a la meme ligne que la 1ere valeur
                    FirstCel.Offset(0, 11).Value = WorksheetFunction.SumProduct(.Range(.Cells(LFirstCel, "J"), .Cells(LLastCel, "J")), .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E"))) / WorksheetFunction.SumProduct(.Range(.Cells(LFirstCel, "K"), .Cells(LLastCel, "K")), .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")))
                    'Placer une formule au lieu de lla valeur (en colone M ici (offset(..,12)))
                    FirstCel.Offset(0, 12).Formula = "=SumProduct(" & .Range(.Cells(LFirstCel, "J"), .Cells(LLastCel, "J")).Address & "," & .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")).Address & ")/ SumProduct(" & .Range(.Cells(LFirstCel, "K"), .Cells(LLastCel, "K")).Address & "," & .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")).Address & ")"
                    'On quitte cette boucle
                    Exit For
                End If
            'Si les 2 cellules sont identiques, on continue la boucle
            Next TheCel
     
            'Ensuite Fisrtcel devent donc La cellule pointé pas TheCel
            Set FirstCel = TheCel
        'On retourne a Do jusqu'a ce que FirstCel soit vide
        Loop Until FirstCel.Value = ""
     
    End With
     
    End Sub
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  2. #22
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    J'ai un peu modifier mon code. Je mettais le résultat dans la bonne colonne, mais pas a la bonne ligne.

    En fait, la question que l'on se pose, c'est de savoir si, par exemple ton premier tableau a dans les cellule A le texte : "Banane", le tableau suivant, le texte "Orange", est il possible de retrouver plus tard, dans un autre tableaux l'un ou l'autre de ces textes?

    Si oui, mon code ne fonctionnera pas.

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    GALATANE, la réponse est : NON.

    IM-POS-SIBLE.

    ex:


    orange
    orange
    orange
    orange
    orange
    orange
    orange
    bleu
    bleu
    bleu
    bleu
    bleu
    bleu
    bleu
    bleu
    bleu
    bleu
    bleu
    vert
    vert
    vert
    vert
    vert
    vert
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron
    marron


    et après ça, on reverra jamais ni orange ni marron ni les autres cités ci-dessus

  4. #24
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    J'ai profiter d'un peu de temps ce matin pour vérifier mon code. Il y a encore du changement, mais rien de bien important. Ce sont juste les valeurs de base et de calcul de fin qui changent.
    Donc utilise bien le code actuellement affiché.

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    Messieurs.

    J'ai mis ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Sub Sakarov()
     
    Dim TheCel As Range
     
    Dim FirstCel As Range
     
    Dim TheSh As Worksheet
     
    Dim LFirstCel As Long, LLastCel As Long
     
    Set TheSh = Sheets("Feuil1")
     
    With TheSh 
     
        Set FirstCel = .Range("A2")
     
        Do
     
            For Each TheCel In .Range(FirstCel.Offset(1, 0), .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0))
     
                If FirstCel.Value <> TheCel.Value Then
     
                    LFirstCel = FirstCel.Row
     
                    LLastCel = TheCel.Offset(-1, 0).Row
     
                    FirstCel.Offset(0, 11).Value = WorksheetFunction.SumProduct(.Range(.Cells(LFirstCel, "J"), .Cells(LLastCel, "J")), .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E"))) / WorksheetFunction.SumProduct(.Range(.Cells(LFirstCel, "K"), .Cells(LLastCel, "K")), .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")))
     
                    FirstCel.Offset(0, 12).Formula = "=SumProduct(" & .Range(.Cells(LFirstCel, "J"), .Cells(LLastCel, "J")).Address & "," & .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")).Address & ")/ SumProduct(" & .Range(.Cells(LFirstCel, "K"), .Cells(LLastCel, "K")).Address & "," & .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")).Address & ")"
     
                    Exit For
     
                End If
     
            Next TheCel
     
                    Set FirstCel = TheCel
     
        Loop Until FirstCel.Value = ""
     
    End With
     
    End Sub
    Ca me dit ça :

    Erreur d'execution '6' Dépassement de capacité
    Quand je clic sur "débogage", ça me surligne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FirstCel.Offset(0, 11).Value = WorksheetFunction.SumProduct(.Range(.Cells(LFirstCel, "J"), .Cells(LLastCel, "J")), .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E"))) / WorksheetFunction.SumProduct(.Range(.Cells(LFirstCel, "K"), .Cells(LLastCel, "K")), .Range(.Cells(LFirstCel, "E"), .Cells(LLastCel, "E")))
    .... ????

  6. #26
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    Sur ce code, je peux pas t'aider plus. Je ne le comprend pas plus que toi.

    As tu essayer le mien pour tester?

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    Et idem pour celui de galatane

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Option Explicit
     
    Sub sommeprod_tableau()
     
    Dim debut As Integer
    Dim fin As Integer
    Dim continuer As Boolean
     
    debut = 2
    fin = 0
     
    While continuer = False 'debut de la boucle, continue tant que "continuer = Faux"
     
        fin = Application.WorksheetFunction.CountIf(Range("A:A"), Range("A" & debut)) + fin
            'recherche de la fin du tableau avec la fonction NBSI, en se referencant à la 1 ere cellule du tableau en cours.
     
        Range("L" & debut) = Application.WorksheetFunction.SumProduct(Range("J" & debut & ":J" & fin + 1), Range("E" & debut & ":E" & fin + 1)) / Application.WorksheetFunction.SumProduct(Range("K" & debut & ":K" & fin + 1), Range("E" & debut & ":E" & fin + 1))
            ' calcule du sommeprod
     
        If Range("A" & fin + 2) = "" Then continuer = True
            'condition de fin : Si la cellule suivante au dernier tableau analysé est vide, alors continuer = Vrai
     
        debut = fin + 2
            ' nouveau parametres, pour le tableau suivant
     
    Wend
     
    End Sub
    --------------------------------------------------------------------------------
    Dernière modification par Galatane

    : dépassement de capacité ...

  8. #28
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    Peux tu mettre un point d'arret en debut de code et avancer pas a pas (avec F8) pour me dire ouca bug? Car chez moi, le code passe bien

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    ça me surligne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("L" & debut) = Application.WorksheetFunction.SumProduct(Range("J" & debut & ":J" & fin + 1), Range("E" & debut & ":E" & fin + 1)) / Application.WorksheetFunction.SumProduct(Range("K" & debut & ":K" & fin + 1), Range("E" & debut & ":E" & fin + 1))

  10. #30
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    A ce moment la, quels sont les valeurs de debut et de fin?

  11. #31
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    J'ai essayé de remplacer "integer" par "long" ; mais ça marche pas non plus

  12. #32
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    L'erreur apparait au premier cycle ou plus tard?

  13. #33
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    euhhhh, que veux tu dire par "valeurs de début et de fin" ? dsl j'vois pas

    La macro ne part pas du tout. Ca me met direct ça. Erreur '6'

  14. #34
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    Quand ton execution est en pause, passe la souris sur les variable "Debut" et "Fin" ou met un espion dessus.

    Ca te permet de connaitre leurs valeurs actuelles.

  15. #35
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    debut = 1640

    fin = 1707

  16. #36
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Par défaut
    Entre ces ligne, n'y aurait il pas des cellule vide ou egale à zero dans la colonne E? et dans J ou K?

    Le seul cas ou j'arrive a reproduire l'erreur, c'est quand ma feuille est vide, ou que la premiere ligne du tableau est vide. Donc pas trop d'explication. Je laisse la main sur ce coup. Desolé

  17. #37
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    En J et K il y a souvent 0, 0% ou cellule vide. Ca dépend. En E, non, enfin, y'a plein de 0,0032 des trucs comme ça, mais jamais zéro zéro.

    Le seul cas ou j'arrive a reproduire l'erreur, c'est quand ma feuille est vide, ou que la premiere ligne du tableau est vide. Donc pas trop d'explication. Je laisse la main sur ce coup. Desolé

    Ca pourrait venir du fait que j'ai une en-tête ? J'ai une en-tête toute la ligne 1.

    Ou sinon, dans ma colonne A, ce qu'il y a a repérer ce sont des codes qui mêlent chiffres et lettres. Je précise ; sait-on jamais.

    C'est bon ça marche, c'est juste que le tableau était trop gros. J'ai pris 2.000 lignes de mon tableau de 30.000, et ça a marché nickel :p

    Merci

  18. #38
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 16
    Par défaut
    Messieurs,

    Je ne sais pas comment on met "résolu", mais c'est bel et bien résolu.


    Encore merci Galatane.


    A+

  19. #39
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Pour le tag il se trouve en bas de la discutions.
    Tu as également une fonction super intéressant, le bouton Edit!, celui ci te permet d'éditer un message que tu as déjà posté, ça évite de mettre un post supplémentaire qui grossi la conversation pour au final aucune plus value (4 messages d'affilés du même auteur par exemple )
    Autre petit truc très apprécie sur le fofo, le bouton # quand tu veux mettre du code, tu sélectionnes le code et tu appuis sur le bouton #, il se trouve dans le menu de mise en forme du message, ça évitera aux modos d'avoir à le faire pour toi
    Pour ce qui est de ton problème, c'est bien que tu l'ai résolu en ne prenant que 2000 lignes ... mais pourquoi ça ne marche pas sur les 30000 lignes? Il serait quand même intéressant de le découvrir? non? tu vas quand même pas scinder ton tableau en 15 parties pour n'avoir que 2000 lignes à chaque fois? Si?

    Il serait intéressant de connaitre les valeur des différentes variables lors du dépassement de capacité, je peux me tromper , mais a mon avis le problème est résolu en utilisant que 2000, uniquement par ce que le problème se pose sur une ligne plus éloignée, donc clore le sujet en l'état, c'est reculer pour mieux sauter.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Problème Code VBA, ajout non désiré sur bouton
    Par vivicente dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/06/2008, 17h33
  2. Problème code VBA
    Par nanot dans le forum VBA Access
    Réponses: 21
    Dernier message: 04/06/2008, 15h24
  3. Problème code vba
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2008, 12h03
  4. Problème code VBA :)
    Par Freygolow dans le forum Access
    Réponses: 4
    Dernier message: 17/05/2007, 15h43

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