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 Rank avec un nombre de ligne indéterminé


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Par défaut Macro Rank avec un nombre de ligne indéterminé
    Bonjour à ts, et joyeux Noel (un peu en retard)...
    Voila, j'ai un petit soucis de novice et je pense que qqn qui s'y connait un peu plus en VBA pourra m'aider...
    J'ai deux colonnes, disons en A et B, avec des identifiants en A et des performances en B. J'aimerais insérer une colonne en C, et faire un classement en utilisant la formule (Rank) automatiquement.....

    (cet exemple est simplifié, car j'ai environ 10 colonnes à créer comme cela (quotidiennement), c'est pourquoi ca serait plus simple d'avoir une macro...(

    Jusqu'ici j'ai le code pr trouver ma colonne, puis ajouter une colonne sur la droite...je voulais ensuite faire un boucle et utiliser formulaR1C1(rank) mais comme j'ai un nombre de lignes indéterminé et susceptible de changer à chaque fois, je ne sais comment définir la plage....auriez vous une solution???

    Merci d'avance et joyeuse fetes encore une fois

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Pour utiliser les formules d'excel via VB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.WorksheetFunction.Rank(...)

  3. #3
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonjour,

    L’élément primordial à connaître est CurrentRegion. Si dans l’environnement Excel tu cliques sur F5, qui est le raccourci pour "Atteindre", tu verras en bas un bouton "Cellules". Cliquer dessus donne accès à de nombreuses options, dont "Zone en Cours". CurrentRegion en est l’équivalent VBA.

    À partir de là, cliquer dans une cellule quelconque de la plage contenant les "identifiants en A et les performances en B" et utiliser CurrentRegion, permet de faire référence à l’ensemble des identifiants et des performances en A et B (à la condition expresse d’avoir au moins une ligne vide après les données (également avant les données, si celles.ci ne commencent pas à la ligne 1) et une colonne vie après les données). Plus précisément, il n’est pas indispensable que les lignes et les colonnes évoquées soient intégralement vides ; il faut que leurs cellules adjacentes aux plages qui t’intéressent en 1 et B soient vides.

    CurrentRegion.Cells(1, 1) correspond à la première cellule utile de la colonne A. Le reste en découle aisément (enregistrement automatique, et remplacement des numéros de lignes par des variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Classement()
    Dim NbLignes As Integer
        NbLignes = ActiveCell.CurrentRegion.Rows.Count
            With ActiveCell.CurrentRegion.Cells(1, 1)
                Range(.Offset(0, 2), .Offset(NbLignes - 1, 2)).FormulaR1C1 = "=RANK(RC[-1],R" & .Row & "C[-1]:R" & .Row & NbLignes - 1 & "C[-1])"
            End With
    End Sub
    Si les données sont précédées de titres, cette variante évitera d’avoir #VALEUR en colonne C sur la ligne de titres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ClassementAvecTitres()
    Dim NbLignes As Integer
        NbLignes = ActiveCell.CurrentRegion.Rows.Count
            With ActiveCell.CurrentRegion.Cells(2, 1)
                Range(.Offset(0, 2), .Offset(NbLignes - 2, 2)).FormulaR1C1 = "=RANK(RC[-1],R" & .Row & "C[-1]:R" & .Row & NbLignes - 1 & "C[-1])"
            End With
    End Sub
    NB - RANG() comporte un 3ème argument optionnel qui permet de choisir si l’ordre pour classer les résultats est croissant ou non. Ajoute-le si nécessaire.

    J’ai utilisé NbLignes comme variable, car c’est le naturel comme concept. On aurait pu rendre le code (1ère variante) un peu + concis, en utilisant le décalage entre la première et la dernière ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ClassementBis()
    Dim Decal As Integer
        Decal = ActiveCell.CurrentRegion.Rows.Count - 1
            With ActiveCell.CurrentRegion.Cells(1, 1)
                Range(.Offset(0, 2), .Offset(Decal, 2)).FormulaR1C1 = "=RANK(RC[-1],R" & .Row & "C[-1]:R" & .Row & Decal & "C[-1])"
            End With
    End Sub
    Si tu as des questions, n’hésite pas.

    ----

    @ Jérôme

    Je pense qu’il veut obtenir un classement en mettant en place les formules directement dans la feuille.

    On verra bien !

    Bonne fin d’année.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Par défaut
    Oulala, pardon pr le retard ...
    Dit donc, bcp de réponses !! je pense avoir compris a peu près...j'essaye et je reviens vers vous...


    Alr j'ai essayé, mais rien ne se passe.... voici mon nouveau code avec le votre....

    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
    Sub Macro6()
     
    Dim wb As Workbook
    Dim wsb1 As Worksheet
    Dim NbLignes As Integer
     
    Set wb = ActiveWorkbook
    Set wsb1 = wb.ActiveSheet
    NbLignes = ActiveCell.CurrentRegion.Rows.Count
     
    wsb1.Cells(wsb1.Cells.Find("Change", LookAt:=xlWhole).Row, wsb1.Cells.Find("Change", LookAt:=xlWhole).Column).Select
        Selection.EntireColumn.Insert Shift:=xlToRight ''''''''ici, ca ne marche pas, il me la met à gauche'''''
     
        With ActiveCell.CurrentRegion.Cells(2, 11)
                Range(.Offset(0, 2), .Offset(NbLignes - 2, 2)).FormulaR1C1 = "=RANK(RC[-1],R" & .Row & "C[-1]:R" & .Row & NbLignes - 1 & "C[-1])"
            End With
     
     
    end sub

    La colonne est bien créée, mais rien ne s'affiche dans les cellules. Pour être plus précis, je vais vous donnez les colonnes réelles....la colonne de référence (celle à classer) est la colonne K...j'ajoute ensuite une colonne sur la droite en L, dans laquelle je créé le classement...

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Par défaut
    Ok, je viens de réussir....mais il me fait un rank de la colonne d'apres aussi....

    voici le 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
    Sub Macro6()
     
    Dim wb As Workbook
    Dim wsb1 As Worksheet
    Dim NbLignes As Integer
     
    Set wb = ActiveWorkbook
    Set wsb1 = wb.ActiveSheet
     NbLignes = ActiveCell.CurrentRegion.Rows.Count
     
    wsb1.Cells(wsb1.Cells.Find("Change", LookAt:=xlWhole).Row, wsb1.Cells.Find("Change", LookAt:=xlWhole).Column).Select
        Selection.EntireColumn.Offset(0, 1).Insert
     
        With ActiveCell.CurrentRegion.Cells(2, 11)
        Range(.Offset(0, 1), .Offset(NbLignes - 2, 2)).FormulaR1C1 = "=RANK(RC[-1],R" & .Row & "C[-1]:R" & .Row & NbLignes - 1 & "C[-1])"
        End With
    lequel des offset dois je modifier?

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 71
    Par défaut
    Youhou !!! C'est bon, j'ai trouvé !!! voici le 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
    Sub Macro6()
     
    Dim wb As Workbook
    Dim wsb1 As Worksheet
    Dim NbLignes As Integer
     
    Set wb = ActiveWorkbook
    Set wsb1 = wb.ActiveSheet
     NbLignes = ActiveCell.CurrentRegion.Rows.Count
     
    wsb1.Cells(wsb1.Cells.Find("Change", LookAt:=xlWhole).Row, wsb1.Cells.Find("Change", LookAt:=xlWhole).Column).Select
        Selection.EntireColumn.Offset(0, 1).Insert
     
        With ActiveCell.CurrentRegion.Cells(2, 11)
        Range(.Offset(0, 1), .Offset(NbLignes - 2, 1)).FormulaR1C1 = "=RANK(RC[-1],R" & .Row & "C[-1]:R" & .Row & NbLignes - 1 & "C[-1])"
        End With

    Merci enormément pr votre aide !!! ce site est vraiment génial ! c'est rare de trouver des personnes qui peuvent aider autant ! merci encore !

  7. #7
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bravo et de rien !

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

Discussions similaires

  1. Somme.si avec un nombre de ligne variables
    Par Atofi dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/01/2010, 15h30
  2. Pagination avec un nombre de lignes limité
    Par Halex78 dans le forum Langage
    Réponses: 5
    Dernier message: 31/07/2008, 23h28
  3. Réponses: 3
    Dernier message: 17/04/2008, 16h01
  4. Lecture fichier texte avec un nombre de lignes à ignorer
    Par TravelMate dans le forum Langage
    Réponses: 20
    Dernier message: 02/08/2006, 12h59
  5. Réponses: 7
    Dernier message: 19/05/2006, 17h47

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