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

gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
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
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
Cheribay > Utilisateur anonyme
 
Merci Albkan, c'est déjà sympa de ta part de m'aider !
0
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
Bonjour,

Sans doute comme ceci :
.Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column) + 1)
1
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
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
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
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > 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
Utilisateur anonyme > pijaku Messages postés 12263 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
Cheribay > pijaku Messages postés 12263 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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Comment résultat peut il être égal à 18 alors que l'array colonne n'a que 2 valeurs?
0
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
ET tu lances la macro depuis un troisième classeur?
0
Cheribay > pijaku Messages postés 12263 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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > Cheribay
 
Pourquoi ton classeur cible, s'il contient des macros, s'appelle : "FICHIER_QUI_RECEPTIONNE.xlsx"
xlsm non?

Soit précis!

...stp...
0
Cheribay > pijaku Messages postés 12263 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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > 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