Annonce

Réduire
Aucune annonce.

Aide Excel

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Aide Excel

    Bonjour à tous et bonne année.
    J'espère que vous pouriez m'aider sur un truc excel.
    je dois importer des données autaumatiquement d'un tableau excel dans un autre sur une autre feille avec un autre tri.

    1er tableau (Nom, Prénom, Trigramme, Adresse, Tel) sur feuille 1
    Le 2eme sera (Trigramme, Nom, Prénom, Adresse, Tel) sur feuille 2

    les données du 2eme tableau seront prisent automatiquement du 1er, et si je rajoute une ligne ou je supprime une ligne dans le 1er j'aurai la mise à jour dans le 2eme.
    Merci pour votre aide.

  • #2
    Consolidation

    Bonjour et bonne année.

    Je crois qu'il s'agit d'un problème dit de consolidation et non d'importation.

    Voici un lien où on présente un exemple:

    Consolidation

    La page n'est pas récente mais c'est une première piste.

    Bonne continuation.

    Commentaire


    • #3
      Je ne pense pas que ça soit un problème de consolidation car dans ce cas, le deuxième tableau sera un réceptacle synthétique du premier avec une action d'agrégation sur les valeurs du premier tableau (addition, multiplication....etc.).

      Personnellement, je pense que c'est une problématique de connexion entre les deux tableaux (il faut connecter le second au premier) avec un définition d'un nouveau tri sur un autre champ (trigramme dans ce cas). Dans le tableau connecté on peut changer l'ordre des champs du premier sans altérer la connexion.

      Donc, il faut recopier le premier tableau vide (juste les en têtes) et le coller dans une autre feuille ou classeur. Puis données, connexions et définir le champ de connexion....

      Commentaire


      • #4
        A première vue, je ne vois pas la nécessité d'avoir 2 feuilles de calcul sous Excel avec les mêmes infos, en base de données on l'appelle la redondance d'information, mais bon, si tu insistes, il faut utiliser le "rapport de tableau croisé dynamique".

        Si ce n'est que pour le tri, à ta place j'utiliserai une seule feuille de calcul et, j'aurai sélectionné toute la colonne à trier, en cliquant sur "Tri croissant" ou "Tri décroissant", une fenêtre s'ouvrira t'invitant à 2 choix :

        Que voulez-vous faire ?
        - Etendre la sélection
        - Continuer avec la sélection en cours

        Par défaut l'option "Etendre la sélection" est sélectionnée, clique sur "Tri", si une autre fenêtre s'ouvrira, clique sur "Ok".

        Ainsi, tu pourras faire le tri à ta guise, suivant les noms, les prénoms, les numéros de téléphone... Enfin, toute l'info que tu jugeras nécessaire.
        Il y a des gens si intelligents que lorsqu'ils font les imbéciles, ils réussissent mieux que quiconque. - Maurice Donnay

        Commentaire


        • #5
          hello ines

          je rejoins l'avis de Robocop sur la nécessité d'avoir deux tableaux Excel contenants les mêmes informations, à chaque modification du tableau initial, t'as qu'à le copier et réarranger les colonne à l'ordre que tu veux;

          sinon tu peux utiliser la recherche Verticale, c'est un travail supplémentaire mais je crois que c'est le genre de truc que tu cherche
          Dernière modification par EtoileFilante, 02 janvier 2012, 19h40.
          Tout ce qui brille n'est pas or

          Commentaire


          • #6
            Avec Visual Basic

            Voici une solution un peut brutale mais qui fonctionne avec Office 2007.

            Il faut savoir écrire des macros en Visual Basic.

            Pour éviter tout problème il faut commencer par se rendre dans l'aide de office et taper Macro dans Recherche puis voir comment on active les macros dans un classeur. Par défaut les macros sont désactivées pour raisons de sécurité. C'est très bien indiqué dans l'aide.

            On suppose que la colonne A contient Nom, la colonne B Prénom ... ainsi de suite jusqu'à la colonne E pour Tél.

            Dans cet exemple on copie toutes les colonnes A1:An, B1:Bn ... , de la feuille 1 vers la feuille 2 (l'ordre étant modifié comme demandé) à l'aide d'une macro (fonction ou sub en Visual Basic) appelée Consolidation. Pour écrire une macro dans la feuille 2 il faut cliquer avec le bouton droit sur l'onglet Feuil2 en bas de Excel et choisir Visualiser le code.

            Lancement de l'éditeur Visual Basic

            Voici un lien vers une capture de l'éditeur de code Visual Basic:

            Capture de l'éditeur Visual Basic

            Le code de la macro est le suivant:

            Fonction Consolidation de la feuille 2.

            Sub Consolidation()

            ' Nettoyage de la Feuille de consolidation (feuille 2), tout est supprimé
            Feuil2.Rows("1:" & Feuil2.Rows.Count).ClearContents

            ' copie de la colonne Trigramme
            Feuil1.Range("c1:c" & Feuil1.Cells(Feuil1.Rows.Count, 1).End(xlUp).Row).Copy _
            Destination:=Feuil2.Range("a1")

            'copie de la colonne Nom
            Feuil1.Range("a1:a" & Feuil1.Cells(Feuil1.Rows.Count, 1).End(xlUp).Row).Copy _
            Destination:=Feuil2.Range("b1")

            'copie de la colonne Prénom
            Feuil1.Range("b1:b" & Feuil1.Cells(Feuil1.Rows.Count, 1).End(xlUp).Row).Copy _
            Destination:=Feuil2.Range("c1")

            'copie de la colonne Adresse
            Feuil1.Range("d1:d" & Feuil1.Cells(Feuil1.Rows.Count, 1).End(xlUp).Row).Copy _
            Destination:=Feuil2.Range("d1")

            'copie de la colonne Tél.
            Feuil1.Range("e1:e" & Feuil1.Cells(Feuil1.Rows.Count, 1).End(xlUp).Row).Copy _
            Destination:=Feuil2.Range("e1")

            End Sub
            Ce code effectue donc une copie un peu sauvage des colonnes de la feuille 1 vers la feuille 2 en changeant l'ordre (Trigramme en premier).

            Il faut à présent déclencher ce code à chaque fois que la feuille 1 est modifiée. Pour cela il faut éditer une macro spéciale qui s'applique à Feuill1 appelée Change. Pour l'éditer il suffit de double-cliquer sur Feuill1 dans l'Explorateur de Projet de l'éditeur Visual Basic. Seulement au lieu d'éditer du code (Général) il faut éditer le code relatif à Worksheet (feuille) et précisément sélectionner la fonction Change.

            Voici une capture:

            Capture de l'édition du code de la feuille 1

            Le code de la seconde macro est très simple puisqu'il se limite à l'appel de la première macro (qui appartient à feuille 2).
            Private Sub Worksheet_Change(ByVal Target As Range)

            Call Feuil2.Consolidation

            End Sub
            J'espère que cela convient car il est aussi surement possible d"accéder à des objets de type tableau depuis Visual Basic mais je ne sais pas. Il faudrait plonger dans l'API de Excel ce que je n'ai jamais fait.

            Bonne continuation.
            Dernière modification par abdelbaki, 03 janvier 2012, 03h24.

            Commentaire


            • #7
              Bonjour,
              Merci pour vos réponses.
              il ne sagit pas d'une consolidation,

              j'ai fait le copier coller avec un collage spécial avec création de liaison,
              mais le problème il fallait sélectionner toute les cases du tableau même les vises et prévoir une sélection de lignes vides au cas de rajout de ligne, et sur la deuxième feuilles j'ai des"0" partout
              où il y'a une case vide. et ça devient pas très lisible et pas pratique. en plus il faut retrier.

              abdelbaki, je n'arrive pas à ouvrire tes liens et je ne sais pas où tapper la focntion.

              Commentaire


              • #8
                Voici des liens pour apprendre développer

                Envoyé par ines.najma
                abdelbaki, je n'arrive pas à ouvrire tes liens et je ne sais pas où tapper la focntion.
                C'est bizarre, je les ai testés et ils marchent. J'utilise Firefox.

                Voici un autre lien, c'est un exemple de macro qui copie un tableau. C'est en anglais.

                Copier un tableau avec Visual Basic

                Voici un lien avec une documentation relative à Visual Basic, en français:

                VBA pour Excel

                Bonne continuation.

                Commentaire


                • #9
                  Moins compliqué qu'il n'y parait

                  En fait la programmation sous Excel n'est pas aussi compliquée qu'elle n'y parait. Comme indiqué dans la documentation VBA pour excel, dans Excel tout est affaire de collection (ou liste) et de plage de cellules (Range of Cells).

                  Tout classeur est composé d'une collection de feuilles, elles-mêmes composées d'une collection d'objets de type ListObject, cette collection s'apelle ListObjects (avec un s). Les objets sont référencés dans cette collection par leur indice (numérique) ou leur nom.

                  Code:
                   Premier objet de la première feuille du classeur courant:
                  	ActiveWorkbook.Worksheets(1).ListObjects (1)
                  
                   Objet nommé Tableau1 de la feuille nommée Feuil1 du classeur courant:
                  	ActiveWorkbook.Worksheets("Feuil1").ListObjects ("Tableau1")
                  Dans Excel tout objet dans une feuille de calcul est quasiment équivalent à une plage de cellules (objet de type Range).
                  C'est le cas des tableaux (objet de type ListObject), des lignes de tableau (objet de type Rows), les colonnes de tableau (objet de de type Columns). Tous ces objet contiennent un membre de Type Range.

                  Par exemple pour accéder à la quatrième colonne du tableau nommé "Tableau1" de la feuille nommée "Feuil1" du classeur courant, on utilise le code:

                  Code:
                  ActiveWorkbook.Worksheets("Feuil1").ListObjects ("Tableau1").Range.Columns(4)
                  Les objects de type Range, Rows ou Columns possèdent une méthode très utile qui s'appelle Copy. Cette méthode prend pour argument un objet de type Range désignant la destination de la copie.

                  Par exemple pour copier la deuxième colonne de l'objet nommé "Tableau1" vers la troisième colonne de l'objet nommé "Tableau2", on utilise le code:

                  Code:
                  ListObjects ("Tableau1").Range.Columns(2).Copy ListObjects("Tableau2").Range.Columns(3)
                  
                  Ici on ne spécifie ni classeur, ni feuille. On travail donc
                  avec la feuille courante de l'éditeur de code Visual Basic.
                  Ce code parait simple mais en réalité il n'est pas sûr car on ne sait pas si la destination est assez grande pour accueillir les données de l'origine. C'est juste pour illustrer.

                  Supposons donc que l'on ait un premier tableau représenté par la variable Tableau1, ayant pour colonnes "Nom", "Prénom", "Trigramme" ...
                  et un second tableau représenté par la variable Tableau2 et devant accueillir une copie de Tableau1 avec la colonne "Trigramme" en premier. Alors le code sera pour simplifier le suivant:

                  Code:
                   	Tableau1.Range.Columns(3).Copy (Tableau2.Range.Columns(1))
                  	Tableau1.Range.Columns(1).Copy (Tableau2.Range.Columns(2))
                  	Tableau1.Range.Columns(2).Copy (Tableau2.Range.Columns(3))
                  	Tableau1.Range.Columns(4).Copy (Tableau2.Range.Columns(4))
                  	Tableau1.Range.Columns(5).Copy (Tableau2.Range.Columns(5))
                  Pour résoudre le problème on peut faire comme indiqué dans mon post précédent: on commence par traquer les modifications apportées à la feuille Feuil1 (celle contenant le premier tableau).

                  Ceci est fait dans la procédure Worksheet_Change. Cette procédure prend pour argument un objet de type Range. C'est en fait la plage où les modifications ont eu lieu.

                  Le tableau d'origine s'apelle "Tableau1" et est contenu dans la feuille Feuil1.
                  Le tableau destination s'apelle "CopieTableau" et est contenu dans la feuille Feuil2.

                  Quand les modifications interviennent, on doit commencer par effectuer un test
                  pour voir si la plage des modifications a une intersection avec "Tableau1".
                  Si "Tableau1" n'est pas concerné, on a rien à faire. Sinon on copie "Tableau1" vers "CopieTableau".

                  Pour le test, Excel fournit une fonction Intersect qui prend pour arguments des plages
                  et retourne une plage correspondant à leur intersection. Une plage vide correspond
                  à l'objet spécial Nothing (rien du tout)

                  Le code de test sera une fonction appelée TestIntersection. Elle prend pour argument
                  une plage et renvoie True si cette plage rencontre la plage de "Tableau1" et False sinon.

                  Ce code appartient au code général de Feuil1.

                  Code:
                   Function TestIntersection(ByVal Target As Range)
                      'Déclaration de la variable devant contenir l'objet Tableau1
                      Dim oLo As ListObject
                      'Instanciation de l'objet
                      Set oLo = ListObjects("Tableau1")
                      
                          If IsNull(oLo) Then
                              MsgBox "Désolé, l'objet Tableau1 n'existe pas"
                              TestIntersection = False
                              Exit Function
                          Else
                              Dim oRo As Range
                              Set oRo = oLo.Range
                              If Intersect(oRo, Target) Is Nothing Then
                                  TestIntersection = False
                                  Exit Function
                             Else
                                  TestIntersection = True
                                  Exit Function
                             End If
                          End If
                  End Function
                  Ensuite dans la fonction gérant les évènements de modification,Worksheet_Change, on
                  se contente de vérifier si "Tableau1" est concerné par les modifications avec le test.
                  Auquel-cas on appelle une procédure de la feuille 2 appelée CopierTableau et chargée d'effectuer la copie
                  Cette dernière fonction reçoit l'objet "Tableau1" comme argument. Voici le code Worksheet_Change:

                  Code:
                   Private Sub Worksheet_Change(ByVal Target As Range)
                      
                      If TestIntersection(Target) Then
                          Call Feuil2.CopierTableau(ListObjects("Tableau1"))
                      End If
                  
                  End Sub
                  Le code de la fonction CopierTableau appartenant à Feuil2 est lui assez commenté pour ne pas trop s'attarder.
                  Je l'ai testé et ça fonctionne semble-t-il. Même le style des tableaux est copié (couleurs des cellules).

                  Code:
                   Sub CopierTableau(ByVal Tableau1 As ListObject)
                      
                      Dim oLo As ListObject
                      Dim oRo As Range
                      
                      If IsNull(Tableau1) Then
                          MsgBox "Tableau1 n'existe pas. La copie n'aura pas lieu."
                          Exit Sub
                      End If
                      
                      'On désactive l'arrêt en cas d'erreur
                      On Error Resume Next
                          'On récupère l'objet nommé "CopieTableau" dans la variable oLo
                          Set oLo = Feuil2.ListObjects("CopieTableau")
                          'On construit un objet plage à partir de la plage du tableau d'origine
                          Set oRo = Range(Tableau1.Range.Address)
                              
                          'Si l'objet "CopieTableau" existe, il faut le supprimer.
                          'On le recopie plus loin colonne par colonne.
                          If Not oLo Is Nothing Then
                           oLo.Range.Clear
                          End If
                          
                          'On reconstruit "CopieTableau" à partir de la plage d'origine.
                          'Cette méthode affecte la plage de l'objet (oRo).
                          'Le style du tableau original est reproduit automatiquement.
                          'L'objet est finalement nommé "CopieTableau"
                          ListObjects.Add(xlSrcRange, oRo, , xlGuess).Name = "CopieTableau"
                          'On récupère à nouveau l'objet nommé "CopieTableau" dans la variable oLo
                          Set oLo = Feuil2.ListObjects("CopieTableau")
                              
                          'On désactive la gestion des évènement pour éviter d'entrer dans une boucle infinie.
                          'On modifie pourtant Feuil2 et non Feuil1 mais on entre dans une boucle infinie sinon.
                          Application.EnableEvents = False
                                  
                          'Ici on fait la copie des tableaux colonne par colonne
                          'dans l'ordre voulu.
                              Tableau1.Range.Columns(3).Copy (oLo.Range.Columns(1))
                              Tableau1.Range.Columns(1).Copy (oLo.Range.Columns(2))
                              Tableau1.Range.Columns(2).Copy (oLo.Range.Columns(3))
                              Tableau1.Range.Columns(4).Copy (oLo.Range.Columns(4))
                              Tableau1.Range.Columns(5).Copy (oLo.Range.Columns(5))
                          
                      'On rétablie la gestion normale des erreurs
                      On Error GoTo 0
                          
                      'On rétablie la gestion des évènements.
                      Application.EnableEvents = True
                      'On sauvegarde le classeur après les changements.
                      ActiveWorkbook.Save
                   
                  End Sub
                  Bonne continuation.
                  Dernière modification par abdelbaki, 05 janvier 2012, 18h58.

                  Commentaire

                  Chargement...
                  X