Recentrage automatique d'un tableau

Résolu
Bonjour et bonne année 2016 à tous,

J’ai créé une fonction macro recentrage sous Excel 2003. Pas de problème à ce niveau.

Mon problème c’est que je souhaiterais que la sélection soit automatique quelque soit l’emplacement du tableau (donc uniquement une sélection de la zone de donnée) mais je ne trouve pas la solution.

Ci-joint un fichier d’exemple : https://www.cjoint.com/c/FAgqSjEp6gt

Merci de votre aide

Cordialement

23 réponses

Résumé de la discussion

Une macro de recentrage sous Excel 2003 doit sélectionner automatiquement la zone de données quel que soit son emplacement, et déplacer ensuite cette zone vers une cellule cible, indépendamment des modifications du fichier. Des solutions proposées reposent sur la détection des bornes par Cells.Find avec xlByRows et xlByColumns, puis sur la définition d'une plage et son repositionnement automatique vers la cellule cible. D'autres interventions évoquent des questions pratiques comme la liaison des macros au fichier sauvegardé et les ajustements lors des changements de nom, en fonction du positionnement initial des cellules cibles. En cas d’expérimentation, certains proposent des exemples concrets et des vérifications de résultats, tout en signalant que la localisation exacte peut influencer le zoom ou la sélection ultérieure.

