Import données selon semaines et sur différents fichiers excels
Bonjours à tous !
Je cherche à récupérer les données d'un excel depuis un autre excel. Depuis un fichier "hebdo" je veux que selon la semaine que je rentre "S01, S02.." il aille me chercher une donnée (Semaines réparties sur ligne et données en colonne) qu'il me la copie, et qu'il me la colle dans mon fichier source "Excel_Bilan" selon la semaine en question ( Dans celui-ci les semaines sont sur une colonne).
J'ai réalisé cet macro ( je suis un gros débutant semaine dernière je ne savais pas encore que les macros existaient) donc c'est sûrement bourré de fautes..
Je vous partage les fichier excel en question cf pièce jointe. Et dernière chose, le fichier source se trouve dans un dossier différent du dossier contenant le fichier "hebdo".
Public Sub Traitement_Données_fonderie()
Dim Semaine As String, Excel_Bilan As String, Semaine As String, Semaine1 As String
'String chaine de carractère'
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Chemin = "C:\Users\Asus200\Documents\macro test\X\hebdo.xls"
Semaine1 = InputBox("Numéro de la semaine ?")
Semaine = "S" & Semaine1
Dim n As Long
n = 2
While Cells(n, 3) <> Semaine
n = n + 1
If n > 50000 Then
MsgBox ("Une erreur est survenue")
Exit Sub
End If
Wend
Variateur1 = Range(4, n).Value
Excel_Bilan = ActiveWorkbook.Name
Workbooks(Excel_Bilan).Activate
Range("Q" & n).Value = Variateur1
End SubBonjour,
Et bien félicitations ! C'est fort d'en connaître autant en une semaine !
Voici un essai pour votre code, si j'ai bien compris. On cherche en colonne 3 la position de correspondance (n). On renvoie la valeur associée en colonne 4 (comme un recherchev - à noter que la plupart des fonctions de feuille existe sur VBA) dans la variable variateur. On ouvre le fichier bilan d'après le chemin en début de code.
On attribue à la colonne Q en ligne n la valeur de variateur puis on ferme le fichier bilan.
Public Sub Traitement_Données_fonderie()
Dim Semaine As String, Excel_Bilan As String, Semaine As String, Semaine1 As String
Dim n As Long
Chemin = "C:\Users\Asus200\Documents\macro test\X\hebdo.xls" 'chemin bilan ?
Semaine1 = InputBox("Numéro de la semaine ?") 'input
Semaine = "S" & format(Semaine1, "00") 'semaine à chercher dans col 3 (format "00")
with sheets("nomfeuille") '<<< adapter nom feuille
if application.countif(.columns(3), Semaine) > 0 then 'si existe dans col 3
n = application.match(Semaine, .columns(3), 0) 'position 1ere corresp
Variateur1 = .cells(n, 4).Value 'valeur en col 4
end with
set wbbilan = workbooks.open(Chemin) 'ouverture bilan
with wbbilan 'avec bilan
.activesheet.Range("Q" & n).Value = Variateur1 'adapter activesheet !!!, Qn = variateur
.close true 'ferme et sauve
end with
End SubIl faudra au moins adapter le nom de la feuille du fichier source et si possible celui de la feuille à modifier dans le fichier bilan.
Cdlt,
Salut 3GB,
Je ne suis pas certains de comprendre ta macro.. dans le doute je te réexplique ce que je souhaite :
J'ouvre mon fichier bilan, je renseigne la semaine X. La macro ouvre le fichier hebdo, cherche la colonne associée à SX et copie la valeur 1 :
S1 S2 S3
A 1 3
B
C
Ensuite il retourne dans mon fichier bilan, et colle dans la semaine correspondante :
A B C
S1 1
S2
S3
En fait, je ne comprends pas du tout ceci :
if application.countif(.columns(3), Semaine) > 0 then 'si existe dans col 3
n = application.match(Semaine, .columns(3), 0) 'position 1ere corresp
Variateur1 = .cells(n, 4).Value 'valeur en col 4Peux tu me le réexpliquer ? Je te remercie !
Bonjour,
Oui, dans le code, le fichier bilan est le fichier hebdo. Mais en fait ça n'a pas d'importance puisque le code s'exécute (si je comprends bien) à partir du fichier bilan.
Je rebondis sur le cas des semaines. Sur tonpremier message, tu indiquais "S01", "S02". Donc, j'ai mis une ligne qui transforme toute saisie au format "S00".
Semaine = "S" & format(Semaine1, "00") 'semaine à chercher dans col 3 (format "00")
with sheets("nomfeuille") '<<< adapter nom feuille
if application.countif(.columns(3), Semaine) > 0 then 'si existe dans col 3
n = application.match(Semaine, .columns(3), 0) 'position 1ere corresp
Variateur1 = .cells(n, 4).Value 'valeur en col 4
else
msgbox "semaine introuvable": exit sub
end if
end withCette partie de code (dans lequel il manquait un END IF
- tester l'existence de la Semaine ("S0X") dans la colonne 3 de la feuille "nomfeuille" >>> ligne if countif (équivalent de NB.SI),
- en cas de condition vérifiée (donc d'existence de cette semaine), affecter à la variable n la première position de correspondance de Semaine dans la colonne 3 de "nomfeuille" grâce à match (équivalent de EQUIV). C'est pour éviter une erreur dans la suite du code que j'ai mis la condition avec le countif.
- affecter à la variable Variateur1 la valeur de la cellule en colonne D de "nomfeuille" à la ligne n (ligne de correspondance) comme avec un RECHERCHEV.
- en cas d'absence de Semaine dans la colonne 3, renvoyer un message et une sortie anticipée de la procédure (rajoutée à l'instant).
Ensuite :
set wbbilan = workbooks.open(Chemin) 'ouverture bilan
with wbbilan 'avec bilan
.activesheet.Range("Q" & n).Value = Variateur1 'adapter activesheet !!!, Qn = variateur
.close true 'ferme et sauve
end with- on ouvre le fichier hebdo,
- on attribue à la cellule à la ligne n (point central ici) de la colonne Q de la feuille active du fichier hebdo la valeur de notre variable Variateur (Dn de nomfeuille de bilan). C'est ce point où il y a peut-être une mauvaise interprétation de ma part car on reporte sur la même ligne, alors que ce n'est pas le même fichier, variateur1.
- puis on ferme en sauvegardant le fichier hebdo.
Le code à jour des petites modifs :
Public Sub Traitement_Données_fonderie()
Dim Semaine As String, Excel_Bilan As String, Semaine As String, Semaine1 As String
Dim n As Long
Chemin = "C:\Users\Asus200\Documents\macro test\X\hebdo.xls" 'chemin bilan ?
Semaine1 = InputBox("Numéro de la semaine ?") 'input
Semaine = "S" & format(Semaine1, "00") 'semaine à chercher dans col 3 (format "00")
with sheets("nomfeuille") '<<< adapter nom feuille
if application.countif(.columns(3), Semaine) > 0 then 'si existe dans col 3
n = application.match(Semaine, .columns(3), 0) 'position 1ere corresp
Variateur1 = .cells(n, 4).Value 'valeur en col 4
else
msgbox "semaine introuvable": exit sub
end if
end with
set wbhebdo = workbooks.open(Chemin) 'ouverture bilan
with wbhebdo 'avec bilan
.activesheet.Range("Q" & n).Value = Variateur1 'adapter activesheet !!!, Qn = variateur
.close true 'ferme et sauve
end with
End SubEst-ce que ça vous semble correct ? Il faut bien entendu adapter, au moins le nom de la feuille "nomfeuille".
Cdlt,
Je suis désolé, mais la macro ne fonctionne pas sur mes fichiers, et je ne comprends pas tes explications..
Bonjour,
Oui, dans le code, le fichier bilan est le fichier hebdo. Mais en fait ça n'a pas d'importance puisque le code s'exécute (si je comprends bien) à partir du fichier bilan.
En effet, je code s'effectue depuis le fichier bilan, mais pourquoi dans le code le fichier bilan est le fichier hebdo ? ce sont deux fichiers différents
Je rebondis sur le cas des semaines. Sur tonpremier message, tu indiquais "S01", "S02". Donc, j'ai mis une ligne qui transforme toute saisie au format "S00".
Semaine = "S" & format(Semaine1, "00") 'semaine à chercher dans col 3 (format "00")
with sheets("nomfeuille") '<<< adapter nom feuille
if application.countif(.columns(3), Semaine) > 0 then 'si existe dans col 3
n = application.match(Semaine, .columns(3), 0) 'position 1ere corresp
Variateur1 = .cells(n, 4).Value 'valeur en col 4
else
msgbox "semaine introuvable": exit sub
end if
end withCette partie de code (dans lequel il manquait un END IF ) et que je modifie ainsi, va :
- tester l'existence de la Semaine ("S0X") dans la colonne 3 de la feuille "nomfeuille" >>> ligne if countif (équivalent de NB.SI), Donc la nous sommes bien sur le fichier hebdo ?
- en cas de condition vérifiée (donc d'existence de cette semaine), affecter à la variable n la première position de correspondance de Semaine dans la colonne 3 de "nomfeuille" grâce à match (équivalent de EQUIV). C'est pour éviter une erreur dans la suite du code que j'ai mis la condition avec le countif.
Donc la si condition vérifiée, la variable n se POSITIONNE sur la première cellule sous la cellule SXX ? Ok, comment je fais si je veux qu'elle prenne la 2ème, ou 3ème cellule ?
- affecter à la variable Variateur1 la valeur de la cellule en colonne D de "nomfeuille" à la ligne n (ligne de correspondance) comme avec un RECHERCHEV.
La je ne comprends plus rien.. nous sommes toujours dans le fichier hebdo ? Pourquoi les semaines sont en ligne ....? qu'est ce que la colonne D...?
- en cas d'absence de Semaine dans la colonne 3, renvoyer un message et une sortie anticipée de la procédure (rajoutée à l'instant).
Si absence de semaine dans la colonne 3, il faut que la macro aille voir en colonne 4..?
Ensuite :
set wbbilan = workbooks.open(Chemin) 'ouverture bilan
with wbbilan 'avec bilan
.activesheet.Range("Q" & n).Value = Variateur1 'adapter activesheet !!!, Qn = variateur
.close true 'ferme et sauve
end with- on ouvre le fichier hebdo, la non plus je ne comprends pas... on ouvre le fichier bilan à l'aide du (chemin) pourtant le chemin est celui du fichier hebdo
- on attribue à la cellule à la ligne n (point central ici) de la colonne Q de la feuille active du fichier hebdo la valeur de notre variable Variateur (Dn de nomfeuille de bilan). C'est ce point où il y a peut-être une mauvaise interprétation de ma part car on reporte sur la même ligne, alors que ce n'est pas le même fichier, variateur1.
- puis on ferme en sauvegardant le fichier hebdo.
Est ce qu'on s'est bien compris, quand je dis que je veux que depuis mon fichier bilan je rentre le numéro de semaine, la macro va dans le fichier hebdo dans lequel les semaines sont sur une même ligne et donc sur des colonnes différentes, prends la valeur de la semaine correspondante et de la ligne X, et la colle dans mon fichier bilan qui est ouvert, sur la colonne Y de ma ligne semaine ?
Si oui alors je n'arrive vraiment pas à comprendre la macro pour les raisons citées plus haut..