Macro mise à jour base de donnée

elandar8

XLDnaute Nouveau
Bonjour,
Je souhaite me faciliter la vie, je vous explique...
Actuellement je met une base de donnée à jour manuellement et c'est parfois assez long.
J'ai une série de fichier excel que je liste dans une feuille par macro et après je fais un copier coller des cellules A3:K...(dernière ligne non vide), puis je passe au fichier suivant que je copie colle juste en dessous et rebelotte avec le suivant.... si je n'avais que 3 ou 4 fichiers ça serait pas grave mais actuellement je suis à 135 fichiers donc ça prend beaucoup de temps et ca ne fait qu'augmenter au fil du temps.
Je pense qu'une macro pourrait me faire ce travaille pour moi seulement c'est un peu trop corsé à écrire pour moi.
Petite chose à savoir en plus c'est que dans ma liste j'ai des fichiers non excel qui ne doivent pas être pris en compte bien sur.

En résumé
J'ai cette liste en A1:A..(dernier non vide)

C:\Users\Invité\Lola.xlsx
C:\Users\Invité\ Marcel.xlsx
C:\Users\Invité\juin.txt
C:\Users\Invité\Tom.xlsx

Je dois copier les cellules (A3:K..(dernière ligne non vide)) de Lola.xlsx, puis à la suite copier les cellules (A3:K..(dernière ligne non vide)) de Marcel.xlsx, puis à la suite copier les cellules (A3:K..(dernière ligne non vide)) de Tom.xlsx
Je suis vraiment largué pour une tel macro.

Merci pour toutes l'aide que vous pourrez m'apporter.
 

camarchepas

XLDnaute Barbatruc
Re : Macro mise à jour base de donnée

Bonjour,

Voici une première proposition .

Copier coller le code dans un module standard.

Sauvegarder le fichier dans le dossier contenant les fichiers à copier

Ce code suppose que la colonne A est toujours différente de vide, si cela n'est pas le cas , mettre la colonne ou cette condition est vraie


Code:
Sub Assemble()
Dim Classeur As String
Dim Chemin As String
Dim LigneMax As Long, Position As Long

Chemin = ThisWorkbook.Path & "\"
Classeur = Dir(Chemin)
Do
 If Classeur <> ThisWorkbook.Name and right(classeur,5) =".xlsx" Then
   Workbooks.Open Filename:=Chemin & Classeur, ReadOnly:=True
   LigneMax = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
   If LigneMax > 3 Then
    Position = ThisWorkbook.Worksheets("Base").Range("A" & Rows.Count).End(xlUp).Row + 1
    ActiveSheet.Range("A3:K" & LigneMax).Copy Destination:=ThisWorkbook.Worksheets("Base").Range("A" & Position)
   End If
 End If
 Classeur = Dir
Loop Until Classeur = ""
End Sub
 

elandar8

XLDnaute Nouveau
Re : Macro mise à jour base de donnée

j'ai un soucis avec le fait que ce code n'utilise pas la liste qui se trouve en A1:A..(dernier non vide) car je classe mes fichiers dans plusieurs dossiers.
De plus j'ai une erreur qui me reviens à chaque fois "L'indice n'appartient pas à la sélection.". J'ai effectivement la copie des lignes du premier .xlsx du dossier dans lequel est enregistré le fichier qui contient la macro, mais il ne passe pas au fichier suivant.

merci pour ce début prometteur
 

camarchepas

XLDnaute Barbatruc
Re : Macro mise à jour base de donnée

Bonsoir ,

OK pour la liste , je prends en compte ,

un autre point est le nom de l'onglet ou feuille contenant les infos à copier.

Et oui , il faut effectivement créer un onglet "Base" dans le fichier qui contient cette macro.

( Oups , je l'ai écrit entre les lignes )

Dès votre retour , je corrige le fichier en conséquence
 

elandar8

XLDnaute Nouveau
Re : Macro mise à jour base de donnée

haa oui ok je comprend un peu mieux donc effectivement la macro fonctionne jusque au bout .
Mais gros soucis il ouvre tout les fichiers excel qu'il copie!!! mais mon pc va planter si il ouvre 135 fichiers...

merci
 

camarchepas

XLDnaute Barbatruc
Re : Macro mise à jour base de donnée

Bon , je rajoute également la fermeture du fichier avant ouverture du suivant.

un oublie lié à l'heure matinale , je pense .

J'ai toujours pas la réponse pour le nom de l'onglet contenant les données ou bien l'on considère que c'est systématiquement l'onglet actif pour chacun des classeurs ?
 

camarchepas

XLDnaute Barbatruc
Re : Macro mise à jour base de donnée

Elandar,
Voici le nouveau code.

Et oui , attention , il faut maintenant un onglet Base et donc l'onglet Liste dans laquelle j'irais lire le chemin et le nom des fichiers.

Code:
Option Explicit
Sub Assemble()
Dim Classeur As String
Dim Chemin As String
Dim LigneMax As Long, Position As Long
Dim LigneFin As Long, Tourne As Long
Dim Coupure As Long
LigneFin = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
For Tourne = 1 To LigneFin
 Coupure = InStrRev(Sheets("Liste").Range("A" & Tourne), "\")
 Chemin = Left(Sheets("Liste").Range("A" & Tourne), Coupure)
 Classeur = Mid(Sheets("Liste").Range("A" & Tourne), Coupure + 1)
  If Classeur <> ThisWorkbook.Name And Right(Classeur, 5) = ".xlsx" Then
   Workbooks.Open Filename:=Chemin & Classeur, ReadOnly:=True
   LigneMax = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
   If LigneMax > 3 Then
    Position = ThisWorkbook.Worksheets("Base").Range("A" & Rows.Count).End(xlUp).Row + 1
    ActiveSheet.Range("A3:K" & LigneMax).Copy Destination:=ThisWorkbook.Worksheets("Base").Range("A" & Position)
   End If
   Workbooks(Classeur).Close False
  End If
Next Tourne
End Sub
 

elandar8

XLDnaute Nouveau
Re : Macro mise à jour base de donnée

Nooon pourquoi!!
bon je me calme je penssais que la macro fonctionnait a la perfection mais.... Elle loupe certains fichiers.
Pourquoi? j'en sais vraiment rien.
Comme j'avais des sous dossiers, je me suis dis que c'etait peut etre le probleme.. ben non
Comme j'avais des fichiers non excel, je me suis dis que c'etait peut etre aussi le probleme.. ben non
donc je vois vraiment pas...
 

Discussions similaires

Réponses
8
Affichages
430

Statistiques des forums

Discussions
312 184
Messages
2 086 008
Membres
103 089
dernier inscrit
johnjohn1969