Après avoir fait plusieurs recherches et trouvé des réponses qui répondait partiellement à ce que je recherche, je sollicite votre aide. J'ai des fichiers mensuels et un fichier de synthèse, j'aimerais importer des données de mes fichiers mensuels vers le fichier de synthèse.
J'aimerais avec une macro pouvoir sélectionner un fichier mensuel (Janvier-17) et importer les valeurs de la cellule A1 de la feuil1 dans le classeur ouvert "synthèse" dans la cellule A1, jusque là j'ai réussi à le faire.
Je bloque à partir du moment où il faut récupérer les valeurs dans différents onglets du fichier Janvier-17, par exemple à partir de l'onglet feuil2, feuil3 etc, pour les copier en A2, A3, etc dans le classeur synthèse. Egalement, si j'ai 2 valeurs à importer en A1 et A2 par exemple quel serait le code?
Sub maj2()
Const fichier As String = "BILAN_MATIERE_2017.csv"
Dim wbkSource As Workbook
Dim wbkDestination As Workbook
Dim classeur As Workbook
Set classeur = Application.Workbooks.Open("H:\Reports\LOGYS\BILAN_MATIERE_2017.csv", , local:=True)
Set wbkSource = Workbooks(fichier)
Set shtSource = wbkSource.Worksheets("BILAN_MATIERE_2017")
If Not miseablanc Then
Workbooks("Ratio papier 2017.xlsm").Sheets("bilan_matiere").Range("A1:aw1048576").ClearContents
miseablanc = True
End If
Workbooks(fichier).Sheets("BILAN_MATIERE_2017").Range("a1:aw1048576").Copy _
Destination:=Workbooks("Ratio papier 2017.xlsm").Sheets("bilan_matiere").Range("a1:aw1048576")
Workbooks(fichier).Close False
Sheets("Ratio de stockage").Select
End Sub
Bonjour,
Merci je test tout suite.
Le problème de ce code c'est qu'il faut indiquer le chemin, si il change d'une année sur l'autre cela posera un problème; d'où l'idée de pouvoir sélectionner le fichier.
Le problème de ce code c'est qu'il faut indiquer le chemin, si il change d'une année sur l'autre cela posera un problème; d'où l'idée de pouvoir sélectionner le fichier.
Ce n'est vraiment pas un problème et c'est très classique, utiliser :
Code:
Dim FichierAouvrir As Variant
Dim classeur As Workbook
'----
FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
Set classeur = Workbooks.Open(FichierAouvrir)
'----
Et pour importer les valeurs des cellules A1 des feuilles il suffit de faire une boucle :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, classeur As Workbook, w As Worksheet, i As Integer
FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
Application.ScreenUpdating = False
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
.[A:A] = "" 'RAZ
For Each w In classeur.Worksheets
i = i + 1
.Cells(i, 1) = w.[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Avec un complément pour éviter l'ouverture d'un fichier de même nom que celui du ThisWorkbook :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, classeur As Workbook, w As Worksheet, i As Integer
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
Application.ScreenUpdating = False
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
.[A:A] = "" 'RAZ
For Each w In classeur.Worksheets
i = i + 1
.Cells(i, 1) = w.[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Merci Job 75, ça marche super bien et c'est ce que je cherchais.
Par contre comment faire si je veux récupérer seulement les données des onglets nommés "feuil1" et "feuil3" par exemple ? Et pas toutes les valeurs en A1 de tous les onglets?
Merci encore.
Avec un complément pour éviter l'ouverture d'un fichier de même nom que celui du ThisWorkbook :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, classeur As Workbook, w As Worksheet, i As Integer
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
Application.ScreenUpdating = False
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
.[A:A] = "" 'RAZ
For Each w In classeur.Worksheets
i = i + 1
.Cells(i, 1) = w.[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Car c'est un bon exercice pour progresser en VBA :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, a, classeur As Workbook, i As Integer
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("Feuil1", "Feuil3") 'noms des feuilles, à adapter
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
.[A:A] = "" 'RAZ
For i = 0 To UBound(a)
.Cells(i + 1, 1) = classeur.Sheets(a(i)).[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Job75, merci de votre réponse.
Ce n'est pas faute d'avoir cherché, je ne connaissais pas cette fonction Array, j'étais loin du compte. En général, j'arrive à faire des choses "simples"; en cherchant un peu j'avais réussi à bricoler un code (ci-dessous), mais je me heurtais toujours au même problème.
Dim ws_q As Worksheet
Dim ws_x As Worksheet
Set ws_q = ActiveSheet
Dim x_lr&
Dim q_lr&
Dim T1()
Application.ScreenUpdating = False
If Not Application.Dialogs(xlDialogOpen).Show Then Exit Sub
Set ws_x = Worksheets("feuil1")
x_lr = ws_x.Range("A65000").End(xlUp).Row
If x_lr = 1 Then ActiveWorkbook.Close: Exit Sub
With ws_x
T1 = .Range("A1:A" & (x_lr) + Abs(x_lr = 2))
ActiveWorkbook.Close
End With
Car c'est un bon exercice pour progresser en VBA :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, a, classeur As Workbook, i As Integer
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("Feuil1", "Feuil3") 'noms des feuilles, à adapter
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
.[A:A] = "" 'RAZ
For i = 0 To UBound(a)
.Cells(i + 1, 1) = classeur.Sheets(a(i)).[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Par contre si j'ai besoin que mes valeurs se mettent les unes en dessous des autres est où dois-je rajouter ceci :
derligne = .Cells(Rows.Count, "t").End(xlUp).Row + 1
Vous voulez donc maintenant importer les données en colonne T :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, a, classeur As Workbook, derlig, i
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("Feuil1", "Feuil3") 'noms des feuilles, à adapter
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
derlig.Cells(Rows.Count, "t").End(xlUp).Row
With ThisWorkbook.ActiveSheet 'feuille à adapter
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
derlig = .Cells(.Rows.Count, "T").End(xlUp).Row + 1
For i = 0 To UBound(a)
.Cells(derlig + i, "T") = classeur.Sheets(a(i)).[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Bonjour Job 75 et cathodique ,
Pour être plus précis, tout fonctionne avec le code que j'ai tenté d'adapté ci-dessous, sauf que j'aimerais que les valeurs s'incrémentent les unes en dessous des autres de la colonne T à la colonne V, à chaque fois que je sélectionne un fichier. Jusqu'à présent je n'ai réussi qu'a écraser mes données précédentes avec des nouvelles.
Sub Importer()
Dim FichierAouvrir As Variant, a, b, c, classeur As Workbook, i As Integer
Dim dl As Long
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("6002-atelier") 'noms des feuilles, à adapter
b = Array("6000-atelier")
c = Array("6001-atelier")
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
dl = Range("t" & Rows.Count).End(xlUp).Row + 1
For i = 0 To UBound(a)
.Cells(dl + i + 2, 20) = classeur.Sheets(a(i)).[E30] 'importe la valeur de la cellule E30
Next
For i = 0 To UBound(b)
.Cells(dl + i + 2, 21) = classeur.Sheets(b(i)).[E30]
Next
For i = 0 To UBound(c)
.Cells(dl + i + 2, 22) = classeur.Sheets(c(i)).[E30]
Next
End With
classeur.Close False 'referme le classeur
End Sub
Vous voulez donc maintenant importer les données en colonne T :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, a, classeur As Workbook, derlig, i
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("Feuil1", "Feuil3") 'noms des feuilles, à adapter
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
derlig.Cells(Rows.Count, "t").End(xlUp).Row
With ThisWorkbook.ActiveSheet 'feuille à adapter
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
derlig = .Cells(.Rows.Count, "T").End(xlUp).Row + 1
For i = 0 To UBound(a)
.Cells(derlig + i, "T") = classeur.Sheets(a(i)).[A1] 'importe la valeur de la cellule A1
Next
End With
classeur.Close False 'referme le classeur
End Sub
Sub Importer()
Dim FichierAouvrir As Variant, a, b, c, classeur As Workbook, i%
Dim dl1&, dl2&, dl3&
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("6002-atelier") 'noms des feuilles, à adapter
b = Array("6000-atelier")
c = Array("6001-atelier")
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
dl1 = .Range("t" & .Rows.Count).End(xlUp).Row + 1
dl2 = .Range("u" & .Rows.Count).End(xlUp).Row + 1
dl3 = .Range("v" & .Rows.Count).End(xlUp).Row + 1
For i = 0 To UBound(a)
.Cells(dl1 + i + 2, 20) = classeur.Sheets(a(i)).[E30] 'importe la valeur de la cellule E30
Next
For i = 0 To UBound(b)
.Cells(dl2 + i + 2, 21) = classeur.Sheets(b(i)).[E30]
Next
For i = 0 To UBound(c)
.Cells(dl3 + i + 2, 22) = classeur.Sheets(c(i)).[E30]
Next
End With
classeur.Close False 'referme le classeur
End Sub
Nota : le + 2 fait sauter 2 lignes, c'est ce que vous voulez ? Ce serait mieux de l'inclure dans dl1 dl2 dl3...
Mais s'il n'y a qu'un seul nom de feuille dans les tableaux a b c on peut s'en passer :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, classeur As Workbook
Dim dl1&, dl2&, dl3&
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
dl1 = .Range("t" & .Rows.Count).End(xlUp).Row + 3
dl2 = .Range("u" & .Rows.Count).End(xlUp).Row + 3
dl3 = .Range("v" & .Rows.Count).End(xlUp).Row + 3
.Cells(dl1, 20) = classeur.Sheets("6002-atelier").[E30] 'importe la valeur de la cellule E30
.Cells(dl2, 21) = classeur.Sheets("6000-atelier").[E30]
.Cells(dl3, 22) = classeur.Sheets("6001-atelier").[E30]
End With
classeur.Close False 'referme le classeur
End Sub
Sub Importer()
Dim FichierAouvrir As Variant, a, b, c, classeur As Workbook, i%
Dim dl1&, dl2&, dl3&
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
a = Array("6002-atelier") 'noms des feuilles, à adapter
b = Array("6000-atelier")
c = Array("6001-atelier")
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
dl1 = .Range("t" & .Rows.Count).End(xlUp).Row + 1
dl2 = .Range("u" & .Rows.Count).End(xlUp).Row + 1
dl3 = .Range("v" & .Rows.Count).End(xlUp).Row + 1
For i = 0 To UBound(a)
.Cells(dl1 + i + 2, 20) = classeur.Sheets(a(i)).[E30] 'importe la valeur de la cellule E30
Next
For i = 0 To UBound(b)
.Cells(dl2 + i + 2, 21) = classeur.Sheets(b(i)).[E30]
Next
For i = 0 To UBound(c)
.Cells(dl3 + i + 2, 22) = classeur.Sheets(c(i)).[E30]
Next
End With
classeur.Close False 'referme le classeur
End Sub
Nota : le + 2 fait sauter 2 lignes, c'est ce que vous voulez ? Ce serait mieux de l'inclure dans dl1 dl2 dl3...
Mais s'il n'y a qu'un seul nom de feuille dans les tableaux a b c on peut s'en passer :
Code:
Sub Importer()
Dim FichierAouvrir As Variant, classeur As Workbook
Dim dl1&, dl2&, dl3&
1 FichierAouvrir = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*")
If FichierAouvrir = False Then Exit Sub
If Dir(FichierAouvrir) = ThisWorkbook.Name Then GoTo 1 'fichier de même nom
Application.ScreenUpdating = False
On Error Resume Next 'sécurité, si une feuille n'existe pas
Set classeur = Workbooks.Open(FichierAouvrir)
With ThisWorkbook.ActiveSheet 'feuille à adapter
If .FilterMode Then .ShowAllData 'si la feuille est filtrée
dl1 = .Range("t" & .Rows.Count).End(xlUp).Row + 3
dl2 = .Range("u" & .Rows.Count).End(xlUp).Row + 3
dl3 = .Range("v" & .Rows.Count).End(xlUp).Row + 3
.Cells(dl1, 20) = classeur.Sheets("6002-atelier").[E30] 'importe la valeur de la cellule E30
.Cells(dl2, 21) = classeur.Sheets("6000-atelier").[E30]
.Cells(dl3, 22) = classeur.Sheets("6001-atelier").[E30]
End With
classeur.Close False 'referme le classeur
End Sub