Pb d'exécution

Résolu
Cheribay -  
 Cheribay -
Bonjour,

J'ai tenté de reproduire le code en l'adaptant mais une erreur se lève et je ne comprends pas pourquoi. Mes deux fichiers sont ouverts lors du lancement. la ligne qui pose problème est celle en gras
Je suis un BB en ce qui concerne le vba !

Sub ImporterColonnes()

Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
Dim Colonnes(), Col As Integer, Resultat As Variant

 Set WbkColle = ThisWorkbook
Colonnes = Array("header1", "header2")
    
  Workbooks("requetesql_CA.xlsx").Activate
  Set WbkCopy = ActiveWorkbook
   With WbkCopy.Sheets("MACHIN") '
        For Col = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column 
        Resultat = Application.Match(.Cells(1, Col), Colonnes, 0) 
       
 If Not IsError(Resultat) Then
       <bold> .Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Offset(0, 1)</bold>

         End If
      Next Col
    End With
   
WbkCopy.Close

Set WbkCopy = Nothing
Set WbkColle = Nothing
End Sub


10 réponses

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    Bonjour,

    Si tu veux trouver la bonne colonne de copy il te faut qualifier toutes tes références, car ce n'était pas "Les 2 dernières parenthèses fermantes sont en trop ! " :
            .Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column + 1)
    

    2
    1. Utilisateur anonyme
       
      Bonjour gbinforme,
      C'est exact ; je pensais que l'erreur de syntaxe venait juste de parenthèses
      non appariées ; merci pour ta correction ! Cordialement.  😊

      @Cheribay : désolé de t'avoir donné une mauvaise information ;
      ton problème sera sûrement réglé avec la présente solution
      de gbinforme. Cordialement.  😊
      0
      1. Cheribay > Utilisateur anonyme
         
        Merci Albkan, c'est déjà sympa de ta part de m'aider !
        0
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    Bonjour,

    Sans doute comme ceci :
    .Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column) + 1)
    
    1
  3. Cheribay
     
    Bonjour Gbinforme et merci pour ton retour.
    J'ai intégré la modification mais une erreur se lève avec une fin de compilation attendue (fin d'instruction) sur l'avant dernière parenthèse

    .Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column) + 1)

    Je n'ai pas réussi à trouver...
    0
    1. Utilisateur anonyme
       
       
      Bonjour à Cheribay et gbinforme,

      Les 2 dernières parenthèses fermantes sont en trop ! À supprimer, d'où :

      .Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column + 1
      

      Cordialement.  😊
       
      0
  4. Cheribay
     
    Merci beaucoup pour ton aide Albkan !

    J'ai désormais une erreur l'indice n’appartient pas à la sélection :-(
    pourtant ça me paraît pas mal.

    Sub ImporterColonnes()
    Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
    Dim Colonnes(), Col As Integer, Resultat As Variant
    Set WbkColle = ThisWorkbook
    Colonnes = Array("header1", "header2")
    Workbooks("requetesql_CA.xlsx").Activate
    Set WbkCopy = ActiveWorkbook
    With WbkCopy.Sheets("MACHIN") '
    For Col = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
    Resultat = Application.Match(.Cells(1, Col), Colonnes, 0)
    If Not IsError(Resultat) Then
    .Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column + 1
    End If
    Next Col
    End With
    WbkCopy.Close
    Set WbkCopy = Nothing
    Set WbkColle = Nothing
    End Sub
    0
    1. Utilisateur anonyme
       
       
      Tu as très bien fait d'indiquer le message d'erreur qui est affiché, mais sur
      quelle ligne ça se produit ? Quand tu cliques sur le bouton « Débogage »
      et que ça va sur la fenêtre du module VBA en cause, quelle est la ligne
      en jaune ? Attention : ça arrive souvent, mais ce n'est pas forcé !

      Vérifie bien le nom des 2 feuilles utilisées : "MACHIN" et "BDD_2016" ;
      vérifie aussi le nom des colonnes "header1" et "header2".

      Si ton problème est réglé, merci d'aller en haut de page pour cliquer
      sur « Marquer comme résolu ». À te lire.  😊
       
      0
    2. Utilisateur anonyme
       
       
      Ajout : vérifie bien aussi cette instruction :

      Workbooks("requetesql_CA.xlsx").Activate
      

      Le nom "requetesql_CA" est-il exact ? S'il faut une extension, je pense
      que ce serait plutôt ".xlsm" mais je crois plutôt qu'il n'en faut pas :

      Workbooks("requetesql_CA").Activate
      

      Je rappelle que ton erreur d'indice apparaît lorsque l'élément
      d'un tableau ou celui d'une collection n'existe pas.

      À te lire.  😊
       
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Utilisateur anonyme
         
        Bonjour à tous,

        Juste au passage :
        WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column + 1

        ne renvoie pas un Objet Range (nécessaire pour coller), mais un Integer (le numéro de la première colonne vide)...
        0
      2. Utilisateur anonyme > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour pijaku,
        C'est exact ; je pensais que l'erreur de syntaxe venait juste de parenthèses
        non appariées ; merci pour ta correction ! Cordialement.  😊
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Cheribay
     
    Bonjour à tous et merci beaucoup pour vos retours instructifs.

    Sur la base de ce que vous m'avez fait comme retour, j'ai donc légèrement rectifié la macro.
    La bonne nouvelle c'est qu'elle fonctionne !!
    La mauvaise c'est qu'elle ne donne pas ce que je veux... En fait il ne se passe rien :-)

    J'ai contrôlé les noms de fichier. Je pense que je ne suis pas encore au niveau de ce type de macro et vous remercie pour votre aide.

    Sub ImporterColonnes()
    
    Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
    Dim Colonnes(), Col As Integer, Resultat As Variant
    
    Set WbkColle = Workbooks("FICHIER_QUI_RECEPTIONNE.xlsx")
    Colonnes = Array("header1", "header2")
    
    Set WbkCopy = Workbooks("FICHIER_SOURCE.xlsx")
    With WbkCopy.Sheets("ONGLET_SOURCE")
       For Col = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
          Resultat = Application.Match(.Cells(1, Col), Colonnes, 0)
          If Not IsError(Resultat) Then
             .Columns(Col).Copy WbkColle.Sheets("ONGLET_DESTINATION").Cells(1, WbkColle.Sheets("ONGLET_DESTINATION").Cells(1, Cells.Columns.Count).End(xlToLeft).Column + 1)
          End If
       Next Col
    End With
    Set WbkCopy = Nothing
    Set WbkColle = Nothing
    End Sub
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,

      sous l'éditeur VBA :
      1- affiche la fenêtre d'exécution (Ctrl+G)
      2- lance ce test :
      Sub Test()
      
      Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
      Dim Colonnes(), Col As Integer, Resultat As Variant, Cpt As Long
      
      Set WbkColle = Workbooks("FICHIER_QUI_RECEPTIONNE.xlsx")
      Colonnes = Array("header1", "header2")
      
      Set WbkCopy = Workbooks("FICHIER_SOURCE.xlsx")
      With WbkCopy.Sheets("ONGLET_SOURCE")
         For Col = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
            Resultat = Application.Match(.Cells(1, Col), Colonnes, 0)
            If Not IsError(Resultat) Then Cpt = Cpt + 1: Debug.Print Resultat
         Next Col
      End With
      If Cpt = 0 Then Debug.Print "aucune colonne ne s'appelle header"
      Set WbkCopy = Nothing
      Set WbkColle = Nothing
      End Sub


      3- à la fin regarde dans la fenêtre d'exécution et dis nous ce qui y est inscrit
      0
      1. Cheribay > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Pijaku,

        J'ai exécuté le test et voici le résultat

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18

        J'ai bien 18 colonnes dont je dois recopier le contenu.
        0
  7. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Comment résultat peut il être égal à 18 alors que l'array colonne n'a que 2 valeurs?
    0
  8. Cheribay
     
    Désolé mais pour ne pas encombrer la macro, je n'avait mis que 2 array colonne afin d'éviter la répétition des 18...
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      y a t'il autre chose? Fais nous un copié-collé de tout ton code...
      Et, au passage, verifie que tu n'as as inversé les noms de tes classeurs et/ou de tes feuilles...

      --
      0
  9. Cheribay
     
    Non Pijaku, il n'y a rien d'autre.
    Je suis d'autant plus désolé que je viens de tirer ma barre et il se trouve que les copies sont bien réalisées mais en ajout d'entête à la suite des 18 array.
    Hors ce que je souhaitais c'est qu'en fonction de l'entête de mon fichier cible, les données présentes dans la colonne ayant la même entête dans mon fichier source soient recopiées. Les entêtes n'ayant pas de correspondance voient leur colonne laissée vide.

    Sub ImporterColonnes()
    
    Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
    Dim Colonnes(), Col As Integer, Resultat As Variant
    
     Set WbkColle = Workbooks("FICHIER_QUI_RECEPTIONNE.xlsx")
    Colonnes = Array("NOM", "PRENOM", "ADRESSE", "CP", "VILLE", "PAYS", "TEL", "FAX", "MAIL", "IM", "POR", "IG", "PREL", "DE", "RE", "TH", "clot", "Pai")
    
    Set WbkCopy = Workbooks("FICHIER_SOURCE.xlsx")
       With WbkCopy.Sheets("ONGLET_SOURCE")
     For Col = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
     Resultat = Application.Match(.Cells(1, Col), Colonnes, 0)
    If Not IsError(Resultat) Then
              .Columns(Col).Copy WbkColle.Sheets("ONGLET_CIBLE").Cells(1, WbkColle.Sheets("ONGLET_CIBLE").Cells(1, Cells.Columns.Count).End(xlToLeft).Column + 1)
            End If
          Next Col
        End With
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Donc, rien à voir avec la demande initiale. Si quelqu'un veut bien t'aider ce soir, pas de souci, sinon faudra que t'attendes demain que j'ai accès à excel

      --
      0
  10. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Des précisions :
    Tu as un fichier A contenant les 18 entêtes de colonnes de ton array (nom, prénom, etc). Ce fichier A contient des données que tu veux coller dans un fichier B qui contient également des données. ton fichier B contient, quant à lui X colonnes dont toutes celles du fichier A plus d'autres qui doivent donc rester vide.
    C'est bien cela?

    0
  11. Cheribay
     
    Bonjour et tout d'abord désolé pour le manque d'explication dans ma demande initiale qui vous a fait perdre du temps.

    Pijaku, c'est exactement cela.
    Pour plus de précision, le fichier A est le FICHIER SOURCE de ma requête et le fichier B mon FICHIER CIBLE qui contient les même colonne que la A plus d'autres colonnes.
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      ET tu lances la macro depuis un troisième classeur?
      0
    2. Cheribay > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Non depuis mon classeur cible.
      Je n'ai que les fichiers source et cible d'ouvert.
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Cheribay
       
      Pourquoi ton classeur cible, s'il contient des macros, s'appelle : "FICHIER_QUI_RECEPTIONNE.xlsx"
      xlsm non?

      Soit précis!

      ...stp...
      0
    4. Cheribay > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Et bien mes macros sont dans mon classeur de macros personnel pas dans mes fichiers.
      Je n'ai pas de macro sur les fichiers ouverts
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Cheribay
       
      Ok.
      Alors voici :

      Lis bien les commentaires (lignes en vert)
      Option Explicit
      
      Sub ImporterColonnes()
      Dim WbkCopy As Workbook, WbkColle As Workbook, RngAcopier As Range
      Dim Colonnes(), Col As Integer, DL As Long, LigneOuColler As Long, ColOuColler As Integer
      
          'J'ai un fichier A qui contient des données
          Set WbkCopy = Workbooks("FICHIER_SOURCE.xlsx")
          'J'ai un fichier B Qui doit recevoir ces données
          Set WbkColle = Workbooks("FICHIER_QUI_RECEPTIONNE.xlsx")
          'il doit les recevoir, après les données déjà présentes, donc dans sa première ligne vide
          With WbkColle.Sheets("ONGLET_DESTINATION")
              LigneOuColler = .UsedRange.Rows.Count + 1
          End With
          'le fichier B contient toutes les colonnes du fichier A, mais pas aux mêmes endroits
          'on liste donc les colonnes à copier
          Colonnes = Array("NOM", "PRENOM", "ADRESSE", "CP", "VILLE", "PAYS", "TEL", "FAX", "MAIL", "IM", "POR", "IG", "PREL", "DE", "RE", "TH", "clot", "Pai")
          
          'dans le classeur A, feuil source
          With WbkCopy.Sheets("ONGLET_SOURCE")
             'on détermine la dernière ligne des plages à copier
             DL = .UsedRange.Rows.Count
             'on boucle sur toutes les colonnes
             For Col = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
                'on choisit la plage à copier (pas de colonne entière)
                Set RngAcopier = .Range(.Cells(2, Col), .Cells(DL, Col))
                'on repère la colonne portant la même entête dans le fichier B
                ColOuColler = WbkColle.Sheets("ONGLET_DESTINATION").Rows(1).Cells.Find(.Cells(1, Col), lookat:=xlWhole).Column
                'copié/collé
                RngAcopier.Copy WbkColle.Sheets("ONGLET_DESTINATION").Cells(LigneOuColler, ColOuColler)
             Next Col
          End With
      'libération de la mémoire
      Set RngAcopier = Nothing
      Set WbkCopy = Nothing
      Set WbkColle = Nothing
      End Sub
      
      0