Liaison externe dynamique

Bonjour,

Je vous expose rapidemment mon problème.

Je cherche une fonction qui me permettrait de visionner une information issu d'un autre fichier excel. En gros, une formule qui aille chercher l'information sur un autre fichier excel (dont le nom comprend des contenu de cellule), le tout dynamisé.

Par exemple :

A1=X

B1=001

la destination du fichier serait C:\memoire\X\001.xslx

et l'information situé sur le document excel à la cellule B1

J'ai déjà essayer les fonctions indirect qui ne marche que quand le fichier est ouvert...

J'ai regardé d'autre post qui portent sur le meme sujet mais aucun n'a la réponse qu'il me faut.

Merci de l'attention que vous me porterez !

Function LireCellule_ClasseurFerme( _
        Chemin As String, _
        Fichier As String, _
        Feuille As String, _
        Cellule As Variant) As Variant

    Application.Volatile

    Dim Source As Object, Rst As Object, ADOCommand As Object
    Dim Cible As String

    Feuille = Feuille & "$"
    Cible = Cellule.Address(0, 0, xlA1, 0) & ":" & _
        Cellule.Address(0, 0, xlA1, 0)

    Set Source = CreateObject("ADODB.Connection")
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Chemin & "\" & Fichier & _
        ";Extended Properties=""Excel 8.0;HDR=No;"";"

    Set ADOCommand = CreateObject("ADODB.Command")
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Cible & "]"
    End With

    Set Rst = CreateObject("ADODB.Recordset")
    '1 = adOpenKeyset, 3 = adLockOptimistic
    Rst.Open ADOCommand, , 1, 3
    Set Rst = Source.Execute("[" & Feuille & Cible & "]")

    LireCellule_ClasseurFerme = Rst(0).Value

    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Function

=LireCellule_ClasseurFerme(A1;A2;A3;B1)

A1

C:\Documents and Settings\mimi\dossier

A2

ClasseurY.xlsx

A3

Feuil1

Si tu veux fixer le nom de la feuille tu peux le faire sur le code.

Si tu veux fixer la variable A2 pour ne pas mettre l'extension tu peux aussi de même pour le début de chemin.

Merci beaucoup de ta réponse aussi rapide !

J'essaye de comprendre un peu et j'essaye ca !

Je te tiens au courant

Bonjour

ou alors on peut ouvrir les deux documents et dans la barre de formule du document cible taper "=" et aller cliquer sur la cellule du document source. cela lies les deux cellules et la valeur de la cellule cible se met a jour même si le document source est fermé.

cela donne dans fichier cible "document B"

cellule A1 "='C:\dossier 1\[document A.xls]feuille 1!'A1

Bonne recherches

EngueEngue a écrit :

[code=vb]

=LireCellule_ClasseurFerme(A1;A2;A3;B1)

A1

C:\Documents and Settings\mimi\dossier

A2

ClasseurY.xlsx

A3

Feuil1

Si tu veux fixer le nom de la feuille tu peux le faire sur le code.

Si tu veux fixer la variable A2 pour ne pas mettre l'extension tu peux aussi de même pour le début de chemin.

La formule doit être de type

=LireCellule_ClasseurFerme(A1;A2;A3;B1)

en A1 je dois rentrer l'addresse de mon fichier, en A2, il s'agit bien de mon nom de document à savoir 001.xlsx,

en revanche pour A3 je comprend pas trop comment inscrire "feuil1" ???

C'est le nom de la feuille ....

Si elle s'appelle "Toto" tu mets en A3 Toto

Bon j'ai essayé d'utiliser la fonction mais rien bien productif...

l'addresse du fichier est du type (pour automatiser le tout) : C:\memoire\A2\B2.xlsx

L'information comme je l'ai dit se situe sur la cellule B1 du fichier secondaire.

Même en essayant avec ta formule, je n'arrive à aucun résultat...

Bonjour,

