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. Bonjour Manu,
    utilise la propriété Value de la cellule, qui renvoie son contenu
    Range("A1").Value
    I.
    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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Bonjour,

                            J'ai recopié ton code : quand je supprime le "Shift:=xlUp" du insérer, cela fonctionne.
                            -1
                            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. Bonjour,

                                Je ne comprends pas ce que tu appelles "rang 1" dans Excel.
                                -> "je veux que ces 7 lignes aient le rang 1"
                                -1