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 :

Incrémenter la référence de colonne ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Par défaut Incrémenter la référence de colonne ?
    Bonjour à tous

    Voilà je dois développer une petite macro pour mon boulot, on a des quantités assez importantes de données à traiter et faire des stat dessus.

    Voilà un peu la manière dont j'ai pensé le truc:

    On récupère en fait un liste de valeur à partir de notre logiciel de mesures, on crée une feuille pour chaque tableau de valeurs que l'on colle à partir de la cellule A1, on renomme la feuille de manière explicite.
    Le but de la macro est de rassembler toutes les valeurs dans une feuille "resultats"
    En gros on à une 15aine de ligne sur 2 colonne (1ère colonne: fréquences, 2ème colonne: niveau)
    On veux donc copier chaque tableau les uns a côté des autres et mettre en référence pour chaque séries de valeurs le nom de la feuille auxquelles les valeurs correspondent.
    Ensuite on calcule des stats mais je ne suis pas encore arrivé la

    En fait j'ai reussi à faire a peu près ce que je voulais mais en mettant les séries de valeurs les unes en dessous des autres.
    Mais ce n'est pas très utiles pour travailler.

    Voilà ce sur quoi je bloque:

    En A1 je veux coller le label de la feuille 1, en C1 le label de la feuille 2, E1->feuille 3, ... et ainsi de suite
    mais je ne trouve pas comme faire pour "incrémenter" la référence de la colonne.

    Je vous mets le code de la première version avec les séries les unes sous les autres
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Dim nbfeuilles As Single
    Dim nbfreq As Single
    Dim i As Single
    Dim j As Single
    Dim point As String
    Dim ligne As Double
    Dim freq As Single
    Dim cell As Single
    Dim cell2 As Single
     
     
    Sub Dispersion()
     
    nbfeuilles = InputBox("Coller l'export des légendes dans une feuille excel séparée", "Combien il y a-t-il de feuilles Excel?", vbOKOnly)
    nbfreq = InputBox("Indiquer le nombre max de fréquences relevées", "Nombre de fréquences") + 2
     
     
    ActiveWorkbook.Sheets.Add after:=Worksheets(nbfeuilles)
    Worksheets(nbfeuilles + 1).Name = "Resultat"
     
     
        ligne = 1
        cell2 = 3
     
     
    For i = 1 To nbfeuilles
     
     
        cell = 4
     
     
            point = Worksheets(i).Name
            Worksheets("resultat").Range("A" & ligne) = point
     
            Worksheets(i).Range("B4:C20").Sort _
            Key1:=Worksheets(i).Range("B4")
     
     
        For j = 0 To nbfreq
     
            freq = Worksheets(i).Range("B" & cell)
            level = Worksheets(i).Range("C" & cell)
     
            If freq > 0 Then
     
            Worksheets("resultat").Range("A" & cell2) = freq
            Worksheets("resultat").Range("B" & cell2) = level
     
            End If
     
            Worksheets("resultat").Activate
            Range("A" & cell2).Select
            Selection.NumberFormat = "0"
            Range("B" & cell2).Select
            Selection.NumberFormat = "0.0"
        Cells.Select
            With Selection
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .WrapText = False
                .Orientation = 0
                .AddIndent = False
                .IndentLevel = 0
                .ShrinkToFit = False
                .ReadingOrder = xlContext
                .MergeCells = False
            End With
     
     
        cell = cell + 1
        cell2 = cell2 + 1
     
     
     
        Next
     
     
     
            ligne = cell2 - 2
     
    Next
     
     
    End Sub
    S'il y a besoin je peux mettre le fichier Excel avec kkes valeurs

    Merci d'avance

    Chamo

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 95
    Par défaut
    Salut,

    Alors, en fait, il existe une technique toute bête (quand on la connait) qui te permet de faire ce genre de truc: c'est d'utiliser des offset (j'aime beaucoup les offsets).
    En gros, tu fais une boucle sur ton nombre de feuilles et tu te déplaces en conséquence. Ci-dessous un exemple de ma pensée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sheets("Resultats").Select
    Range("A1").Select
    for i = 1 To nbfeuilles Step 1
        'lire les données dans la bonne feuille
        Activecell.Offset(k;2*(i-1)).Value=mesdonnees 
        ' le i-1 sert à ne pas décaler pour la première feuille, le 2* permet de  
        ' décaler de 2 colonnes
        ' le k sert pour te promener dans les lignes
    next i
    Juste au passage, suivant comment tu décides de lire et d'écrire tes données, tu risques de passer souvent d'une feuille à l'autre, ce qui prend énormément de temps car régénération de l'écran. Pour accélérer ton code, tu peux donc utiliser la désactivation du rafraichissement de l'écran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.ScreenUpdating = False '= True pour réactiver le rafraichissement
    Bon code...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Par défaut
    Merci de ta réponse

    Je n'avais pas pensé au coup de l'offset, bien vu

    Je teste ca et ensuite je risque fort d'avoir de nouvelles questions

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 95
    Par défaut
    Aucun souci pour les autres questions...

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par grrimag
    Alors, en fait, il existe une technique toute bête (quand on la connait) qui te permet de faire ce genre de truc: c'est d'utiliser des offset (j'aime beaucoup les offsets).
    Moi j'aime pas les select
    Tu as une autre façon de procéder, en utilisant ou non les offsets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)
    Worksheets(Worksheets.Count).Name = "Resultat"
    NoCol = 1
    For i = 1 To ActiveWorkbook.Worksheets.Count - 1
            Cells(1, NoCol) = Worksheets(i).Name
            NoCol = NoCol + 2
    Next
    La sélection de feuilles ou de cellules ralentit les procédure en plus d'alourdir le code. Il est recommandé et on peut toujours éviter de l'utiliser.
    Juste pour info

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 95
    Par défaut
    Merci pour l'info, c'est en effet dommage de ralentir l'exécution par ce biais.

    Cependant (et c'est beaucoup pour cela que j'utilise les select), cela permet une certaine lisibilité pour un humain qui reprend le code derrière, notamment un humain qui n'est pas développeur. Dans mon entreprise, je suis (presque) le seul à développer des macros sous VBA pour les besoins des collègues et il se trouve que, de temps en temps elles ont besoin de regarder le code et le modifier légèrement (genre changement de place du résultat ou du nom de fichier). Donc, comme je peux pas être partout (et que je serai pas tout le temps dans l'entreprise), le code doit être compréhensible bien au delà des simples commentaires, et le select permet ce tte lisibilité même si ça ralentit un peu le code.
    De toutes façons, le temps d'exécution est extrêmement faible pour un humain(genre moins de 1 seconde) pour que ce soit vraiment un problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/09/2013, 12h13
  2. Incrémenter une référence
    Par rafikos2 dans le forum Débuter
    Réponses: 5
    Dernier message: 09/04/2008, 12h34
  3. Réponses: 4
    Dernier message: 24/02/2008, 21h16
  4. Référence à une colonne dans un autre select
    Par vlefevre dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/01/2008, 09h48
  5. Réponses: 4
    Dernier message: 06/05/2007, 12h57

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