Transfer entre Classeur Excel

Résolu
Bonjour,
Je voudrais creer un code Vba pour importer les données d'un tableau excel vers un autre tableau. Le tableau reception comporte 65 colonnes, le tableau d'importation 33 et +-28000 lignes. Chacune des colonnes correspond à une autre sur le tableau reception mais absolument pas dans le meme ordre. Si je pouvais obtenir un code pour le transfer de quelques colonnes vers d'autres colonnes bien déterminée, je peux probablement terminé le reste et fignoler personellement. J'ai essayé en enrégistrant une macro et en copiant soigneusement la première ligne et en répartissant les 33 colonnes, mais j'obtient déja un tres long code sans aucune boucle et avec un tas de ligne redondante qui ne servent probablement à rien.

D'avance, je vous remercie de votre attention.

Daniel

Configuration: Windows / Firefox 95.0

13 réponses

Résumé de la discussion

Le problème porte sur l'importation de données entre deux tableaux Excel comportant des colonnes dans des ordres différents et environ 28 000 lignes. La solution proposée repose sur un code VBA qui lit une table de correspondance et transfère les colonnes sources vers les colonnes cibles correspondantes, selon un mapping dynamique. Elle crée des tableaux tin et tout pour stocker les noms des colonnes et leurs destinations, puis boucle sur les lignes à importer jusqu'à vide. En cas de changement de fichier source ou de colonne, la macro peut être ajustée via la feuille de correspondance sans réécrire tout le code.

