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 :

Macro pour traiter une colonne en relatif


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut Macro pour traiter une colonne en relatif
    Bonjour,

    JE désire effectuer de sommes sur une colonne .
    1) premier problème ma colonne n'a pas toujours la meme place sur ma feuille donc comment faire que la macro s'execute sur la bonne colonne (faut-il faire une boite de dialogue qui demande à l'utilisateur ou se trouve la colonne je pense qu'il y a plus simple.


    2)je souhaite parcourir la colonne avec des if mes je sais pas comment terminer ma boucle . Je descends d'une case a chaque itération mais comment s'arreter

    Merki

  2. #2
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 158
    Points : 71
    Points
    71
    Par défaut traiter ubne colonne en relatif
    Bonjour,
    je ne sais pas si c'est la solution la plus simple mais moi, je fais ouvrir une boite de dialogue qui à l'utilisateur de saisir la valeur que tu veux récuperer et après il suffit d'integrer une nouvelle variable que tu vas insérer dans tes lignes de calculs.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Rapport1").Range(Cells(s, 13), Cells(s, 14)).Copy
    ps je ne sais pas si t'as compris ou si c'est ce que tu cherches

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 192
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par jacques64
    Bonjour,

    JE désire effectuer de sommes sur une colonne .
    1) premier problème ma colonne n'a pas toujours la meme place sur ma feuille donc comment faire que la macro s'execute sur la bonne colonne (faut-il faire une boite de dialogue qui demande à l'utilisateur ou se trouve la colonne je pense qu'il y a plus simple.


    2)je souhaite parcourir la colonne avec des if mes je sais pas comment terminer ma boucle . Je descends d'une case a chaque itération mais comment s'arreter

    Merki
    Bonjour Jacques,

    1) D'accord t'as colonne n'a pas toujours la même place. Néanmoins, garde t-elle le même intitulé?

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    lgcount = 16 'commence à la ligne 16
        Do While Cells(lgcount, 2).Value > ""
            Cells(lgcount, 1) = [D9] 'ce que tu veux faire (i.e le but de ton parcours sur la colonne)
            lgcount = lgcount + 1
        Loop
    n'oublie pas de dim lgcount as integer !

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    merci pour ces réponses , celineM et shah06

    1) Oui ma colonne garde le meme intitulé dans tous les cas.

    merci

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Bonjour a vous,
    Oui ma colonne garde le meme intitulé dans tous les cas.
    Dans ce cas, et si jamais tu es sur que la colonne sera toujours la et contient un mot unique dans la feuille (sinon il faut ajouter une gestion des erreurs et des controle pour voir si c'est la bonne, pas tres complique a ajouter mais a ajouter toute de meme )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NoCol = Workbooks("nomworkbook").Cells.Find("Nomdelacolonne").column

  6. #6
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    ok merci pour cette info je teste en esperant réussir à tapre le bon code

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Je n'arrive pas a faire tourner mon code , de fonctions me sont inconnues (je suis totalement neswbie en VBA)

    Voici mon code si ca peut aider , en commentaire il y a les fonctions que je ne sais pas implementer
    1)se placer a la bonne colonne une fois que jai le numéro.

    2)inscrie dans la colonne située a droite de celle que je traite , la somme partielle que je calcule.

    j'ai une colonne a traiter du type : 0,0,5,5,0,0,1,1,0,0,2,0,0,0 du coup je veux écrire dans la colonne de droite 0,0,10,0,0,0,2,0,0,0,2,0,0,0

    mon code ci dessous
    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
     
    Sub Dts()
     
    Dim NoCol As Integer
    Dim NoColAdjacente As Integer
    Dim lgcount As Integer
    Dim NomCellule As String
    Dim SommePartielle As Double
     
     
    NoCol = Cells.Find("EXU4M").Column 'retrouve la bonne colonne dans la feuille
    NoColAdjacente = NoCol + 1
     
     
    lgcount = 3 'commence à la ligne 3
        Do
                Do While Cells(lgcount, NoCol).Value > 0
                    SommePartielle = SommePartielle + Cells(lgcount, NoCol)
                Loop
     
            Cells(lgcount, NoColAdjacente) = SommePartielle 'inscrie a droite sur la meme ligne la somme partielle'
     
            lgcount = lgcount + 1
        Loop Until Cells(lgcount, NoCol) = ""
     
     
    End Sub
    Toute remarque sur le code ou une erreur de code sera vraimetn la bienvenue par exemple je suis meme pas sur s'il faut que je fasse une sub ou une fonction c'est pour dire...

    Merci

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    j'ai une colonne a traiter du type : 0,0,5,5,0,0,1,1,0,0,2,0,0,0 du coup je veux écrire dans la colonne de droite 0,0,10,0,0,0,2,0,0,0,2,0,0,0
    Un doute me prends, chaque cellule contient des valeurs separees par des virgules (0,0,5,5,0,0,1,1,0,0,2,0,0,0) ou bien chaque cellule contient une valeur et la colonne donne un truc du genre:
    0
    0
    5
    5
    0
    0
    1
    ...

    Parce que dans le premier cas c'est un gros morceau a traiter...

  9. #9
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    non chaque cellule comporte 1 seule valeur qui peut etre 1 entier ou 1 réel mais positif ex : 55 ou bien 0.255 donc c'est bien du genre
    0
    0
    0
    5
    0
    0
    12.123
    0
    4
    0


    Voici mon pseudo code qui se lance et l'ordi freeze....

    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
     
    Sub Dts()
     
     'Macro2 Deversements deversements
     
     
     
    Dim NoCol As Integer
    Dim NoColAdjacente As Integer
    Dim lgcount As Integer
    Dim NomCellule As String
    Dim SommePartielle As Double
     
     
    NoCol = Cells.Find("EXU4M.1 US Débit (Débit (m3/s))").Column 'retrouve la bonne colonne dans la feuille
    NoColAdjacente = NoCol + 1
     
     
    lgcount = 3 'commence à la ligne 3
        Do
                Do While Cells(lgcount, NoCol).Value > 0
                    SommePartielle = SommePartielle + Cells(lgcount, NoCol)
                Loop
     
            Cells(lgcount, NoColAdjacente) = SommePartielle 'inscrie a droite sur la meme ligne la somme partielle'
     
            lgcount = lgcount + 1
        Loop Until Cells(lgcount, NoCol) = ""
     
     
    End Sub
    Y a surement plus court , de tte facon il freezz je sais pas pourquoi.

    Merci

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    le programme ne marche pas pour ma deuxieme boucle, il parcours bien la colonne tant qu'il y a des zeros mais bloque a la premiere valeur non nulle que se passe t-il?


    Merci

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    de tte facon il freezz je sais pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do While Cells(lgcount, NoCol).Value > 0
                    SommePartielle = SommePartielle + Cells(lgcount, NoCol)
    Loop
    Il faurait peut etre incrementer lgcount, sinon il continue de copier indefiniment la meme cellule

    Je pense qu'il va te falloir un deuxieme indice pour la colonne de droite.

    Ceci dit ton programme est tres pres d'etre fini

  12. #12
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Mon programme tourne mais il s'arrete au 3/4 faute de mémoire disponible.

    je traite un gros fichiers , 30 000 lignes environs donc est il possible d'optimiser le programme sachant que je n'ai pas d'info a retenir tout le long de l'execution (a part le nombre de fois ou j'ai rencontré un groupe de valeurs non nulles).

    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
     
    Sub Dts()
     
     'Macro2 Deversements deversements
     
     
     
    Dim NoCol As Integer
    Dim NoColAdjacente As Integer
    Dim lgcount As Integer
    Dim indicesomme As Integer
    Dim NomCellule As String
    Dim SommePartielle As Double
     
    indicesomme = 0
    NoCol = Cells.Find("EXU4M.1 US Débit (Débit (m3/s))").Column
     
    NoColAdjacente = NoCol + 1
     
     
    lgcount = 3 'commence à la ligne 3
        Do
                Do While Cells(lgcount, NoCol).Value <> 0
     
                    SommePartielle = SommePartielle + Cells(lgcount, NoCol)
                    lgcount = lgcount + 1
                    Cells(12, 1) = indicesomme
                Loop
     
            Cells(lgcount, NoColAdjacente) = SommePartielle 'inscrire a droite sur la meme ligne la somme partielle'
     
     
            lgcount = lgcount + 1
            If SommePartielle <> 0 Then indicesomme = indicesomme + 1
            SommePartielle = 0
     
        Loop Until Cells(lgcount, NoCol) = ""
     
     
    End Sub
    Je me demande si je stocke pas toutes les colonnes déja executées en mémoirese et que ca sert a rien, y a til une fonction de libération de la mémoire comme en langage C.

    Si il y a un moyen quelles sont les modifs exactes a faire dans le prog je suis neswbie total" en VBA

    Merci

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Il y a plusieurs choses possibles pour alleger la charge processeur et accelerer une macro mais pour la memoire je ne sais pas si ca aura un impact.

    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 Dts()
     
     'Macro2 Deversements deversements
     
     
     
    Dim NoCol As Integer
    Dim NoColAdjacente As Integer
    Dim lgcount As Integer
    Dim indicesomme As Integer
    Dim NomCellule As String
    Dim SommePartielle As Double
     
    Application.ScreenUpdating = False 'supprime l'actualisation de l'affichage
     
    indicesomme = 0
    NoCol = Cells.Find("EXU4M.1 US Débit (Débit (m3/s))").Column
     
    NoColAdjacente = NoCol + 1
     
     
    lgcount = 3 'commence à la ligne 3
        Do
                Do While Cells(lgcount, NoCol).Value <> 0
     
                    SommePartielle = SommePartielle + Cells(lgcount, NoCol).Value 'ajouter la propriete evite a Excel de la deviner, pas sur de l'impact mais bon ca mange pas de pain
                    lgcount = lgcount + 1
     
                Loop
     
            Cells(lgcount, NoColAdjacente).Value = SommePartielle 'inscrire a droite sur la meme ligne la somme partielle'
     
     
            lgcount = lgcount + 1
            If SommePartielle <> 0 Then indicesomme = indicesomme + 1
            SommePartielle = 0
     
        Loop Until Cells(lgcount, NoCol) = ""
                    Cells(12, 1) = indicesomme
    Application.ScreenUpdating = False
    End Sub
    edit:
    J'ai teste avec un fichier de 32000 lignes (la limite avec des integer) et 256 Mo de RAM (et on ne rigole pas ) ca a pris environ 3 secondes.
    Par contre il ne fait pas exactement ce que tu voulais...

  14. #14
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Ok merci pour l'info sur mon PC il indique "erreur n°6 depassement de capacité" au bout de 40 000 lignes environ . Je pense qu"on ne peut pas faire grand chose pour évter cela

  15. #15
    Membre actif Avatar de ilcocodrillo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Âge : 18
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 276
    Points
    276
    Par défaut
    pour aller au delà de 32 000 tu remplace le integer par double...

Discussions similaires

  1. [XL-2013] Une macro pour cacher une colonne qui ne fonctionne plus
    Par DavidCsame dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 02/03/2015, 14h17
  2. [XL-2010] Macro pour remplir une colonne avec un bouton
    Par Boujnah dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2014, 15h28
  3. Réponses: 1
    Dernier message: 25/12/2012, 21h04
  4. Réponses: 0
    Dernier message: 17/11/2012, 17h51
  5. Réponses: 11
    Dernier message: 11/04/2012, 20h04

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