Fichier paramétré-Import depuis fichier fermé-Macro auto
Bonjour à tous
1:
voila deja qqs jours que je planche sur mes macros et j'ai besoin de vos lumières:
je récapépette :
- j'ouvre un fichier excel 'bilan' ou une fenetre me demande de rentrer une année N ( ex 2008)
- ensuite, de manière automatique il doit aller chercher les valeurs des cellules B5 et D7 de la feuille 'annexe' du fichier 'bilan_N-1'(donc ici 'bilan_2007') pour les mettre dans les cases C8 et E9 de la feuille 'resultat' du fichier bilan (si possible sans ouvrir le fichier 'bilan_2007')
- Demander si on veut faire une sauvegarde ( sous le nom 'bilan_N' donc ici 'bilan_2008)
D'autre part certains modules ou fonctions de la macro doivent etre mis en
classeur caché
ou module
ou thisworkbook
pouvez vous m'aider ? merci d'avance
2:
par ailleurs j'ai essayé divers méthodes:
*** Private Function GetValue(A, B, C, D)
'Récupération d'une valeur dans un fichier fermé
Dim Chemin As String
Chemin = "'" & A & "[" & B & "]" & C & "'!" & D
'Crée l'argument de la fonction XL4
GetValue = ExecuteExcel4Macro (Chemin)
'Exécute la macro XLM
End Function
Private Sub Workbook_open()
Dim Annee As String
Dim Repertoire As String
Dim Nom_Fich As String
Dim Feuille As String
Dim Cellule As String
Dim Valeur As Double
Annee = 2008
Feuille = "Résultat de l'année"
Cellule = "B5"
Repertoire = ActiveWorkbook.Path
Nom_Fich = "bilan-" & Annee - 1 & "essai.xls"
Valeur = GetValue(Repertoire, Nom_Fich, Feuille, Cellule)
End Sub
j'ai essayé plusieurs choses mais j'ai toujours un pb avec la syntaxe au niveau de ExecuteExcel4Macro (Chemin)
**** comment faire une fonction qui retourene une chaine de caractères (je m'en servirai pour le chemin d'autres valeurs qu'il me faudra chercher)
J'espère que j'ai été clair dans mes explications...
merci d'avance pour votre aide
Bonsoir,
dans ton code, 2 petites erreurs :
. Tu as oublié le "\" entre le sous-répertoire et le fichier
. Il vaut mieux mettre la référence sous le type R1C1 que A1
Donc, essaie avec :
Private Function GetValue(A, B, C, D)
Dim Chemin As String
Chemin = "'" & A & "[" & B & "]" & C & "'!" & D
GetValue = ExecuteExcel4Macro(Chemin)
End Function
Private Sub Workbook_open()
Dim Annee As String
Dim Repertoire As String
Dim Nom_Fich As String
Dim Feuille As String
Dim Cellule As String
Dim Valeur As Double
Annee = 2008
Feuille = "Résultat de l'année"
Cellule = "R5C2"
Repertoire = ActiveWorkbook.Path & "\"
Nom_Fich = "bilan-" & Annee - 1 & "essai.xls"
Valeur = GetValue(Repertoire, Nom_Fich, Feuille, Cellule)
End Sub
Si cela fonctionne....
Bonjour
merci pour ton aide Félix
j'ai fait les modifs que tu as préconisées
ca ne marche toujours pas : j'ai une erruer dans la ligne :
GetValue = ExecuteExcel4Macro(Chemin)
serait ce parce que j'ai mis:
Private Function GetValue(A, B, C, D)
et
Private Sub Workbook_open()
dans ThisWorbook et dans cet ordre ?
car je ne vois pas où est l'erreur.
Merci pour votre aide
Bonjour,
je pense que l'erreur vient de ton nom d'onglet...
tu as "résultat de l'année" avec une quote ( ' ) entre l et année...
Enlève le dans le code et sur ton nom d'onglet, et re-essaye
Super Félix
merci pour cette subtile mais fondamentale observation
ca marche.... merci 1000 fois
j'ai mis ces deux fonctions dans thisworkbook pour une execution automatique
les 2 doivent elles etre dans thisworkbook ou seulement Private Sub Workbook_open()
a ce moment la est ce que je mets Private Function GetValue(A, B, C, D)
D'autre part dois je prendre des précautions sur le classeur dans lequel il va chercher
la données que je veux: ouvert/fermé avant/après l'importation de la donnée?
dernières question: comment lui faire demander a l'utilisateur une année que la macro utilsera apres?
merci encore pour l'aide précieuse que vous m'apportez
Re-,
1/ Tu peux laisser les deux codes dans cette feuille
2/ Pas besoin d'ouvrir l'autre classeur, la valeur de la cellule est prise par le code
3/ Essaie en remplaçant Annee = 2008 par Annee = Year(Date) si tu veux les classeurs de l'année en cours
Sinon, par un inputbox :
exemple :
Annee = Val(InputBox("Entrez l'année désirée sous la forme 2008"))
MerCi Félix
1)
mais j'ai une erreur sur la ligne
Annee = Val(InputBox("Entrez l'année désirée sous la forme 2008"))
==> erreur de compilation , tableau attendu
que je declare annee en integer ou double
2) ca marche que le fichier dont j'importe des données soit ouvert ou fermé ?pas de precaution a prendre ?
3) pour un autre code :
Range("A1").Address(, , xlR1C1) <==== ca je pije pas?
tu peux m'éclairer ?
merci pour tes lumières ainsi que la rapidité et la justesse de tes réponses
rebonjour
erreur de ma part pour le 1)
j'avais une variable appelée Val que j'ai donc renommée et ca marche
Peut -on controler l'entrée ed l'année pour quelle soit sous le forme 2008 afin d'eviter toute erreur de saisie ?
peut on egalement controler l'existence du fichier auquel on fait appel et s'il n'existe pas mettre un message l'indiquant?
merci et desolé pour le 1) ...
Re-,
Oups, tu viens de répondre, j'allai te demander ton code entier.....
Attention, ne jamais mettre un nom propre à VBA comme variable
Si tu ne les connais pas tous (
pour l'année saisie, et l'existence du fichier, adapte le code suivant :
Private Sub Workbook_open()
Dim Annee As Double
Dim Repertoire As String
Dim Nom_Fich As String
Dim Feuille As String
Dim Cellule As String
Dim Valeur As Double
debut:
Annee = Val(InputBox("Entrez l'année désirée sous la forme 2008"))
If Len(Annee) <> 4 And Annee < 1900 Then
MsgBox "Format non valide"
GoTo debut
End If
Feuille = "Résultat de l'année"
Cellule = "R5C2"
Repertoire = ActiveWorkbook.Path & "\"
Nom_Fich = "bilan-" & Annee - 1 & "essai.xls"
With Application.FileSearch
.LookIn = Repertoire
.Filename = Nom_Fich
.MatchTextExactly = True
If .Execute() = 0 Then MsgBox "Fichier inexistant, Recommencez": GoTo debut
End With
Valeur = GetValue(Repertoire, Nom_Fich, Feuille, Cellule)
End Sub
Rebonjour
ca semble si simple quand ont lit ce que tu écris ....
merci encore
par contre:
2) ca marche que le fichier dont j'importe des données soit ouvert ou fermé ?pas de precaution a prendre ?
3) pour un autre code :
Range("A1").Address(, , xlR1C1) <==== ca je pije pas?
peux tu m'eclairer ?
merci encore pour ton aide??
Re-,
1/ Fais des essais, tu verras.....qu'il soit fermé ou ouvert, pas de souci, il faut qu'il existe, c'est tout
2/ ce code te donne l'adresse A1 en R1C1
donc A6 te donne R6C1
regarde l'aide, en cliquant dans Address, et tapes sur F1
Edit : R signifie Row donc ligne, et C : Column
donc R6C1 veut dire la cellule de la ligne 6 et de la colonne 1, soit A6
Tu peux vérifier, en mettant dans Outils/Options, onglet Général, coche sur "Style de référence L1C1", et tu n'auras plus les A, B, C....mais 1, 2, 3.....