on peut lier des cellules de deux fichier différents ouvrant les deux fichiers excel, en se mettant dans une cellule du fichier cible. de taper dans la barre de formule "=" (comme une formule) et aller cliquer sur la cellule du fichier source et de valider.

cela donne des syntaxes du genre :

='C:\dossier 1\[document A.xls]feuille 1'!A1

bonnes recherches

C'est ce que j'avais fait dans un premiers temps, mais vu qu'il y aura plusieurs fichiers, il me faut une formule automatique. Les informations qui vont apparaitre changeront en fonction de ce qu'il y aura inscrit dans les cellules de départ

Il faut copier le code dans un module...

C'est bien ce que j'ai fait, mais même en faisait un test la formule m'indique "#valeur!


C'est bien ce que j'ai fait, mais même en faisait un test la formule m'indique "#valeur!

Marche parfait chez moi

Bonjour,

bonjour EnguEngue,

Ton code n'impose-t-il pas une référence particulière dans VBA (library)?

Cdlt.

Non... Il ne veut pas marcher avec les XLSX... Je me penche sur le sujet.


Daniel nous donne la réponse: Merci Daniel:

Function RecupPlage( _
        Chemin As String, _
        Fichier As String, _
        Feuille As String, _
        Cellule As String) As Variant
    If Split(Fichier, ".")(1) = "xls" Then
        RecupPlage = RecupPlage2003(Chemin, Fichier, Feuille, Cellule)
    Else
        RecupPlage = RecupPlage2007(Chemin, Fichier, Feuille, Cellule)
    End If
End Function
Function RecupPlage2007( _
        Chemin As String, _
        Fichier As String, _
        Feuille As String, _
        Cellule As String) As Variant
'ADOExcel2007LirePlage
Dim Rst As New ADODB.Recordset
Dim Cnn As New ADODB.Connection
Dim Requete As String
Dim NbRecord As Long
Cellule = Range(Cellule).Resize(2).Address(0, 0)
With Cnn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & Chemin & "\" & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
    .Open
End With
texte_SQL = "SELECT * FROM [" & Feuille & "$" & Cellule & "]"
Rst.Open texte_SQL, Cnn, adOpenStatic
RecupPlage2007 = Rst(0)
Rst.Close
Cnn.Close
Set Rst = Nothing: Set Cnn = Nothing
End Function
Function RecupPlage2003( _
        Chemin As String, _
        Fichier As String, _
        Feuille As String, _
        Cellule As String) As Variant

    Application.Volatile

    Dim Source As Object, Rst As Object, ADOCommand As Object

    Feuille = Feuille & "$"
    Cellule = Range(Cellule).Resize(2).Address(0, 0)
    Set Source = CreateObject("ADODB.Connection")
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Chemin & "\" & Fichier & _
        ";Extended Properties=""Excel 8.0;HDR=No;"";"

    Set ADOCommand = CreateObject("ADODB.Command")
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
    End With

    Set Rst = CreateObject("ADODB.Recordset")
    '1 = adOpenKeyset, 3 = adLockOptimistic
    Rst.Open ADOCommand, , 1, 3
    Set Rst = Source.Execute("[" & Feuille & Cellule & "]")

    RecupPlage2003 = Rst(0).Value

    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Function

Et pour le code ci dessus, quelle manipulation dois je faire ?

=recupplage(chemin;fichier;feuille;plage)

Bon mon fichier est placé ici : c:\memoire\patate = C1

mon fichier s'appelle "002.xlsx" = C2

la feuille : "donnee" = C3

la cellule B1

Je rentre tout ca en formule, donc sous forme =Recupplage(C1;C2;C3;B1)

J'obtiens toujours le même résultat : "#valeur"

Bonjour,

A tester

Pour 'RecupPlage2007',

Ajoutes la déclaration suivante:

Dim texte_SQL As String

J'ai rajouté la ligne mais toujours rien...

Rechercher des sujets similaires à "liaison externe dynamique"