Probleme de colonne de destination copie dans une boucle

D'abord bonjour à tous .

Je suis débutant en VBA et je fait appel à votre aide car je sèche sur une macro .

Le but de cette macro etait le suivant

1 ouvrir l'ensemble des fichiers d'un repertoire et copier les données de la colonne B de la 1ere feuille .

2 Copier ces données en colonnes qui se suivent dans un fichier compilation .

Or c'est sur ce second point que je cale . En effet, il me colle toutes les colonnes sur la meme colonne de destination alors que je souhaiterai qu'elle se decale à chaque boucle .

Voici mon code pour que vous puissiez y voir plus clair .

Sub copier_colonnes()

''' déclarations des variables globales '''

Dim fichierCompilation As Workbook 'fichier sur lequel on va compiler les données

Dim workbookCourant As Workbook 'workbook sur lequel on travaille

Dim repertoireCourant As String 'répertoire des fichiers à parcourir

Dim nomFichierCourant As String 'fichier courant

Dim numeroColonne As Integer 'numéro de la colone ou copier les éléments

Application.ScreenUpdating = False

Set fichierCompilation = ThisWorkbook

''' libellés du fichier de comppliation '''

Range("A1").Select

ActiveCell.Value = "Nom UFA"

Range("A4").Select

ActiveCell.Value = "Heures Présentielles"

Range("A5").Select

ActiveCell.Value = "Tutorat de projet"

Range("A6").Select

ActiveCell.Value = "Suivi en entreprise"

Range("A7").Select

ActiveCell.Value = "Responsabilité Pédagogique"

Range("A8").Select

ActiveCell.Value = "Innovation Pédagogique"

Range("A9").Select

ActiveCell.Value = "Forfait fonctionnement"

Range("A10").Select

ActiveCell.Value = "Mobilité colective internationale"

Range("A11").Select

ActiveCell.Value = "Droits d'inscription"

Range("A12").Select

ActiveCell.Value = "Contribution au salaire des APA"

Range("A14").Select

ActiveCell.Value = "Total UFA"

Range("A15").Select

ActiveCell.Value = "Coût UFA"

Range("A16").Select

ActiveCell.Value = "Valorisation etablissement"

repertoireCourant = "C:\budget 2015\UFA 1\" 'affecte la valeur "C:\budget 2015\UFA 1\" dans la variable "repertoireCourant"

nomFichierCourant = Dir(repertoireCourant & "*.xls*") 'affecte la valeur dans la variable "nomFichierCourant"

''' on fait la popote '''

Do While Len(nomFichierCourant) > 0

Set workbookCourant = Workbooks.Open(repertoireCourant & nomFichierCourant) 'on redéfinit le workbook courant

Sheets("Compil UFA").Select 'sélectionne la feuille "Compil UFA" dans ton workbook courant

'désactiver le filtre automatique de la feuille si activé

If ActiveSheet.AutoFilterMode = True Then

ActiveSheet.AutoFilterMode = False

End If

'sélectionner la plage b4 à b16

Range("B1:B16").Select

'copier la sélection

Selection.Copy

'changer de fichier (on retourne sur le fichier de compilation)

Windows("fichierCompilation.xlsm").Activate

'sélectionner la feuille nommée "Feuil1"

Sheets("Feuil1").Select

'sélectionner la plage

Range("a1").End(xlToRight).Offset(0, 2).Select 'on se déplace sur la dernire cellule à droite de A4 qui est non vide puis on se déplace encore d'un cran à droite et on sélectionne

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Application.CutCopyMode = False

workbookCourant.Close False 'Fermer le fichier temporairement ouvert

nomFichierCourant = Dir() 'on sélectionne le nom du fichier suivant dans le répertoire

Loop

Application.ScreenUpdating = True

End Sub

Je pense que je m'y prends mal car j'aimerai que la range de destination soit [B1;B16] et se decale à chaque boucle . ( les colonnes copiées ont toutes les memes dimensions ).

