IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Regroupement de fichiers Excel


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Regroupement de fichiers Excel
    Bonjour à tous,

    Je m'explique,

    J'ai besoin de créer une macro qui regrouperait plusieurs fichiers avec divers onglets.
    J'ai 4 onglets de plusieurs fichiers que je dois regrouper dans un même fichier. A savoir que l'onglet "1" de la feuille regroupée doit aller sur l'onglet "1" de la feuille de regroupement et ainsi de suite.

    Il y a plusieurs problèmes sur ma macro qui font que tout ne se passe pas très bien.

    Dans un premier temps, la macro s'execute mais me regroupe que quelques fichiers... Je ne comprends pas pourquoi cela se passe. Elle trouve donc bien les fichiers mais en saute...

    Le second problème est que la macro ne me reprend pas toutes les informations des différents onglets. Elle saute des lignes...

    Pouvez vous m'aider, à savoir que j'ai essayé de m'inspirer de ce que j'ai trouvé sur le net...

    Merci d'avance...

    Voici la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
      Dim chemin As String    ' classeur regroupé
        Dim rep As String       ' répertoire à traiter
        Dim fic As String       ' classeur regroupé
        Dim ligne As Long       ' ligne écriture
        Dim nbc As Integer      ' nombre de classeurs
        Dim nbf As Integer      ' nombre de feuilles
        Dim nbl As Integer      ' nombre de lignes
        Dim c As Integer        ' nombre de colonnes
        Dim l As Long           ' ligne lecture
        Dim Wf As Worksheet     ' feuille regroupement
        Dim Wl As Worksheet     ' feuille regroupée
        rep = ThisWorkbook.Path & "\"
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
     
        Set Wf = ThisWorkbook.ActiveSheet         ' variable feuille groupe
        Wf.Cells.ClearContents
     
        ligne = 1
     
        fic = Dir(rep & "*.xls")    ' recherche fichiers
        While fic <> ""
            If fic <> ThisWorkbook.Name Then
                chemin = rep & fic       ' chemin fichiers
                Workbooks.Open chemin, 0  ' ouverture
     
     
                i = 2
     
                   Set Wl = Workbooks(fic).Sheets(i)  ' choix de la feuille
                   nbl = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Rows.Count
                   c = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Columns.Count
                   Sheets("Codes articles concernés").Select
                   If ligne > 2 Then l = 2 Else l = 1  ' une seule fois le titre
                   Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Codes articles concernés").Cells(ligne, 1)
                   ligne = ligne + nbl - l + 1
                   nbf = nbf + 1
     
     
     
               i = 3
                   ligne = 1
                   Set Wl = Workbooks(fic).Sheets(i)  ' choix de la feuille
                   nbl = Workbooks("global process de fabrication").Sheets("Nomenclatures AC").UsedRange.Rows.Count
                   c = Workbooks("global process de fabrication").Sheets("Nomenclatures AC").UsedRange.Columns.Count
                   Sheets("Nomenclatures AC").Select
                   If ligne > 2 Then l = 2 Else l = 1  ' une seule fois le titre
                   ligne = ligne + nbl - l + 1
                   Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Nomenclatures AC").Cells(ligne, 1)
                   nbf = nbf + 1
     
               i = 4
                   ligne = 1
                   Set Wl = Workbooks(fic).Sheets(i)  ' choix de la feuille
                   nbl = Workbooks("global process de fabrication").Sheets("Processus de fabrication").UsedRange.Rows.Count
                   c = Workbooks("global process de fabrication").Sheets("Processus de fabrication").UsedRange.Columns.Count
                   Sheets("Processus de fabrication").Select
                   If ligne > 2 Then l = 2 Else l = 1  ' une seule fois le titre
                   ligne = ligne + nbl - l + 1
                   Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Processus de fabrication").Cells(ligne, 1)
                   nbf = nbf + 1
     
                i = 5
                   ligne = 1
                   Set Wl = Workbooks(fic).Sheets(i)  ' choix de la feuille
                   nbl = Workbooks("global process de fabrication").Sheets("Parc TF").UsedRange.Rows.Count
                   c = Workbooks("global process de fabrication").Sheets("Parc TF").UsedRange.Columns.Count
                   Sheets("Processus de fabrication").Select
                   If ligne > 2 Then l = 2 Else l = 1  ' une seule fois le titre
                   ligne = ligne + nbl - l + 1
                   Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Parc TF").Cells(ligne, 1)
                   nbf = nbf + 1
     
     
     
     
                    ActiveWorkbook.Close SaveChanges:=False   ' Fermeture du classeur
     
            End If
            fic = Dir
            nbc = nbc + 1
        Wend
    fin:
        MsgBox nbc & " classeurs regroupés avec " & nbf & " feuilles et " & ligne & " lignes"
     End Sub
    Sub regroupe()

  2. #2
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    tout d'abord mettre les balises code (#) et indente ton texte cela donne cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    Sub regroupe()
        Dim chemin As String ' classeur regroupé
        Dim rep As String ' répertoire à traiter
        Dim fic As String ' classeur regroupé
        Dim ligne As Long ' ligne écriture
        Dim nbc As Integer ' nombre de classeurs
        Dim nbf As Integer ' nombre de feuilles
        Dim nbl As Integer ' nombre de lignes
        Dim c As Integer ' nombre de colonnes
        Dim l As Long ' ligne lecture
        Dim Wf As Worksheet ' feuille regroupement
        Dim Wl As Worksheet ' feuille regroupée
        rep = ThisWorkbook.Path & "\"
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
     
        Set Wf = ThisWorkbook.ActiveSheet ' variable feuille groupe
        Wf.Cells.ClearContents
     
        ligne = 1
     
        fic = Dir(rep & "*.xls") ' recherche fichiers
        While fic <> ""
            If fic <> ThisWorkbook.Name Then
                chemin = rep & fic ' chemin fichiers
                Workbooks.Open chemin, 0 ' ouverture
     
                i = 2
     
                Set Wl = Workbooks(fic).Sheets(i) ' choix de la feuille
                nbl = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Rows.Count
                c = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Columns.Count
                Sheets("Codes articles concernés").Select
                If ligne > 2 Then l = 2 Else l = 1 ' une seule fois le titre
                Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Codes articles concernés").Cells(ligne, 1)
                ligne = ligne + nbl - l + 1
                nbf = nbf + 1
     
                i = 3
                ligne = 1
                Set Wl = Workbooks(fic).Sheets(i) ' choix de la feuille
                nbl = Workbooks("global process de fabrication").Sheets("Nomenclatures AC").UsedRange.Rows.Count
                c = Workbooks("global process de fabrication").Sheets("Nomenclatures AC").UsedRange.Columns.Count
                Sheets("Nomenclatures AC").Select
                If ligne > 2 Then l = 2 Else l = 1 ' une seule fois le titre
                ligne = ligne + nbl - l + 1
                Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Nomenclatures AC").Cells(ligne, 1)
                nbf = nbf + 1
     
                i = 4
                ligne = 1
                Set Wl = Workbooks(fic).Sheets(i) ' choix de la feuille
                nbl = Workbooks("global process de fabrication").Sheets("Processus de fabrication").UsedRange.Rows.Count
                c = Workbooks("global process de fabrication").Sheets("Processus de fabrication").UsedRange.Columns.Count
                Sheets("Processus de fabrication").Select
                If ligne > 2 Then l = 2 Else l = 1 ' une seule fois le titre
                ligne = ligne + nbl - l + 1
                Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Processus de fabrication").Cells(ligne, 1)
                nbf = nbf + 1
     
                i = 5
                ligne = 1
                Set Wl = Workbooks(fic).Sheets(i) ' choix de la feuille
                nbl = Workbooks("global process de fabrication").Sheets("Parc TF").UsedRange.Rows.Count
                c = Workbooks("global process de fabrication").Sheets("Parc TF").UsedRange.Columns.Count
                Sheets("Processus de fabrication").Select
     
                If ligne > 2 Then l = 2 Else l = 1 ' une seule fois le titre
                ligne = ligne + nbl - l + 1
                Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Parc TF").Cells(ligne, 1)
                nbf = nbf + 1
     
                ActiveWorkbook.Close SaveChanges:=False ' Fermeture du classeur
     
            End If
            fic = Dir
            nbc = nbc + 1
        Wend
    fin:
        MsgBox nbc & " classeurs regroupés avec " & nbf & " feuilles et " & ligne & " lignes"
    End Sub
    Et du coup il me semble que tu incrémente une variable i et que tu repetes les mêmes action un petit For devrait simplifier ton code

    A+
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour Igloobel,

    Merci de ton aide (j'ai modifié le précédent message avec le "#").

    Je t'avoue que je ne maitrise pas mais que j'essaie de comprendre le langage VBA, j'ai pu en discuter avec un collègue qui m'a déjà aidé mais je suis de nouveau perdu. Enfin, je pense avoir avancé un minimum.

    Oui, je veux bien répéter 4 fois la même procédure mais en copiant les données sur des onglets différents
    Pour le for, je devrai mettre For i = 2 To 5 ?
    Mais après, comment dois je faire pour les destinations de fichiers ?

    Merci d'avance,

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour, bonjour !

    En fait le code ne se trompe pas, il exécute simplement ce qui lui ai demandé !
    Réalisable en moitié moins de lignes, effectivement une boucle du type For … Next pourrait être utile.

    La première feuille copiée est la n°2, quid de la feuille n°1 ?‼ Dixit présentation initiale …

    Faudrait-il encore une présentation claire & exhaustive, avec tenants & aboutissants,
    description de la structure des feuilles de calculs, …

    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour Michel,

    Excusez moi pour ces erreurs de langages. Comme je le disais, je débute vraiment en VBA mais j'essaie de comprendre...pas évident...

    Je donnais un exemple pour la feuille n°1.
    Je ne me sers pas de la feuille 1 qui, en fait, est une synthèse sous forme de tableau.

    Je vais essayer d'être plus clair :

    A la base, j'ai une mutlitude de fournisseur à qui je dois envoyer des fichiers qu'ils remplissent. L'onglet 1 est la synthèse des onglets 2, 3, 4 et 5 sous forme de tableau. Les données dans ces onglets sont copiées dans le tableau de l'onglet 1.
    Le but est de regrouper les fichiers de chaque fournisseurs dans un même document en respectant les onglets définis. Dans le cas présent "Codes articles concernés", "Nomenclatures AC", "Processus de fabrication" et "Parc TF".

    La finalité de ce fichier de regroupement sera l'incrémentation dans une base Access afin de consolider les données.

    Pour la structure des onglets :
    Onglet 1 : synthèse (inutile dans le regroupement)
    Onglet 2 : 14 colonnes.
    Onglet 3 : 12 colonnes
    Onglet 4 : 12 colonnes
    Onglet 5 : 7 colonnes
    A savoir qu'il n'y a pas de nombres de lignes définies et que cela peut varier en fonction du nombres d'articles.
    J'espère avoir été plus clair...

    Merci

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    C'est qui Michel ?‼


    Si dans chaque feuille le total des colonnes correspond au nombre de colonnes à copier,
    en fait s'il s'agit de copier l'intégralité de chaque feuille, suffit d'utiliser la propriété UsedRange.
    Et pas de souci si les onglets définis sont dans le même ordre quel que soit le classeur …

    Mais comme au final il est question d'alimenter une base Access, à quoi bon ce traitement sous Excel ?!
    Autant importer directement les données sous Access …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par Marc-L Voir le message

    Mais comme au final il est question d'alimenter une base Access, à quoi bon ce traitement sous Excel ?!
    Autant importer directement les données sous Access …
    je suis tout a fait d'accord, Quand on peut éviter de manipuler plusieurs outils il faut éviter.

    Donc
    -soit tout dans Access
    -soit tout dans Excel parce que
    La finalité de ce fichier de regroupement sera l'incrémentation dans une base Access afin de consolider les données
    Excel sait consolider des données

    A+
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Salut Igloobel !

    Précision de ma pensée : il est inutile de regrouper sous Excel alors que la finalité est sous Access !

    Pourquoi ? Si par exemple il y a 100 000 lignes à regrouper, en passer par Excel double le travail :
    100 000 lignes regroupées par Excel puis de nouveau ces mêmes 100 000 lignes lues par Access …

    Si je demande à un transporteur de me livrer un colis de Paris à Lille en 48 heures,
    je n'aimerais pas apprendre la livraison effectuée en 96 heures à cause d'un transit par Lyon
    qui plus est facturée au kilométrage ! Et comme c'était un essai, le transporteur perd évidemment le marché …

    Excel peut évidemment piloter l'intégration directe dans Access (mais bof) …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour à vous deux,

    Merci pour vos réponses,

    J'ai bien pensé à regrouper ces fichiers dans Access, mais il n'y a pas de nombre de fichiers définis, cela peut varier en fonction des contraintes fournisseurs... Un fournisseur peut avoir plusieurs documents.
    De plus, il serait difficile, avec la contrainte précédente de nommer chaque fichier sous la même forme.

    Access sait regrouper tous les fichiers d'un dossier, voir de sous dossiers sans exceptions ? Je ne peux pas procéder par tables liées dans la mesure ou il peut y avoir de nouveaux fichiers a tout moment.


    A savoir qu'il m'est impératif d'avoir une consolidation sous Access.

    Je comprends bien votre démarche de vouloir simplifier au maximum mais je ne sais comment faire.

    PS: Désolé Marc-L de t'avoir appelé Michel

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Si dans chaque feuille le total des colonnes correspond au nombre de colonnes à copier,
    en fait s'il s'agit de copier l'intégralité de chaque feuille, suffit d'utiliser la propriété UsedRange.
    Et pas de souci si les onglets définis sont dans le même ordre quel que soit le classeur …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour Marc-L,

    J'ai bien noté qu'il fallait que j'utilise cette proprieté. Cependant, que dois je remplacer ? J'ai utilisé Usedrange pour compter les colonnes.

    Avez-vous des indices pour m'aider ? Des lignes à modifier ?

    Quand je souhaite faire une boucle, en prenant en compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     For i = 2 To 5
     
                   Set Wl = Workbooks(fic).Sheets(i)  ' choix de la feuille
                   nbl = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Rows.Count
                   c = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Columns.Count
                   Sheets("Codes articles concernés").Select
                   If ligne > 2 Then l = 2 Else l = 1  ' une seule fois le titre
                   Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Codes articles concernés").Cells(ligne, 1)
                   ligne = ligne + nbl - l + 1
                   nbf = nbf + 1
     
                   Next
    Comment pourrais je sélectionner chaque fichier à coller comme c'est le cas avec la macro plus longue ?

    De plus, de quoi peut provenir le fait que sur la première copie, seul 4 références sur 6 soit copiées ?
    Sur les onglets suivants, lors de la première copie, seul la ligne 1 se colle. Lors du deuxième regroupement, 3 lignes se collent...
    Je ne cerne pas du tout le problème.

    Merci d'avance,

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    En fait Si c'est comme une question : en attente de réponse ou de confirmation …


    Sinon pour trouver l'erreur de conception - un code ne pouvant se tromper, il exécute juste les ordres … - suivre sa progression
    en mode pas à pas via la touche F8 tout en contrôlant le contenu de la fenêtre des Variables locales
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour Marc-L,

    Effectivement le nombre total de colonnes de chaque feuille correspond au nombre de colonne à copier.
    Clairement, le contenu total de chaque feuille doit être copier excepté la première ligne qui est l'entête de colonne.

    J'ai réalisé le pas à pas avec F8. J'ai modifié ma ligne pour compte les nombre de lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
              i = 2
     
                   Set Wl = Workbooks(fic).Sheets(i)  ' choix de la feuille
                   nbl = Workbooks("global process de fabrication").Sheets("Codes articles concernés").Cells.SpecialCells(xlCellTypeConstants).Count
                   c = Workbooks("global process de fabrication").Sheets("Codes articles concernés").UsedRange.Columns.Count
                   Sheets("Codes articles concernés").Select
                   If ligne > 2 Then l = 2 Else l = 1  ' une seule fois le titre
                   Wl.Cells(l, 1).Resize(nbl, c).Copy Destination:=Workbooks("global process de fabrication").Sheets("Codes articles concernés").Cells(ligne, 1)
                   ligne = ligne + nbl - l + 1
                   nbf = nbf + 1
    J'aimerai compter le nombre de lignes non nulles afin de faire ma selection et ensuite coller à partir de la première ligne vide.

    Merci

  14. #14
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Je ne comprends pas trop ce compteur … Et encore une fois, Access peut importer directement chaque classeur …

    Mais bon, voici un exemple de copie de l'intégralité d'une feuille sans la première ligne (titres des colonnes) d'un classeur
    vers un autre dans le même numéro d'ordre de feuille à la suite de l'existant (sans écraser les données déjà présentes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("Source.xlsx").Worksheets(2).UsedRange.Offset(1).Copy Workbooks("Destination.xlsx").Worksheets(2).Cells(Rows.Count, 1).End(xlUp)(2)
    _____________________________________________________________________________________________________
    Il n'y a pas que les aigles qui atteignent les sommets, les escargots aussi mais ils en bavent !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour Marc-L,

    Sous tes conseils, je vais donc effectuer le regroupement directement dans Access

    Cependant, puis je encore un peu abuser de tes conseils ?

    J'ai trouvé un code sur internet que je dois ajouter dans un module, c'est ok pour cette partie.

    En revanche, l'auteur de la macro informe qu'il faut, pour que la macro fonctionne, définir 4 paramètres :
    Le chemin du dossier qui contient les différents classeurs excel
    La liste des feuilles (dans mon cas, ce serait "Codes articles concernés", "Nomenclatures AC", "Processus de fabrication" et "Parc TF")
    Le nom de la table qui serait dans mon cas "SPEC.mdb"
    ainsi qu'une une valeur booléenne (True / False) qui indique si les feuilles Excel ont des titres en première ligne.


    Ou dois je noter ces informations ? Je pense que c'est sur les lignes qui commence par ByVal mais je dois mal noter ces informations en fin de ligne.. Comment dois je les noter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    ' ---
    ' IMPORTATION DE PLUSIEURS FEUILLES EXCEL,
    ' A PARTIR DE PLUSIEURS CLASSEURS
    ' ---
    Sub ImportExcelMulti( _
      ByVal strChemin As String, _
      ByVal varFeuilles As Variant, _
      ByVal blnNoms As Boolean, _
      ByVal strTable As String _
      )
     
      ' Déclaration des variables
      Dim strClasseur As String
      Dim varFeuille As Variant
     
      ' Est-ce que le dossier existe ?
      strChemin = AddBackslash(strChemin)
      If Dir(strChemin, vbDirectory) = "" Then
        MsgBox "Le dossier ['" & strChemin & "] est introuvable.", vbExclamation
        Exit Sub
      End If
     
      ' Vidage de la table si nécessaire
      On Error GoTo ImportExcelErr
      If MsgBox("Souhaitez-vous vider la table [" & strTable & "] avant l'importation ?", _
        vbQuestion + vbYesNo) = vbYes Then
        CurrentDb.Execute "DELETE * FROM [" & strTable & "];"
      End If
     
      ' Parcourir tous les classeurs du dossier
      strClasseur = Dir(strChemin & "*.xls", vbNormal)
      While strClasseur <> ""
        ' Procédure d'importation
        For Each varFeuille In varFeuilles
          DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, _
            strTable, strChemin & strClasseur, blnNoms, varFeuille & "!"
        Next
     
        ' Classeur suivant
        strClasseur = Dir
      Wend
     
      ' Un p'tit message pour terminer :-)
      MsgBox "Opération terminée !", vbInformation
      Exit Sub
     
    ImportExcelErr:
      MsgBox "Erreur d'importation : " & Err.Description, vbExclamation
      Exit Sub
    End Sub
    Merci encore de m'accorder un peu de temps

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Selon les types de variables, c'est facile pour String (du texte donc) et Boolean (True or False).

    Par contre pour Variant cela peut prendre différentes formes, l'auteur du code a dû indiquer un exemple !
    Cela a l'air d'être via une variable tableau du genre Array("nom feuille1", "nom feuille2")

    Il faut appeler cette procédure depuis le code principal en lui passant les paramètres dans l'ordre:

    ImportExcelMulti "D:\Chemin\", Array("nom feuille1", "nom feuille2"), True, "nom.mdb"
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Je dois donc mettre cela de cette manière ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ImportExcelMulti( _"S:\ITALIE\Etienne Antoine XX\SPEC LOG\IMPORT" , Array("Codes articles concernés", "Nomenclature AC", "Processus de fabrication", "Parc TF"), True, "SPEC.mdb".
      ByVal strChemin As String, _
      ByVal varFeuilles As Variant, _
      ByVal blnNoms As Boolean, _
      ByVal strTable As String _
      )
    Je dois zapper un truc car cela ne fonctionne pas...

  18. #18
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Non ‼ La procédure a été conçue pour être appelée par une autre !

    Donc dans ta procédure, tu insères juste la ligne de mon précédent post …


    Exemple si tu récupères cette procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Affichage(TEXTE$, TITRE$)
        MsgBox TEXTE, , TITRE
    End Sub
    Tu l'appelles ainsi dans une procédure Demo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Demo()
        Affichage "Bonjour l'angoisse !", "Démonstration !"
    End Sub
    Comme quoi :
    _____________________________________________________________________________________________________
    Copier / Coller n'est pas programmer !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  19. #19
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Marc-L, je n'ai jamais préssenti être programmateur tu sais.

    J'essaie juste de trouver les informations et de comprendre surtout ce que je fais. Je suis débutant en VBA, j'ai mis les pieds dedans car j'en ai besoin pour ce regroupement mais je n'avais jamais touché à la programmation avant...
    Je m'inspire de qui a été utilisé par d'autres en essayant d'adapter à mon besoin...

    Ton dernier post est compris. Je comprends la démarche.

    Je vais donc essayer avec tes conseils.

  20. #20
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour Marc-l et Igloobel,

    J'ai réussi à regrouper mes fichiers Excel dans une table en passant directement par Access.

    Je vous remercie de m'avoir guidé vers cette piste.

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Regroupement des fichiers excel selon un critère de nom
    Par nidale dans le forum Excel
    Réponses: 8
    Dernier message: 04/03/2015, 15h53
  2. [XL-2003] Regrouper des fichiers Excel en un seul
    Par piercleo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/11/2010, 14h28
  3. Réponses: 4
    Dernier message: 21/10/2009, 17h00
  4. [XL-2003] Regroupement de fichier Excel
    Par FCL31 dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 22/07/2009, 14h21
  5. regrouper plusieurs fichiers Excel en un seul
    Par jnmab dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/11/2007, 17h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo