Pb d'exécution

Résolu/Fermé
Cheribay - Modifié par pijaku le 24/08/2016 à 07:32
 Cheribay - 25 août 2016 à 10:02
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 lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
24 août 2016 à 09:25
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
24 août 2016 à 15:23
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
24 août 2016 à 15:46
Merci Albkan, c'est déjà sympa de ta part de m'aider !
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 716
23 août 2016 à 12:01
Bonjour,

Sans doute comme ceci :
.Columns(Col).Copy WbkColle.Sheets("BDD_2016").Cells(1, Cells.Columns.Count).End(xlToLeft).Column) + 1)
1
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
23 août 2016 à 19:00
 
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
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
23 août 2016 à 20:11
 
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
24 août 2016 à 00:10
 
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754 > Utilisateur anonyme
24 août 2016 à 07:40
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
Modifié par albkan le 24/08/2016 à 15:23
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
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
24 août 2016 à 16:17
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
24 août 2016 à 16:33
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
24 août 2016 à 18:07
Comment résultat peut il être égal à 18 alors que l'array colonne n'a que 2 valeurs?
0
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
24 août 2016 à 18:35
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
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
24 août 2016 à 19:02
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
25 août 2016 à 07:56
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
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
25 août 2016 à 08:50
ET tu lances la macro depuis un troisième classeur?
0
Cheribay > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
25 août 2016 à 08:56
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754 > Cheribay
25 août 2016 à 08:57
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
25 août 2016 à 09:11
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754 > Cheribay
25 août 2016 à 09:16
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