Dites moi si je n'ai pas été assez clair .

Dans tous les cas merci :

Bonjour et bienvenu(e)

Essayes ceci

Le pourquoi c'est que tu te décaler de 2 colonnes et cela te faisait retomber toujours sur la même

Sub copier_colonnes()

''' déclarations des variables globales '''

Dim fichierCompilation As Workbook  'fichier sur lequel on va compiler les données

Dim workbookCourant As Workbook  'workbook sur lequel on travaille
Dim repertoireCourant As String  'répertoire des fichiers à parcourir
Dim nomFichierCourant As String  'fichier courant

Dim numeroColonne As Integer  'numéro de la colone ou copier les éléments

  Application.ScreenUpdating = False

  Set fichierCompilation = ThisWorkbook

  ''' libellés du fichier de comppliation '''
  Range("A1") = "Nom UFA"
  Range("A4") = "Heures Présentielles"
  Range("A5") = "Tutorat de projet"
  Range("A6") = "Suivi en entreprise"
  Range("A7") = "Responsabilité Pédagogique"
  Range("A8") = "Innovation Pédagogique"
  Range("A9") = "Forfait fonctionnement"
  Range("A10") = "Mobilité colective internationale"
  Range("A11") = "Droits d'inscription"
  Range("A12") = "Contribution au salaire des APA"
  Range("A14") = "Total UFA"
  Range("A15") = "Coût UFA"
  Range("A16") = "Valorisation etablissement"

  repertoireCourant = "C:\budget 2015\UFA 1\"  'affecte la valeur "C:\budget 2015\UFA 1\" dans la variable "repertoireCourant"

  nomFichierCourant = Dir(repertoireCourant & "*.xls*")  'affecte la valeur dans la variable "nomFichierCourant"

  ''' on fait la popote '''
  Do While Len(nomFichierCourant) > 0
    Set workbookCourant = Workbooks.Open(repertoireCourant & nomFichierCourant)  'on redéfinit le workbook courant

    Sheets("Compil UFA").Select  'sélectionne la feuille "Compil UFA" dans ton workbook courant

    'désactiver le filtre automatique de la feuille si activé
    If ActiveSheet.AutoFilterMode = True Then
      ActiveSheet.AutoFilterMode = False
    End If

    ' On copie la plage b4 à b16
    Range("B1:B16").Copy ThisWorkbook.Sheets("Feuil1").Range("A1").End(xlToRight).Offset(0, 1)

    workbookCourant.Close False  'Fermer le fichier temporairement ouvert
    nomFichierCourant = Dir()  'on sélectionne le nom du fichier suivant dans le répertoire
  Loop

  Application.ScreenUpdating = True

End Sub

Bonjour Nyechou, bonjour le forum,

Ton code et correctement écrit et devrait fonctionner mais sans fichier exemple difficile de te dire où se trouve l'erreur.

Toutefois, deux choses m'interpellent :

• tu déclares la variable : Dim fichierCompilation As Workbook et tu la définies avec : Set fichierCompilation = ThisWorkbook

Ensuite, plus loin dans le code, tu rappelles le fichier avec : Windows("fichierCompilation.xlsm").Activate.

Soit ta variable ne sert à rien et il faut supprimer déclaration et définition. Soit tu écris : fichierCompilation.Activate

• Quand tu définis les libellés de ce fichier tu ne spécifies pas l'onglet comme tu le fais plus loin pour coller la colonne (Sheets("Feuil1")). Le problème ne serait-il pas ici ?

En règle générale, il faut éviter les Select inutile que ne font que ralentir l'exécution du code. Ci-dessous le code réécrit en tenant compte des remarques :

Sub copier_colonnes()
''' déclarations des variables globales '''
Dim fichierCompilation As Workbook 'fichier sur lequel on va compiler les données
Dim workbookCourant As Workbook 'workbook sur lequel on travaille
Dim repertoireCourant As String 'répertoire des fichiers à parcourir
Dim nomFichierCourant As String 'fichier courant
Dim O As Object 'déclare la variable O (Onglet)

