Excel 2007 [MACRO] ouverture de fichier .XLS dans un dossier
Bonjour à tous
Cela fait une semaine que je m'essai aux macros sous excel 2007.
Donc j'ai reussi grace a ce forum à avancer et faire que mon fichier excel soit presque automatique.
Mais vient à moi un nouveau problème. J'aimerai que quand j'ouvre mon fichier .XLSM qu'il aille ouvrir un par un des fichiers .XLS qui se trouve dans un dossier précis. et qu'il effectue les différentes taches que j'ai deja mise en place.
une macro qui remplace les X par une celulle qui est sur la meme ligne. (qui marche pour le moment avec un bouton)
Option Explicit
Sub Remplaces()
Dim Cel As Range
With Sheets("Depot_Oracle")
Set Cel = .Cells.Find(what:="x", LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
Do
Cel = Range("C" & Cel.Row)
Set Cel = .Cells.FindNext(Cel)
Loop While Not Cel Is Nothing
End If
End With
End Subune macro qui permet de remanier un tableau et de le disposer comme je le veux. (qui marche quand on va sur l'onglet)
Option Explicit
Private Sub Worksheet_Activate()
Dim Der_Col As Integer
Dim Der_Lig As Long
Application.ScreenUpdating = False
Der_Col = Sheets("Depot_Oracle").UsedRange.Columns.Count
Der_Lig = Range("A" & Rows.Count).End(xlUp).Row + 1
With Sheets("Depot_Oracle")
'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne der_col)
.Range(.Cells(2, 5), .Cells(2, Der_Col)).Copy
'Vers cellule B2 en copiant juste la valeur
Range("B" & Der_Lig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(7, 5), .Cells(7, Der_Col)).Copy
Range("D" & Der_Lig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, Der_Col)).Copy
Range("C" & Der_Lig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, Der_Col)).Copy
Range("E" & Der_Lig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, Der_Col)).Copy
Range("A" & Der_Lig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, Der_Col)).Copy
Range("F" & Der_Lig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
'Application.CutCopyMode = False
Range("A8").Select
End SubDonc je me suis poser la question de comment ouvrir un fichier
j'ai optenu ce bout de code en enregistrant une macro:
Sub Macro1()
'
' Macro1 Macro
'
'
ChDir _
"C:\Database inventory Done"
Workbooks.Open Filename:= _
"C:\Database inventory Done\inventory.xlsx"
End SubDonc dans le cas ou je spécifie le chemin exacte ça va. mais quand j'essai de viser l'ensemble des fichiers. avec *.xls cela ne marche pas.
Du coup je me demandais comment on pouvait:
ouvrir le premier fichier .XLS du dossier.
récuperer la feuille qui est dedans.
l'affecter dans mon fichier dans la feuille Depot oracle.
et realiser toutes mes macros à la suite.
puis faire la meme chose avec tous les fichiers .xls qui suivent dans le dossier.
Je ne sais pas si c'est possible. si quelqu'un peut m'aider?
Je vous met en fichier joint: mon fichier avec mes macros. + le fichier à ouvrir.
Je remercie par avance toutes les peronnes qui vont m'aider à me perfectionner.
Rapt
Bonjour
A quoi te sert la macro "Remplaces" car tu ne te sers pas des résultats , Le prochain fichier écrasera les données ?
En fait la macro remplace me sert c'est juste qu' j'ai pas encore fait une macro pour exploiter les donner apres. je le faisais a la main pour le moment ^^
En tout cas je te remercies je vais analyser ton code. moi je trouve une erreur 1004 quand j'essai d'ouvrir un de mes fichiers d'origines qui ont un nom assez long.
Bon alors tu m'as bien aider. merci Banzai.
Par contre ce que je comprends pas c'est que Dir() m'oublie des fichiers et ne passe pas au fichier suivant mais a celui d'apres
du coup il me scanne la moitié des fichiers. une idée du pourquoi?
mon code est celui-ci maintenant.
Option Explicit
Sub Recupere()
Dim DerCol As Integer
Dim Chemin As String
Dim Fichier As String
Dim WsDestin_Oracle As Worksheet
Dim WsDestin_SQL_Server As Worksheet
Dim WsDestin_Other As Worksheet
Dim DerLig As Long
Application.ScreenUpdating = False
Set WsDestin_Oracle = Sheets("ORACLE")
Set WsDestin_SQL_Server = Sheets("SQL_Server")
Set WsDestin_Other = Sheets("MySQL & Other DB")
Chemin = ThisWorkbook.Path & "\"
Fichier = Chemin & Dir(Chemin & "*.xlsx")
Do While Fichier <> ""
With Workbooks.Open(Fichier)
'Oracle
If .Sheets(3).Name = "Oracle" Then
DerLig = WsDestin_Oracle.Range("A" & Rows.Count).End(xlUp).Row + 1
With .Sheets(3)
DerCol = .Cells(2, Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 5), .Cells(2, DerCol)).Copy 'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne DerCol)
WsDestin_Oracle.Range("B" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'Vers cellule B2 en copiant juste la valeur
.Range(.Cells(7, 5), .Cells(7, DerCol)).Copy
WsDestin_Oracle.Range("D" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, DerCol)).Copy
WsDestin_Oracle.Range("C" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, DerCol)).Copy
WsDestin_Oracle.Range("E" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, DerCol)).Copy
WsDestin_Oracle.Range("A" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, DerCol)).Copy
WsDestin_Oracle.Range("F" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
End If
'SQL_Server
If .Sheets(4).Name = "SQL Server" Then
DerLig = WsDestin_SQL_Server.Range("A" & Rows.Count).End(xlUp).Row + 1
With .Sheets(4)
DerCol = .Cells(2, Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 5), .Cells(2, DerCol)).Copy 'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne DerCol)
WsDestin_SQL_Server.Range("B" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'Vers cellule B2 en copiant juste la valeur
.Range(.Cells(7, 5), .Cells(7, DerCol)).Copy
WsDestin_SQL_Server.Range("D" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, DerCol)).Copy
WsDestin_SQL_Server.Range("C" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, DerCol)).Copy
WsDestin_SQL_Server.Range("E" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, DerCol)).Copy
WsDestin_SQL_Server.Range("A" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, DerCol)).Copy
WsDestin_SQL_Server.Range("F" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
End If
'Other DB
If .Sheets(5).Name = "MySQL & Other DB" Then
DerLig = WsDestin_Other.Range("A" & Rows.Count).End(xlUp).Row + 1 'Select
With .Sheets(5)
DerCol = .Cells(2, Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 5), .Cells(2, DerCol)).Copy 'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne DerCol)
WsDestin_Other.Range("B" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'Vers cellule B2 en copiant juste la valeur
.Range(.Cells(7, 5), .Cells(7, DerCol)).Copy
WsDestin_Other.Range("D" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, DerCol)).Copy
WsDestin_Other.Range("C" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, DerCol)).Copy
WsDestin_Other.Range("E" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, DerCol)).Copy
WsDestin_Other.Range("A" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, DerCol)).Copy
WsDestin_Other.Range("F" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
End If
.Close 'Ferme fichier
End With
If Len(Dir()) <> 0 Then 'Test si Dir() different de 0
Fichier = Chemin & Dir() 'affecte Chemin + Dir()
Else
Fichier = "" 'Sinon affecte ""
End If
Loop
Application.Goto WsDestin_Oracle.Range("A1")
End Suben fait je crois savoir... Vu que je fais un test
If Len(Dir()) <> 0 Then 'Test si Dir() different de 0
Fichier = Chemin & Dir() 'affecte Chemin + Dir()
Else
Fichier = "" 'Sinon affecte ""
End Ifj'appelle du coup deux fois le Dir()....
Une idée pour tester si Dir() = 0 sans l'appeler deux fois?
j'ai trouvé !
Code final :
Option Explicit
Sub Recupere()
Dim DerCol As Integer
Dim Chemin As String
Dim Fichier As String
Dim Result As String
Dim WsDestin_Oracle As Worksheet
Dim WsDestin_SQL_Server As Worksheet
Dim WsDestin_Other As Worksheet
Dim DerLig As Long
Application.ScreenUpdating = False
Set WsDestin_Oracle = Sheets("ORACLE")
Set WsDestin_SQL_Server = Sheets("SQL_Server")
Set WsDestin_Other = Sheets("MySQL & Other DB")
Chemin = ThisWorkbook.Path & "\"
Result = Dir(Chemin & "*.xlsx")
Fichier = Chemin & Result
Do While Fichier <> ""
With Workbooks.Open(Fichier)
'Oracle
If .Sheets(3).Name = "Oracle" Then
DerLig = WsDestin_Oracle.Range("A" & Rows.Count).End(xlUp).Row + 1
With .Sheets(3)
DerCol = .Cells(2, Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 5), .Cells(2, DerCol)).Copy 'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne DerCol)
WsDestin_Oracle.Range("B" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'Vers cellule B2 en copiant juste la valeur
.Range(.Cells(7, 5), .Cells(7, DerCol)).Copy
WsDestin_Oracle.Range("D" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, DerCol)).Copy
WsDestin_Oracle.Range("C" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, DerCol)).Copy
WsDestin_Oracle.Range("E" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, DerCol)).Copy
WsDestin_Oracle.Range("A" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, DerCol)).Copy
WsDestin_Oracle.Range("F" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
End If
'SQL_Server
If .Sheets(4).Name = "SQL Server" Then
DerLig = WsDestin_SQL_Server.Range("A" & Rows.Count).End(xlUp).Row + 1
With .Sheets(4)
DerCol = .Cells(2, Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 5), .Cells(2, DerCol)).Copy 'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne DerCol)
WsDestin_SQL_Server.Range("B" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'Vers cellule B2 en copiant juste la valeur
.Range(.Cells(7, 5), .Cells(7, DerCol)).Copy
WsDestin_SQL_Server.Range("D" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, DerCol)).Copy
WsDestin_SQL_Server.Range("C" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, DerCol)).Copy
WsDestin_SQL_Server.Range("E" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, DerCol)).Copy
WsDestin_SQL_Server.Range("A" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, DerCol)).Copy
WsDestin_SQL_Server.Range("F" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
End If
'Other DB
If .Sheets(5).Name = "MySQL & Other DB" Then
DerLig = WsDestin_Other.Range("A" & Rows.Count).End(xlUp).Row + 1 'Select
With .Sheets(5)
DerCol = .Cells(2, Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 5), .Cells(2, DerCol)).Copy 'Copie cellule (Ligne 2 colonne 5) jusqu'à (Ligne DerCol)
WsDestin_Other.Range("B" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'Vers cellule B2 en copiant juste la valeur
.Range(.Cells(7, 5), .Cells(7, DerCol)).Copy
WsDestin_Other.Range("D" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(3, 5), .Cells(3, DerCol)).Copy
WsDestin_Other.Range("C" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(9, 5), .Cells(9, DerCol)).Copy
WsDestin_Other.Range("E" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(6, 5), .Cells(6, DerCol)).Copy
WsDestin_Other.Range("A" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
.Range(.Cells(8, 5), .Cells(8, DerCol)).Copy
WsDestin_Other.Range("F" & DerLig).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End With
End If
.Close 'Ferme fichier
End With
Result = Dir()
If Len(Result) <> 0 Then 'Test si Dir different de 0
Fichier = Chemin & Result 'affecte Chemin + Dir
Else
Fichier = "" 'Sinon affecte ""
End If
Loop
Application.Goto WsDestin_Oracle.Range("A1")
End Sub