Macro

Bonjour,

j'aimerai savoir s'il est possible de faire en sorte que la macro prenne en compte les valeurs ou les mots contenues dans les cellules plutot que l'emplacement des cellules.

merci davance pour votre aide
Configuration: Windows XP
Internet Explorer 7.0

15 réponses

  1. En fait il y a une des colonnes de mon tableau excel qui est consacree a un classement des noms (de 1 a 50, du rang 1 au rang 50)

    Cependant, cela ne signifie pas forcement que je ne souhaite classer que 50 noms car pour le rang 1 de ce classement, je souhaite quil y ait, par exemple, 5 noms. En realite ce ne sont pas des noms completement differents, ils correspondent a la meme societe mais a des services differents dans cette societe, cest pourquoi ils doivent avoir le meme rang.

    Cest plus clair ?

    Merci
    Manu
    0
    1. Bonjour,

      Je ne comprends pas ce que tu appelles "rang 1" dans Excel.
      -> "je veux que ces 7 lignes aient le rang 1"
      -1
      1. Merci pour ta reponse, j'arrive maintenant a faire remonter les lignes que je voulais en haut de mon tableau.

        A present, je souhaite faire un classement des 50 premiers noms. Les lignes que j'ai fait remonter correspondent a un seul et unique nom. Selon le fichier sur lequel je souhaite appliquer ma macro, le nombre de lignes correspondant a ce nom varie. Comment puis je faire pour qu'a chaque fois que j'applique ma macro, cette derniere applique le rang 1 a l'ensemble des lignes de ce meme nom, quelque soit le nombre de lignes du meme nom?

        Par exemple, j'ai 4 lignes avec le nom 'marita' et ces 4 lignes doivent avoir le rang 1, et si j'en ai 7, je veux que ces 7 lignes aient le rang 1.

        Merci
        Manu
        0
        1. OK, c'est le 1er point du message d'erreur qui explique la raison du bug :
          Lorsque la macro a tourné une première fois, la ligne a été insérée à la ligne 2, puis a émis le message d'erreur.
          Quand on refait tourner la macro, elle trouve à présent la ligne cherchée à la ligne 2, la sélectionne, puis essaye de resélectionner la ligne 2 pour l'insérer : erreur.

          Je n'avais pas cette erreur quand je l'ai testé car j'avais replacé la ligne insérée à sa place initiale avant de refaire tourner la macro.

          Cela signifie que tu ne dois faire ta recherche qu'à partir de la ligne 3 : afin d'éviter que la ligne 2 soit insérée sur elle-même ce qui cause une erreur.
          On remplace Colums("D:D").Find par Range("D3:D5000").Find par exemple (si tu es sûr de ne pas utiliser plus de 5000 lignes dans ton fichier).

          Dans l'aide sur "Insert" de VBA est indiqué que Shift:= ne peut être suivi que des variables 'xlShiftToRight' ou 'xlShiftDown' : xlUp n'est pas autorisé ici je crois.
          Comme tu veux insérer une ligne, utilise 'xlShiftDown'.

          Pour la boucle sur les personnes, un algorithme/VBA est :

          dim nombreTotal as integer
          nombreTotal = 15
          dim numero as integer
          dim nomPersonne as string
          dim listePersonnes as ????????
          
          For numero = 1 to nombreTotal
                 nomPersonne = listePersonnes(numero)
                 Range("D3:D5000").Find(What:=nomPersonne, LookAt:=xlPart, SearchOrder:=xlByRows).Activate 
                 ActiveCell.EntireRow.Cut 
                 Rows("2:2").Insert Shift:=xlShiftDown
          Next numero

          où listePersonnes peut se présenter de pleins de manières différentes : une liste dans un autre onglet de ton fichier excel, un vecteur rempli en dur au début de ton code, ...

          Cél
          -1
          1. Quand je supprime le "Shift:=xlUp" du inserer, il me reqffiche ce messqge d'erreur:

            l'erreur 1004 s'est produite lors du temps d'execution:

            la selection n'est pas valide
            il peut y avoir plusieurs raisons:

            ..les zones de copie colle doivent avoir la meme taille et forme pour pouvoir se superposer
            ..en utilisant la commande creer dans le menu inserer, sous menu nom, la file et colonne qui incluent les noms proposes ne s'incluent pas dans (manque la fin de la phrase)

            Merci
            Manu
            0
            1. Bonjour,

              J'ai recopié ton code : quand je supprime le "Shift:=xlUp" du insérer, cela fonctionne.
              -1
              1. Columns("D:D").Find(What:="Popaul", LookAt:=xlPart, SearchOrder:=xlByRows).Activate
                ActiveCell.EntireRow.Cut
                Rows("2:2").Insert Shift:=xlUp

                C'est a partir de la ligne en gras que ca plante. J'ai verifie je n'ai pas de cellule fusionne.

                De plus, ceci est une ecriture pour faire remonter une des lignes 'Popaul' et jaimerais les faire toutes remonter, comment puis je faire pour faire une boucle comme tu me le dis plus haut?

                Merci
                Manu
                0
                1. A priori c'est un problème au niveau d'un Couper/Coller ou Insérer. As-tu des cellules fusionnées ?
                  Pour mieux comprendre, peux-tu copier ici ta macro telle qu'elle est maintenant et indiquer à quelle ligne de code ça bugge ? (c'est la ligne qui est surlignée en jaune quand ça plante et que tu cliques sur Débogage)
                  Merci.
                  -1
                  1. La recherche marche manuellement c'est juste que je recherchais une partie du nom donc jai change whole par part.
                    maintenant, quand je lance la macro, il m'affiche ce message d'erreur:

                    l'erreur 1004 s'est produite lors du temps d'execution:

                    la selection n'est pas valide
                    il peut y avoir plusieurs raisons:

                    ..les zones de copie colle doivent avoir la meme taille et forme pour pouvoir se superposer
                    ..en utilisant la commande creer dans le menu inserer, sous menu nom, la file et colonne qui incluent les noms proposes ne s'incluent pas dans (manque la fin de la phrase)

                    Sur mon fichier excel, juste avant d'afficher le message d'erreur, la macro me selectionne bien la premiere case ou il y a le nom que je cherche mais ca s'arrete la.

                    merci encore pour ton aide
                    Manu
                    0
                    1. c'est parce que la recherche n'a rien donné.
                      - est-ce que ça marche au moins quand tu le fais manuellement ?
                      - est-ce que le nom que tu recherches est bien présent sur la feuille sélectionnée ?
                      - est-ce que tu cherches dans la bonne plage ? Columns("A:A").Find recherche dans la colonne A. Si tu veux rechercher dans toute la feuille, corrige en Cells.Find
                      - est-ce que tu recherches le nom entier ou une partie du nom ? LookAt:=xlWhole pour chercher le nom entier ou bien LookAt:=xlPart pour une recherche sur une partie du nom.
                      A suivre...
                      I.
                      -1
                      1. Tu as tout a fait compris ce que je voulais faire.
                        Cependant, lorsque je mets ta formule dans vba et que j'applique la macro, un message d'erreur apparait en me disant ceci (c'est une traduction de l'espagnol donc il se peut qu'en francais ca ne soit pas exactement ca):

                        l'erreur '91' s'est produite lors du temps d'execution:
                        variable d'objet ou bloque With non etabli

                        merci encore
                        Manu
                        0
                        1. Ah d'accord ! je me disais bien, aussi , que ce que j'avais compris de ta question initiale semblait beaucoup trop simple pour être vrai ! Oublie donc ma réponse.
                          En fait, tu voudrais non pas couper/coller la ligne 9, mais bien la ligne à laquelle se trouve le nom "Popaul" (par exemple), lequel change de place d'un fichier à l'autre... ?
                          Bien que prétendant ne rien y connaître, comme tu sembles au moins avoir bien compris l'enregistrement automatique de macros, tu peux la refaire en commençant par une recherche du nom (ctrl+F ou Edition/Rechercher). Ainsi, ça sélectionne la cellule qui contient le nom, où qu'il se trouve. Après, tu n'as plus qu'à faire "couper la ligne entière à partir de la cellule active" (ActiveCell.EntireRow.Cut)
                          Exemple :
                          au lieu d'écrire
                          Rows("9:9").Select
                          Selection.Cut
                          Rows("2:2").Select
                          Selection.Insert Shift:=xlDown

                          ton code devient
                          Columns("A:A").Find(What:="Popaul", LookAt:=xlWhole, SearchOrder:=xlByRows).Activate
                          ActiveCell.EntireRow.Cut
                          Rows("2:2").Insert Shift:=xlDown

                          Bien sûr, tu modifies "Popaul" par le nom recherché ; aussi, tu modifies Columns("A:A") par les coordonnées de la plage dans laquelle tu recherches le nom.

                          Au lieu de répéter l'opération autant de fois que nécessaire, sache que, comme tu sembles avoir une liste de dix noms à remettre dans l'ordre, il est possible de faire une boucle à partir de ta liste.
                          A suivre...
                          I.
                          -1
                          1. ah oui j'oublai...je n'y connai vraiment rien en programmation et la ligne que tu m'as donne, je ne sais pas du tout comment l'utiliser, ou la placer.
                            0
                            1. Tout d'abord merci pour ta reponse.

                              voici mes lignes de vba:

                              Rows("9:9").Select
                              Selection.Cut
                              Rows("2:2").Select
                              Selection.Insert Shift:=xlDown
                              Rows("10:10").Select
                              Selection.Cut
                              Rows("3:3").Select
                              Selection.Insert Shift:=xlDown
                              Rows("15:15").Select
                              Selection.Cut
                              Rows("4:4").Select
                              Selection.Insert Shift:=xlDown
                              Rows("38:38").Select
                              Selection.Cut
                              ActiveWindow.SmallScroll Down:=-30
                              Rows("5:5").Select
                              Selection.Insert Shift:=xlDown
                              Rows("44:44").Select
                              Selection.Cut
                              ActiveWindow.SmallScroll Down:=-30
                              Rows("6:6").Select
                              Selection.Insert Shift:=xlDown
                              Rows("81:81").Select
                              Selection.Cut
                              ActiveWindow.SmallScroll Down:=-48
                              Rows("7:7").Select
                              Selection.Insert Shift:=xlDown
                              Rows("82:82").Select
                              Selection.Cut
                              ActiveWindow.SmallScroll Down:=-48
                              Rows("8:8").Select
                              Selection.Insert Shift:=xlDown
                              Rows("15:15").Select
                              Selection.Copy
                              Rows("9:9").Select
                              Selection.Insert Shift:=xlDown
                              ActiveWindow.SmallScroll Down:=11
                              Rows("40:40").Select
                              Application.CutCopyMode = False
                              Selection.Cut
                              ActiveWindow.SmallScroll Down:=-9
                              Rows("10:10").Select
                              Selection.Insert Shift:=xlDown
                              ActiveWindow.SmallScroll Down:=27
                              End Sub

                              j'aimerai qu'au lieu d'aller chercher la ligne 9 (premiere ligne) par exemple, il aille chercher le nom ecrit dans la ligne, qui dans un autre fichier avec lequel je voudrai utiliser cette macro, pourrait etre dans la ligne 23 par exemple. est ce que c'est possible?

                              merci encore
                              Manu
                              0
                              1. Bonjour Manu,
                                utilise la propriété Value de la cellule, qui renvoie son contenu
                                Range("A1").Value
                                I.
                                0