Bobot (l’IA à votre service)
  1. Encore merci pour ton temps et ta patience.
    Je cloture le sujet. Bonne journée à tous

    ah oui, la numérotation est dans la présentation du site CCM et pas sous excel.
    tanpis. Merci bien.
    0
    1. Contributeur
      Sous Excel, en a, dans la ligne du menu, le numéro de la ligne de code dans laquelle on est positionné (en édition ou en exécution pas à pas.
      0
  2. j'ai essaye avec a2 ou b2, j'obtient le meme resultat du moment que ".offset(1)" est derrière.
    un autre bete question, comment tu fait pour avoir une numérotation de ligne devant ton code sous excelvba?
    0
  3. Bonjour,

    J'ai trouvé une solution de dépannage. En ajoutant 10 enrégistrements doublon du dernier, je me retrouve avec les lignes de 2 à 20 à importer. A la reception j'ai toujours de 3 à 6 déja rempli. Il ajoute donc les importation jusqu'a la ligne 20. Je n'ai plus qu'a effacer les doublons après la ligne 15 qui contient mon dernier enrégistrement.
    C'est une solution boiteuse en dépannage. Si il y a moyen de corriger le code pour qu il copie tous les enrégistrement, ce serait mieux.

    Et ajouter si possible des explications dans le codes, je ne comprends pas très bien comment tu arrives avec tous les champs copié. Je pense comprendre comment tu relève les correspondances, mais après c'est un peu de la natation.

    en attendant bonne journée à tous.

    Daniel
    0
    1. Contributeur
      Pour commencer à copier sur la bonne ligne dans la destination, essaie, en ligne 12,
      Set cdest = fdest.[B2].End(xlDown)

      Il devrait, ainsi, commencer sur la première ligne vide en colonne B.
      0
    2. @yg_beCela ne change rien du tout.
      Les colonnes A B seront toujours remplies jusqu'a la fin du tableau.
      ici, la macro stoppe le transfer une fois que le tableau de reception contien autant de ligne que le tableau d'importation. Hors le transfer devrait se terminer quand tout les enrégistrement on été copié.
      0
    3. Contributeur
      @yg_beplutôt
      Set cdest = fdest.[B2].End(xlDown).Offset(1)

      ce qui devrait te permettre de supprimer ce que tu as ajouté après la ligne 22 (ldest = ldest +1).
      1
    4. @yg_beok, avec .offset(1) a l'arrière, cela fonctionne. L'importation commence après la derniere ligne déja inscrite.

      mais s'arrete toujours au nombre de ligne du tableau d'import.
      0
    5. Contributeur
      @nounours4erreur en ligne 24, qui devrait être:
      Do While fsrc.Cells(lsrc, 1) <> ""
      1
  4. dernier test, je place de 3 à12 entrée dans mon tableau de reception, la macro n'importe rien.
    Si j'en ai de 3 à9, alors la macro importe de 2 à 3 et réecri sur la ligne 9 et ajoute 10

    En tout cas, déjà merçi pour le code reçu.

    Daniel
    Je viens d'ajouter "ldest = ldest +1" aprés la ligne 22 et maintenant, l'importation commence après ma dernière ligne, donc ne réecrit plus sur mes lignes d'origines....
    mais s'arrete toujours à 10?
    j'ai essayé avec le pas à pas mais je ne trouve pas pour l'instant.

    Bonne soirée, à demain.
    0
    1. pour etre exact, ton code commence à copier sur ma 2eme lignes de tableau. Il laisse donc la première ligne intacte et Ecrase les cellules copiée dans les lignes suivantes existantes. Et il n'importe que les huit première ligne sur 10.
      Il m'importe les cellules ABC dans le tableau de reception en BCD et AC,AD,AE,AF se retrouvent en R,S,T,U

      Bonne soirée

      Je viens de relever que si tu avais importer à l'envers, cela correspondrait. en effet les cellules bcd doivent aller en abc et le meme pour rstu qui doivent aller en ac,.... et comme le tableau d'importation ne va que jusqu'a AG donc il ne trouve pas les autre cellule.... Je regarde si je sait corriger cela moi meme...

      Ok, j'ai remplacé B3 par E3 en ligne 9 et "tout(ncor) = ccor.Offset(, 3)" par"tout(ncor) = ccor.Offset(, -3)" et il me copie toutes la lignes à la bonne place.

      Il reste juste le problème qu'il ne copie que les ligne jusqu'a 10.. J'explique
      Il y a 9 lignes dans le fichier d'importation (de 2 à 10)
      A la réception, j'ai mes lignes de (3 à 5) déja remplie, Il copie les lignes 2 a 7 sur les lignes 5 a 10.
      Si je n'ai que 3 et 4 de déja remplie, alors il copie les lignes 2 à 8 sur les lignes 4 à 10.

      Donc il m'efface en partie la dernière ligne et arrete de recopier quand il y a le meme nombre de ligne.
      0
      1. Contributeur
        j'ai en effet confondu les colonnes de réception et d'importation.
        tu aurais pu, aussi, inverser tin et tout en lignes 18 et 19.
        0
      2. @yg_beBonjour et merçi pour ton aide.

        As tu une idée pourquoi mes copie s'arrete au meme nombre de ligne que le tableau D'importation?
        0
    2. Bonsoir,
      je viens de tester: avec dix lignes a importer et 3 lignes déja dans le fichier reception.
      J'ai quelques cellules qui sont copiée sur la ligne, et qui écrasent les anciennes cellules et 6 nouvelles lignes. Les cellules ne sont pas à la bonne place mais dans l'ordre d'importation les lignes ne sont pas copiée complétement..La dernière ligne n'est pas importée.
      Normalement, on ne doit pas réécrire sur les lignes déjà existante.
      La ligne (2) importée doit se placer dans une nouvelle ligne créée (4?) du tableau. Sur cette ligne , la cellule A (2) doit aller en AS(4),B2 en A4,C2 en B4,D2 en C4, E2 en AT4,F2 en AV4... ect, puis avec la ligne 3 en position 5, A3 en AS5....
      Et si possible, s'il y a moyen d'intercaler les explications dans le code.
      Maintenant, si tu veux créer les nouvelles lignes en début de tableau et repousser les anciennes vers le bas, pas de problèmes. Mais les anciennes lignes doivent rester tel quel.
      Merçi
      0
      1. Contributeur
        Je propose ceci:
        Option Explicit
        Sub importt()
        Dim fsrc As Worksheet, fdest As Worksheet, csrc As Range, cdest As Range, fcor As Worksheet, ccor As Range
        Dim tin() As String, tout() As String, ncor As Integer, lsrc As Long, ldest As Long, i As Integer, scru As Boolean
        
        Set fsrc = Workbooks("AImporter.xlsx").Sheets("NUMISCollector")
        Set fdest = ThisWorkbook.Sheets("BaseVide")
        Set fcor = ThisWorkbook.Sheets("corespondance")
        Set ccor = fcor.[B3]
        Set csrc = fsrc.[A2]
        Set cdest = fdest.[A2].End(xlDown)
        scru = Application.ScreenUpdating
        Application.ScreenUpdating = False
        Do While ccor <> ""
            ncor = ncor + 1
            ReDim Preserve tin(ncor)
            ReDim Preserve tout(ncor)
            tin(ncor) = ccor
            tout(ncor) = ccor.Offset(, 3)
            Set ccor = ccor.Offset(1)
        Loop
        ldest = cdest.Row
        lsrc = csrc.Row
        Do While fsrc.Cells(ldest, 1) <> ""
            For i = 1 To ncor
                fdest.Cells(ldest, tout(i)) = fsrc.Cells(lsrc, tin(i))
            Next i
            lsrc = lsrc + 1
            ldest = ldest + 1
            DoEvents
        Loop
        Application.ScreenUpdating = scru
        End Sub

        Comme tu n'as pas répondu à mes questions, j'ai fais des suppositions.
        Notamment que le fichier à importer était déjà ouvert.
        L'import prend un certain temps, teste peut-être d'abord avec peu de lignes à importer.
        1
        1. Il n'y a aucune photo à copier. Les photos apparaissent dans le tableau final ave une macro que j'ai faite en fonction d'un nom se trouvant dans la ligne.(J'ai un dossier photo dans le meme répertoire) Chaque ligne importée corespond à une nouvelle ligne de mon tableau. Simplement, les colonnes ne sont pas aux mêmes emplacements ni dans le meme ordre.
          Il faut d'après moi chercher la dernière ligne de mon tableau, creer une nouvelle ligne, et entrer une ligne importée.En réafectant les 33 cellules dans l'ordre du tableau de destination. Avec une boucle qui répétera le processus autant de fois qu'il n'y a de ligne dans le tableau importé. L'ordre des cellules est dans le deuxième message et aussi sur une feuille jointe avec les tableau sur Drive.

          Merçi d'avance a ceux qui vont se creuser la tête. Un début de solution avec la boucle et quelques cellules serait bien, je peux me décarasser après pour finir le code. C'est comme cela que j'ai fait le reste du travail. Je n'avais jamais fait de vba il y a deux mois.

          bonne Nuit
          0
          1. Contributeur
            tu écris "L'ordre des cellules est dans le deuxième message et aussi sur une feuille jointe avec les tableau sur Drive."
            je n'ai pas encore vu les fichiers.
            il faudra avoir une liste avec toutes les colonnes sources et, pour chacune, la colonne destination associée.
            0
        2. https://accounts.google.com/ServiceLogin?service=wise&passive=1209600&continue=https://drive.google.com/drive/folders/1bAL-yQmAQ4RasZkD8UeMiRvsCTA5pu6E&followup=https://drive.google.com/drive/folders/1bAL-yQmAQ4RasZkD8UeMiRvsCTA5pu6E

          Voilà tableau a importer et celui en destination. Le destination est presque vide et sans les dossiers photos ni les tableaux référence. Mais cela doit suffire. Maintenant, je travaille depuis deux mois sur ce projet.si quelqu'un collectionne les monnaies, je peux lui donner une version complète et fonctionnelle. Je précise que les données a importer sont extraites d'un programme acheter avec ma collection. Il ne me convenait tout simplement pas tout a fait. Mais les données sont intéressantes.
          0
          1. Contributeur
            les fichiers ne sont pas publics.
            0
        3. Désolé, mon message n'est pas passé la première fois a cause d'un anti pub. Les deux tableau sont dans des classeurs différents. Je dois copier tout le tableau d'importation sauf les titres. et les 28000 lignes. Le dossier d'origine comprend déjà beaucoup d'article et beaucoup de photos. Mais si necessaire, je peux les mettre sur Drive et donner un lien de téléchargement. Les titres et numéro de colonnes sont dans le deuxième messages. J'avais enclenché enrégistrement de macro quand j'ai copiè les cellules de la première ligne une à une mais je me suis retrouvé avec trois ou quatre page de codes sans meme une boucle pour la deuxième ligne.
          ah oui, et chaque ligne importée doit ouvrir une nouvelle ligne dans le tableau de destination. (J'aurai donc +-28000 nouvelle entrée avec 1000 a 2000 à importé tous les ans. ) Il s'agit d'une collection de monnaie avec les catalogues de photos de toutes les pièces existante mémes celle qui ne sont pas dans ma collection.
          0
          1. Contributeur
            un tableau, c'est une onglet (ou une feuille)?
            il faut copier tout le tableau source (en commençant par la ligne 2) à la fin du tableau de destination?
            comment déterminer la fin du tableau source, afin de s'arreter de copier? une ou plusieurs colonnes sont-elles toujours remplies?
            comment déterminer la fin du tableau de destination, pour savoir où commencer à copier? une ou plusieurs colonnes sont-elles toujours remplies?

            oui, ce serait utile de partager un exemple des deux fichiers, même avec peu de données.

            dans quel fichier serait la macro? le fichier source, destination, ou un troisième?
            comment déterminer les noms complets des fichiers dans lesquels ne se trouve pas la macro?

            AJOUT: comment obtenir la liste avec les correspondances entre les colonnes sources et destinations? est-ce écrit dans le fichier? vas-tu créer cette liste?

            je n'ai aucune idée de comment copier des photos, on verra.
            0
        4. Contributeur
          bonjour,
          pourquoi ne pas partager ton fichier?
          où se trouvent ces tableaux? dans des onglets différents?
          tu mentionnes les colonnes, mais tu ne nous dit rien des lignes: à quelle ligne copier dans le tableau de destination?
          difficile de te proposer un exemple sans information.

          si tu dois copier des colonnes complètes, as-tu essayé d'enregistrer une macro pendant que tu copiais des colonnes?
          0
          1. Contributeur
            un exemple:
            dim fsrc as worksheet, fdest as worksheet
            set fsrc = ...
            set fdest = ...
            fdest.cells(123,"bx") = fsrc.cells(456,"ab")
            Cela copie AB456 de la feuille source vers BX123 de la feuille destination.
            0
          2. Contributeur
            @yg_beas-tu compris le code en #3, qui copie AB456 de la feuille source vers BX123 de la feuille destination?

            cela devrait t'aider à comprendre:
                For i = 1 To ncor
                    fdest.Cells(ldest, tout(i)) = fsrc.Cells(lsrc, tin(i))
                Next i
            0
        5. Tableau réception .....................Tableau à importer
          AS,,,,45Clef ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Clef ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, A
          A ,,,,,,1Pays (CH1),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Choix1
          B ,,,,,,2Année (Ch2),,,,,,,,,,,,,,,,,,,,,,,,,,,,Choix2
          C,,,,,,,3Intitulé (Ch3),,,,,,,,,,,,,,,,,,,,,,,,,,,Choix3
          AT,,,46 ? (Ch4)2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Choix4
          AV,,,48PxABeau (Val5),,,,,,,,,,,,,,,,,,Valeur5
          AW,,,49PxTbeau (Val6),,,,,,,,,,,,,,,,,,Valeur6
          AX,,, 50PXFDC (Val7),,,,,,,,,,,,,,,,,,,, Valeur7
          AY,,, 51 ? (Val8) ,,,,,,,,,,,,,,,,,,,,,,,,,,, Valeur8
          AZ,,, 52 ? (Qté9) ,,,,,,,,,,,,,,,,,,,,,,,,,,, Qté9
          BA,,, 53QuaPos ABeau (Qté10) ,,,,,,,,,,,,,,,,,,,,,,,,,,, Qté10
          BB,,, 54QuaPos TBeau (Qté11),,,,,,,,,,,,,,,,,,,,,,,,,,, Qté11
          BC,,, 55QuaPos FDC (Qté12),,,,,,,,,,,,,,,,,,,,,,,,,,, Qté12
          BD,,, 56 ? (Date13)22,,,,,,,,,,,,,,,,,,,,,,,,,,, Date13
          BE,,, 57 ? (Date14)33,,,,,,,,,,,,,,,,,,,,,,,,,,, Date14
          BF,,, 58 ? (Date15)44,,,,,,,,,,,,,,,,,,,,,,,,,,, Date15
          BG,,, 59 ? (Date16)52 ,,,,,,,,,,,,,,,,,,,,,,,,,,, Date16
          AC,,, 29Métal (D17) ,,,,,,,,,,,,,,,,,,,,,,,,,,, DescripCourte17
          AD,,, 30Dia. (D18) ,,,,,,,,,,,,,,,,,,,,,,,,,,, DescripCourte18
          AE,,, 31Poids (D19),,,,,,,,,,,,,,,,,,,,,,,,,,, DescripCourte19
          AF,,, 32Année de frappe (D20),,,,,,,,,,,,,,,,,,,,,,,,,,, DescripCourte20
          AG,,, 33Description (D21),,,,,,,,,,,,,,,,,,,,,,,,,,, DescripLongue21
          AH,,, 34Tirage (descrip22),,,,,,,,,,,,,,,,,,,,,,,,,,, DescripLongue22
          BH,,, 60 ? (Descrip23),,,,,,,,,,,,,,,,,,,,,,,,,,, DescripLongue23
          BI,,, 61? (Descrip24),,,,,,,,,,,,,,,,,,,,,,,,,,, DescripLongue24
          BJ,,, 62 ? (U25),,,,,,,,,,,,,,,,,,,,,,,,,,, Utilisateur25
          BK,,, 63Rangement (U26)2 ,,,,,,,,,,,,,,,,,,,,,,,,,,, Utilisateur26
          BL,,, 64UtQualité (u27) ,,,,,,,,,,,,,,,,,,,,,,,,,,, Utilisateur27
          AI,,, 35Graveur ,,,,,,,,,,,,,,,,,,,,,,,,,,, Utilisateur28
          AJ,,, 36Observation (Obs29),,,,,,,,,,,,,,,,,,,,,,,,,,, Obs29
          BM,,, 65Obs30 ,,,,,,,,,,,,,,,,,,,,,,,,,,, Obs30
          AL,,, 38CatalImage (obs31),,,,,,,,,,,,,,,,,,,,,,,,,,, Obs31
          AM,,, 39RefImag (obs32) ,,,,,,,,,,,,,,,,,,,,,,,,,,, Obs32 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, AG

          J'ai essayé de joindre un PDF mais cela ne marche pas.
          un copier coller d'excell ne garde pas la tabulation et si je la remet en ordre, elle disparait à l'affichage.
          0

          Discussions similaires

          etiquette pour dos classeur

          2 réponses