Excel et nom de fichier paramétré

Sarl -  
 Sarl -
Bonjour,
J'ai un tableau excel (bilan_N.xls) où je rentre l'année N (ici N=2008)
je souhaite q'il aille chercher la valeur (de la case L2C2 par exemple) se trouvant dans un fichier
dont le nom depend de N

par exemple si j'ai rentré N=2008 ( je suis alors dans le fichier bilan_2008.xls), je voudrais qu'il aille chercher la valeur de la case L2C2 du fichier bilan_2007.xls

En fait si je suis dans le fichier bilan_N.xls je veux qu'il aille chercher des données dans bilan_N-1.xls
comment est ce possible.
merci
Configuration: Windows XP
Internet Explorer 6.0

12 réponses

  1. Thanahthaus Messages postés 140 Statut Membre 27
     
    Bonjour,
    Utilise une formule du genre :

    =[bilan2007.xls]Feuil1!$A$1

    qui renvoi dans la cellule ou tu la tape la case A1 de la feuille 1 du document bilan2007.xls
    0
    1. Sarl
       
      hélas non... ca je sais faire
      justement
      il faudrait avoir la ligne =[bilan2007.xls]Feuil1!$A$1 mais en remplacant 2007 par N
      c'est a dire que le nom du fichier depende de N
      et je fais varier mon N d'une année a l'autre
      et ca ... je sais pas faire
      quelqu'un sait il?
      merci
      0
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    sait pas si j'ai bien compris ?
    Sub Ouvre()
    Dim Fich As String
    N = 2008
        Fich = "bilan" & N - 1 & ".xls"
        Workbooks.Open (Fich)
        ActiveWorkbook.Sheets("Feuil1").Select
        
    End Sub

    A+
    0
    1. Sarl
       
      Bonjour, oui et non ...
      le N , je le rentre en dhors de la macro ....
      et je ne sais pas quand ni ou ecrire cette macro car j'aimerais qu'une fois lesdonnées importées , le fichier bilan qui a ete ouvert se referme
      merci
      0
    2. Sarl
       
      Re Bonjour
      pourquoi lermite222 ?
      cela prolonge les reponses que j'ai dejà eues?
      ou je me suis trompé quelque part ?
      Merci pour votre aide
      0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    tu met tout dans un module

    public  Fich As String
    Public Annee as string
    
    Sub Ouvre()
    'si tu vient de la feuille.....
         Annee = val(Right(activesheet.Name,4))
    'si pas dans le même répertoir, ajouter le path
        Fich = "bilan" & Annee - 1 & ".xls"
        'RECTIFICATION
        Workbooks (Fich).Open
        ActiveWorkbook.Sheets("Feuil1").Select
        
    End Sub
    
    Sub Fermer()
        'si le classeur a déjà été fermer
         On error resume Next
         Workbooks (Fich).Close
    End Sub


    tu peu ainsi appeller les macros de n'importe où, mais change N par Annee,
    N c'est trop simple pour une variable globale
    0
    1. Sarl
       
      Merci
      je vais essayer de regarder ca mais , macro,module c du chinois pour moi donc fo vraiment que je prenne tout a la base
      +
      0
  4. Sarl
     
    rebonjour à tous

    1:

    voila deja qqs heures 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)
    - 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 doivente etre mis en
    classeur caché
    module
    ou thisworkbook

    pouvez vous m'aider ? merci d'avance

    2:
    par ailleurs j'ai essayé:

    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)

    3: 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 pour votre aide
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Sarl
     
    re
    une derniere question: je ne comprends pas la syntaxe de :
    ' Reconstitue le chemin complet qui conduit à la cellule cible
    Cible = "'" & Chemin & "[" & Fichier & "]" & Feuille & "'!" & Range(Cellule).Range("A1").Address(, , xlR1C1)
    en particulier : Range(Cellule).Range("A1").Address(, , xlR1C1)
    merci pour votre aide
    Bsr
    0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Tu t'est trompé de topic ou de forum...
    0
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    ces fonctions ne viennent pas de ce topic, et comme tu ne les comprend pas, je suppose qu'elle viennent d'ailleur
    Reconstitue le chemin complet qui conduit à la cellule cible
    Cible = "'" & Chemin & "[" & Fichier & "]" & Feuille & "'!" & Range(Cellule).Range("A1").Address(, , xlR1C1)
    en particulier : Range(Cellule).Range("A1").Address(, , xlR1C1)
    0
    1. Sarl
       
      Rebonjour
      tu supposes bien
      comme je t'ai dit je cherche depuis quelques jours et don sur ggogle entre autre
      j'esaye de comprendre mais suis novice donc je demande sur ce forum
      Je pensais que c'était un de ses buts ?
      Merci
      0
      1. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Sarl
         
        Bien entendu que c'est le but d'aider, et le mien aussi d'ailleur.
        Mais tu pourrais avoir la politesse, avant de REPOSER TA QUESTION avec un code venu dailleur de commenter la réponse QUE J'AI PRIS LE TEMPS DE TE PROPOSER.
        0
  9. Sarl
     
    Rebonjour

    toutes mes escuses, je t'avais remercié mais j'ai pas commenté ta solution proposée.

    Pour la réponse de Thanahthaus : ca ne va pas car ' =[bilan2007.xls]Feuil1!$A$1 ' doit dépendre de ANNEE et non de 2007. Merci quand même

    Pour lermite222 :

    public Fich As String
    Public Annee as string

    Sub Ouvre()
    'si tu vient de la feuille.....
    Annee = val(Right(activesheet.Name,4)) <=== ca je n'ai pas compris ce que cela faisait
    'si pas dans le même répertoir, ajouter le path
    Fich = "bilan" & Annee - 1 & ".xls"
    'RECTIFICATION
    Workbooks (Fich).Open
    ActiveWorkbook.Sheets("Feuil1").Select

    End Sub
    ²
    Sub Fermer()
    'si le classeur a déjà été fermer
    On error resume Next
    Workbooks (Fich).Close
    End Sub

    En fait cela ouvre le classeur pour y recuperer la feuille si j'ai bien compreis
    Donc merci pour cette info

    Toutefois maintenant j'aimerais essayer de faire cela le classeur fermé
    J'ai donc farfouiller et j'ai trouvé le code que j'ai envoyé dans le message 7

    mais je bloque sur la fonction ExecuteExcel4Macro sui me renoye une erreur 1004
    ( meme en ayant corrigé un \ sui semblait manquer)

    De plus je ne comprends pas dans :
    Range(Cellule).Range("A1").Address(, , xlR1C1)
    l'utilité du .Address(, , xlR1C1)

    Merci pour votre aide et désolé pour ma maladresse lermitte222 ...mille excuses
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Je connaissais pas non plus, mais en tapant la formule dans une sub, sélectionné Address et F1... et voilou.
      A+
      0
  10. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Excuser moi de m'imposer dans votre topic, mais j'ai une routine en VBA qui permet de récupérer dans un fichier Excel fermé la valeur d'une cellule et de la copier dans le classeur actif. La voilà :

    Il faut cocher dans Outils -> Références -> "Microsoft ActiveX Data Objects x.x Library" ainsi que "Microsoft ADO ext x.x for DLL and Security".
    Public Sub SearchWorkbookClose(ByVal fichier As String, ByVal feuille As String, ByVal cellule As String)
    Dim cnx As ADODB.Connection
    Dim query As String
    Dim rs As ADODB.Recordset
    Dim cnxCde As ADODB.Command
        
        'Ne pas oublier le $ après le nom de la feuille
        feuille = feuille & "$"
       
        Set cnx = New ADODB.Connection
        cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
                    
        Set cnxCde = New ADODB.Command
        With cnxCde
            .ActiveConnection = cnx
            .CommandText = "SELECT * FROM [" & feuille & cellule & "]"
        End With
                      
        Set rs = New ADODB.Recordset
        rs.Open cnxCde, , adOpenKeyset, adLockOptimistic
                      
        Set rs = cnx.Execute("[" & feuille & cellule & "]")
        
        'affichage du résultat dans le classeur actif
        ThisWorkbook.Worksheets(2).Range("A2").CopyFromRecordset rs
                
        'fermeture connexion
        rs.Close
        cnx.Close
        Set cnx = Nothing
        Set rs = Nothing
        Set cnxCde = Nothing
    
    End Sub
    

    Il suffit de passer en paramètre : le chemin et le nom du fichier (ex: "C:\monProjet\monFichier.xls"), le nom de la feuille du fichier fermé qui contient la cellule à copier (ex: "Feuil1") et enfin la cellule qui contient la donnée (ex: "B2:B2").

    Bon courage

    ;o)

    polux
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Bonjour Polux,
      Si tu n'a pas fait un copier coller d'un autre forum.
      Si tu a tester cette fonction et qu'elle fonctionne impec.
      Tu pourrait faire une proposition d'astuce dans Suggestion..
      J'ai vérifié, ca existe pas encore.
      A+
      0
      1. Polux31 Messages postés 7219 Statut Membre 1 204 > lermite222 Messages postés 9042 Statut Contributeur
         
        Bonjour lermite222

        Je ne l'ai pas inventé ... :o) ... en fait c'est des copier/coller de plusieurs bouts de code pris dans des exemples soi dans l'aide en ligne, soi sur des codes existant que j'ai adapté. Mais je pense que cette routine doit exister sur d'autres forum, je n'ai pas vérifié.
        Elle fonctionne puisque je l'utilise.
        Par contre, j'ai remarqué qu'il y avait beaucoup de demandes concernant les connexions Access en VB ou VBA. Je pourrai peut être proposer en astuce le module que j'ai fait et qui permet de se connecter, passer des requêtes et naviguer dans un recordset.
        Je vais y penser.

        @+

        ;o)

        polux
        0
      2. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Polux31 Messages postés 7219 Statut Membre
         
        J'ai pas parler de l'inventer, mais de copier/coller, si tu l'a adapter en piquant des bouts un peu partout et qu'ont ne la retrouve pas mots pour mots c'est nickel.
        A+
        0
  11. Sarl
     
    Rebonjour merci pour vos reponses

    ----------------------------------------------------------------------------------------------------
    lermite222 j'ai pas compris ta reponse ( je suis vraiment novice ) :)

    1) Je connaissais pas non plus, mais en tapant la formule dans une sub, sélectionné Address et F1 <====?
    2) j'ai toujours pas compris l'utilité de Address(, , xlR1C1) dans Range(Cellule).Range("A1").Address(, , xlR1C1)
    car je pensais que la variable Chemin que j'avais créée me donnait la cellule à aller chercher alors pourquoi ce code?
    Range(Cellule).Range("A1").Address(, , xlR1C1) et non pas seulement Range(Cellule) ???

    merci pour tes lumieres

    ----------------------------------------------------------------------------------------------------
    polux31

    Il faut cocher dans Outils -> Références -> "Microsoft ActiveX Data Objects x.x Library" ainsi que "Microsoft ADO ext x.x for DLL and Security".

    je ne trouve pas dans outils '-> Références ' (j'ai excel 2003 peut etre est ce pour cela ????)
    j'aurais portant aimé tester ta méthode

    --------------------------------------------------------------------------------------------------

    Merci pour votre aide
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      J'ai aussi excel 2003. Dans l'éditeur Visual Basic, dans la barre de menu il y à "Outils -> Références ..."

      ;o)
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Polux31 Messages postés 7219 Statut Membre
       
      Par hazard.. t'aurais pas un VB6 ou autre..
      0
    3. Polux31 Messages postés 7219 Statut Membre 1 204 > lermite222 Messages postés 9042 Statut Contributeur
       
      Oui j'ai aussi VB6 ...
      0
    4. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      >> Range(Cellule).Range("A1").Address(, , xlR1C1) et non pas seulement Range(Cellule) ??? <<
      Je vais finir par comprendre -D
      Cellule est un nom de plage que tu peu remplacer par ex: Range("A1")...
      c'est dans CETTE CELLULE qu'est mis la valeur de la dernière ligne renseignée sur la feuille (initialisée)
      Là on ne prend pas la valeur de cellule mais ont y met une valeur.
      c'est comme qui dirais... Variable = Range("A1") , le N° de la dernière ligne
      équivalent plus parlant.. et plus simple
      DerniereLigne = Range("A1").SpecialCells(xlCellTypeLastCell).Row
      Compris ?
      0
    5. lermite222 Messages postés 9042 Statut Contributeur 1 199 > Polux31 Messages postés 7219 Statut Membre
       
      M'en doutait et me demande si ADO n'est pas exclusif à VB..
      Bien que si ont l'a, ont peu l'employer en VBA.
      0
  12. Sarl
     
    Rebonjour

    J'ai aussi excel 2003. Dans l'éditeur Visual Basic, dans la barre de menu il y à "Outils -> Références ..."

    je cherchais dans excel :)

    merci je vais essayer
    0
  13. Sarl
     
    reBonjour
    merci pour la rapidité de vos réponses :)

    J'ai toujours pas tout compris , desolé et merci de ta patience llermite222
    Range("A1") ca renvoi la valeur qu'il y a dans A1?

    Range("A1").Address(, , xlR1C1) <==== ca je pije toujours pas?
    et plus particulièrement cela : Address(, , xlR1C1)

    De plus :

    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
    LA, LE CHEMIN SEMBLE BON
    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

    je ne comprends pas son dysfonctionnement au niveau de GetValue = ExecuteExcel4Macro (Chemin)

    merci encore
    je teste au fur et a mesure et je prends ds notes, si si si...
    0