Transfer entre Classeur Excel

Résolu
nounours4 Messages postés 47 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  2. nounours4 Messages postés 47 Statut Membre
     
    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
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        as-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
  4. nounours4 Messages postés 47 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. nounours4 Messages postés 47 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      les fichiers ne sont pas publics.
      0
  7. nounours4 Messages postés 47 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  8. nounours4 Messages postés 47 Statut Membre
     
    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
  9. nounours4 Messages postés 47 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
      1. nounours4 Messages postés 47 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour 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
  10. nounours4 Messages postés 47 Statut Membre
     
    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
  11. nounours4 Messages postés 47 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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. nounours4 Messages postés 47 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Cela 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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      plutô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. nounours4 Messages postés 47 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      ok, 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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > nounours4 Messages postés 47 Statut Membre
       
      erreur en ligne 24, qui devrait être:
      Do While fsrc.Cells(lsrc, 1) <> ""
      1
  12. nounours4 Messages postés 47 Statut Membre
     
    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
  13. nounours4 Messages postés 47 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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