Bobot (l’IA à votre service)
  1. Bonjour

    Difficile même avec ton exemple de comprendre ce que tu veux; peux tu compléter tes explications.
    Du genre
    J'ai un tableau en C4:K8, je veux .....

    Cdlmnt
    0
    1. Bonjour,

      Quelque soit l’emplacement du tableau sur la feuille, je souhaite le sélectionner puis le replacer sur le haut de la feuille.

      Cordialement
      0
      1. Un exemple avec ce que j'ai compris
        http://www.cjoint.com/c/FAgrRI3GCkk

        Cdlmnt
        0
        1. Une autre possibilité
          http://www.cjoint.com/c/FAgrY4Y6DCk
          0
      2. Ta solution marche très bien pour moi, merci.
        Est-il possible que la sélection soit automatique ?

        Cordialement
        0
        1. as tu essayé la deuième possibilité (message 4) ?
          0
        2. Ça marche nickel.
          Je tente de mettre cette fonction dans un fichier plus complexe après diner et je te donne le résultat.
          Merci beaucoup pour tes réponses.

          Cordialement
          0
        3. J’ai fait des essais et la fonction marche très bien sauf dans le cas ou il y a des cases vides entre deux colonnes. Y a-t-il une solution ?

          Voir fichier joint : https://www.cjoint.com/c/FAguhpMXATt

          cordialement
          0
      3. Essaies ceci

        Const celcible = "A1"

        Sub recentrage()
        Dim derlig As Long, dercol As Long, plage As Range
        Dim premlig As Long, premcol As Long
        derlig = Cells.Find("*", , , , xlByRows, xlPrevious).Row
        premlig = Cells.Find("*", , , , xlByRows, xlNext).Row
        dercol = Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        premcol = Cells.Find("*", , , , xlByColumns, xlNext).Column
        Set plage = Range(Cells(premlig, premcol), Cells(derlig, dercol))
        plage.Cut Destination:=Range(celcible)
        End Sub

        Cdlmnt
        0
        1. Je rame depuis plus de 30 minutes pour comprendre pourquoi ta fonction (ccm81-9) qui marche si bien dans les exemples ne fonctionnée pas sur mon fichier.

          Et voila pourquoi :

          Dans mon ficher, les colonnes A et B et les lignes 1 et 2 ne doivent pas être prises en compte !
          Le point de recalage haut doit être C3.

          Aurais-tu une petite modification à me proposer ?

          https://www.cjoint.com/c/FAgvhKNLdwt

          Merci

          Cordialement
          0
          1. Je ne comprends pas bien le problème, sur ton fichier exemple
            PremLifg = 9
            PremCol = 6 (F)
            DerLig = 42
            DerCol = 18 (R)
            Ce qui définit la plage rectangulaire F9:R42
            qui est bien déplacée en C3:O36 après exécution
            Ce n'est pas ce que tu veux ?

            Cdlmnt
            0
            1. OK ccm81, toutes mes excuses, je n’avais pas remarqué que mon bouton de commande macro pointé sur une autre version de fichier avec le positionnement en A1. pb lorsque j'ai sauvegardé le fichier de la version 4 à la version 5.

              Ça marche donc très bien. Merci

              Comment faut-il faire pour que les macros soient toujours bien accrochée au fichier sauvegardé en cas de changement de nom?

              Cordialement
              0
              1. En principe un "eregistrer sous" conserve le lien du raccourci-clavier vers la macro.
                Par contre, si tu integres la macro à un nouveau fichier, il te faut recréer le raccourci-clavier
                L'adresse de la cellule cible (A1 devenu C3) doit bien sûr être modifiée dans la macro en cas de changement de configuration

                Cdlmnt
                0
                1. merci pour toutes les réponses

                  cordialement
                  0
                  1. Bonjour,

                    A l’utilisation de la fonction recentrage_zoom, dans mon fichier joint, j’ai un petit probléme : https://www.cjoint.com/c/FAju7VTssXt

                    La fonction macro recentrage_zoom marche très bien si il n'y a pas de donnée dans la one en jaune, mais je souhaiterais que cette fonction soit réalisée même s’il y a des données dans les céllules en jaune, donc,

                    Que la zone verte, dans l’exemple joint, soit déplacée mais que la zone jaune reste toujours en place.

                    Avez-vous une solution ?

                    cordialement
                    0
                    1. Bonjour

                      Essaies celle-ci

                      Public Sub Cale()
                      Dim lideb As Long, codeb As Long, lifin As Long, cofin As Long, li As Long, co As Long
                      Dim plage As Range
                      With ActiveSheet
                      lideb = .Range(celcible).Row
                      codeb = .Range(celcible).Column
                      lifin = Cells.Find("*", , , , xlByRows, xlPrevious).Row
                      cofin = Cells.Find("*", , , , xlByColumns, xlPrevious).Column
                      li = lideb - 1
                      Do
                      li = li + 1
                      co = .Cells(li, Columns.Count).End(xlToLeft).Column
                      Loop Until co > codeb
                      lideb = li
                      co = codeb - 1
                      Do
                      co = co + 1
                      li = .Cells(Rows.Count, co).End(xlUp).Row
                      Loop Until li > lideb
                      codeb = co
                      'MsgBox .Cells(lideb, codeb).Address
                      Set plage = .Range(.Cells(lideb, codeb), .Cells(lifin, cofin))
                      plage.Cut Destination:=Range(celcible)
                      End With
                      End Sub

                      Cdlmnt
                      0
                      1. Bonjour à tous,
                        Bonjour CCM81

                        Merci CCM81pour ta fonction qui marche très bien.
                        Je vais essayé d'y ajouter la fonction zoom sur la zone recentrée.

                        Cordialement
                        0
                        1. Re

                          Après utilisation dans mon fichier, je me suis aperçu qu’il y avait des déplacements qui étaient suspect.

                          La fonction si dessous ne semble pas sélectionner la dernière ligne (de ma zone en vert dans mon fichier) mais la dernière ligne de la zone jaune que je ne doit pas changé de place.
                          Ça ne dérange pas trop la fonction de recentrage mais lorsque je souhaitais utiliser les coordonnées pour faire un zoom sur cette sélection ça ne marche pas.

                          lifin = Cells.Find("*", , , , xlByRows, xlPrevious).Row

                          Heureusement que ce type de forum existe, car seul je galère grave. J’ai passé toute la soirée pour essayer de comprendre comment faire sans trouver de solution.

                          Aurais-tu une solution à me proposer.

                          https://www.cjoint.com/c/FAkvUgwWISt

                          Merci d’avance

                          Merci
                          0
                      2. En principe, en ajoutant les 5 lignes avant End With, ça devrait fonctionner

                          lifin = Cells.Find("*", , , , xlByRows, xlPrevious).Row
                        cofin = Cells.Find("*", , , , xlByColumns, xlPrevious).Column
                        Set plage = .Range(.Cells(1, 1), .Cells(lifin, cofin))
                        plage.Select
                        ActiveWindow.zoom = True
                        End With

                        Bonne soirée
                        0
                        1. Re,

                          La fonction zoom est ok, merci encore une foi, mais j'ai le problème de sélection de la lifin qui n'est pas la bonne.
                          Pb exposé dans le poste 19.

                          aurais-tu une solution ?

                          cordialement
                          0
                      3. Re, re ...

                        Je crois qu'il y avait plus que ça, essaies celle là !
                        http://www.cjoint.com/c/FAlpgSY1I8I

                        Cdlmnt
                        0
                        1. Re, re, re ...

                          Et surtout celle là nettement plus simple
                          http://www.cjoint.com/c/FAlp6FrNhuI

                          Cdlmnt
                          0
                          1. Bonjour à tous,

                            bonjour ccm81 et merci pour les réponses.

                            La fonction zoom prend toujours en compte des données de la zone jaune.
                            Ce que je souhaiterais, si possible, c'est de faire un zoom uniquement sur la zone recadrée donc la zone verte.

                            Cordialement
                            0
                            1. Comme ça ?

                              Option Explicit

                              Const celcible = "D3"

                              Sub recentrage_zoom()
                              Dim derlig As Long, dercol As Long, plage As Range
                              Dim premlig As Long, premcol As Long, nbli As Long, nbco As Long
                              ' si pas assez grand comme taille, aaugmenter les nb de lignes et de colonnes
                              Set plage = Range(celcible).Resize(1000, 100)
                              ' MsgBox plage.Address
                              derlig = plage.Find("*", , , , xlByRows, xlPrevious).Row
                              premlig = plage.Find("*", , , , xlByRows, xlNext).Row
                              dercol = plage.Find("*", , , , xlByColumns, xlPrevious).Column
                              premcol = plage.Find("*", , , , xlByColumns, xlNext).Column
                              Set plage = Range(Cells(premlig, premcol), Cells(derlig, dercol))
                              nbli = plage.Rows.Count
                              nbco = plage.Columns.Count
                              plage.Cut Destination:=Range(celcible)
                              derlig = Range(celcible).Row + nbli - 1
                              dercol = Range(celcible).Column + nbco - 1
                              premlig = Cells.Find("*", , , , xlByRows, xlNext).Row
                              premcol = Cells.Find("*", , , , xlByColumns, xlNext).Column
                              Set plage = Range(Cells(premlig, premcol), Cells(derlig, dercol))
                              plage.Select
                              ActiveWindow.zoom = True
                              Range(celcible).Select
                              End Sub

                              Cdlmnt
                              0
                              1. Re,

                                Merci encore CCM81.

                                Je viens de commander un livre sur la programmation en VBA, pour essayer de comprendre, mais ce n'est pas pour cela que j'y arriverais.

                                Je vais pendre une soirée de détente grâce CCM81.

                                Bonne soirée à tous.

                                Cordialement
                                0
                                1. De rien

                                  En y réfléchissant encore un peu, une fin de code plus simple

                                  plage.Cut Destination:=Range(celcible)
                                  derlig = Range(celcible).Row + nbli - 1
                                  dercol = Range(celcible).Column + nbco - 1
                                  Set plage = Range(Cells(1, 1), Cells(derlig, dercol))
                                  plage.Select
                                  ActiveWindow.zoom = True
                                  Range(celcible).Select
                                  End Sub

                                  Bonne soirée

                                  Cdlmnt
                                  0
                                  • 1
                                  • 2