Application.ScreenUpdating = False
Set fichierCompilation = ThisWorkbook
Set O = fichierCompilation.Sheets("Feuil1")
''' libellés du fichier de compliation '''
O.Range("A1").Value = "Nom UFA"
O.Range("A4").Value = "Heures Présentielles"
O.Range("A5").Value = "Tutorat de projet"
O.Range("A6").Value = "Suivi en entreprise"
O.Range("A7").Value = "Responsabilité Pédagogique"
O.Range("A8").Value = "Innovation Pédagogique"
O.Range("A9").Value = "Forfait fonctionnement"
O.Range("A10").Value = "Mobilité colective internationale"
O.Range("A11").Value = "Droits d'inscription"
O.Range("A12").Value = "Contribution au salaire des APA"
O.Range("A14").Value = "Total UFA"
O.Range("A15").Value = "Coût UFA"
O.Range("A16").Value = "Valorisation etablissement"
repertoireCourant = "C:\budget 2015\UFA 1\" 'affecte la valeur "C:\budget 2015\UFA 1\" dans la variable "repertoireCourant"
nomFichierCourant = Dir(repertoireCourant & "*.xls*") 'affecte la valeur dans la variable "nomFichierCourant"
''' on fait la popote '''
Do While Len(nomFichierCourant) > 0
    Set workbookCourant = Workbooks.Open(repertoireCourant & nomFichierCourant) 'on redéfinit le workbook courant
    With workbookCourant.Sheets("Compil UFA") 'prend en comte la feuille "Compil UFA" dans ton workbook courant
        'désactiver le filtre automatique de la feuille si activé
        If .AutoFilterMode = True Then
            .AutoFilterMode = False
        End If
        'sélectionner la plage b4 à b16
        .Range("B1:B16").Copy
        'changer de fichier (on retourne sur le fichier de compilation)
    End With
    O.Cells(1, Application.Columns.Count).End(xlToLeft).Offset(0, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
    Application.CutCopyMode = False
    workbookCourant.Close False 'Fermer le fichier temporairement ouvert
    nomFichierCourant = Dir() 'on sélectionne le nom du fichier suivant dans le répertoire
Loop
Application.ScreenUpdating = True
End Sub

[Édition]

Bonjour Banzai, nos messages se sont croisés... Bien vu ! je navet pas vu ce point de détail qui résout le problème... Du coup j'ai modifié le code

Merci de la réponse rapide . En fait si je comprends bien le "copier /coller" peut se faire en une seule ligne (en se passant des étapes "select" et "activate")

Par contre il m'affiche erreur d'execution '1004' erreur definie par l'application ou par l'objet, sur la ligne 48 justement .

Bonjour

Nyechou a écrit :

Par contre il m'affiche erreur d'execution '1004' erreur definie par l'application ou par l'objet, sur la ligne 48 justement .

Cela vient du fait que dans ta page tu n'as que la colonne A de remplie et la fonction End(XlToRight) n'est pas la plus adaptée dans ce cas

Remplaces la ligne incriminée par celle-ci

   Range("B1:B16").Copy ThisWorkbook.Sheets("Feuil1").Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1)

Avec celle ci il ne faut pas de données sur la ligne 1 après la dernière colonne

la macro tourne sans probleme, ( la derniere vresion postée par ThauThème ) mais elle continue de tout me copier sur la meme colonne, la B ou la C selon si je met OFFSET (0, 1) ou OFFSET (0, 2) . Seuls les montants du dernier fichier ouvert apparaissent .

Merci pour votre aide en tout cas c'est super sympa .


En fin de compte ca marche !

J'ai trouvé c'etait lié au fait que la cellule B1 de mes fichiers sources était vide . Du coup il repartait en A1 et recopiait en B1:B16 .

Merci à tous pour votre aide .

je passe le sujet en resolu

Rechercher des sujets similaires à "probleme colonne destination copie boucle"