fonction INDIRECT ne marche pas

mara58

XLDnaute Junior
Bonjour,
Je poste sur le forum 2007 mais le problème que vais décrire existait déjà sous 2000 et 2003:

- Dans un classeur excel nommé ClasseurSource: en A1 est saisie une donnée par exemple 99

- Dans un autre classeur nommé ClasseurLecture en B1 est noté l'adresse du ClassseurSource : 'C:\[ClasseurSource.xlsx]Feuil1'!$A$1
en A1 =INDIRECT(B1)
* A1 est bien égale 99 si ClasseurSource.xlsx est ouvert en même temps.
* si ClasseurSource.xlsx n'est pas ouvert la fonction indirect ne marche pas et en A1 on à la valeur d'erreur : #REF!

J'en conclu que la fonction INDIRECT ne marche toujours pas si le classeur dans lequel on souhaite lire des données n'est pas ouvert.

Si quelqu'un à une soluce, je suis preneur.

J'espère avoir été assez clair dans mes explications.
Cordialement
mara
 

MichelXld

XLDnaute Barbatruc
Re : fonction INDIRECT ne marche pas

bonjour cher Mara58


Non, il n'est toujours pas possible d'appliquer la fonction indirect pour les données externes.


En attendant, tu peux éventuellement utiliser et adapter cette fonction personnelle:

Code:
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


et tu peux insérer ce type de formule dans une cellule
exemple:
=LireCellule_ClasseurFerme(A1;A2;A3;G7)

A1 correspond au chemin:
C:\Documents and Settings\mimi\dossier

A2 correspond au nom du classeur:
ListeCriteres.xls

A3 correspond au nom de la feuille:
Feuil1

G7 correspond à la cellule qui doit être lue dans le classeur fermé



Bonne journée
MichelXld
 

mara58

XLDnaute Junior
Re : fonction INDIRECT ne marche pas

bonjour,
merci pour ton aide, c'est dommage ... peux t-on remonter ce type de disfonctionnement à microsoft ?

Pour la fonction, j'aimerai bien l'utiliser, malheureusement je suis incapable de l'insérer ... j'ai bien l'onglet developpeur ... mais ensuite ?
cordialement
mara
 

mara58

XLDnaute Junior
Re : fonction INDIRECT ne marche pas

Bonjour Michel,
Je te remercie pour ton aide qui va m'être trés utile.
Par contre, je n'arrive à faire fonctionner la fonction.
J'ai peut-être mal crée le module.

Je suis un peu manchot en programation :ne peux tu pas m'aider en me joignant un exemple de fichier... ou me dire ou j'ai fait une erreur:

- j"ai pris développeur/visual basic / insertion/module ensuite j'ai copié collé ta fonction
- une erreur #NOM apparaît

cordialement
mara
 

ManuShazam

XLDnaute Nouveau
Re : fonction INDIRECT ne marche pas

Bonjour,

Je n'ai moi non plus pas réussi à faire fonctionner cette macro de MichelXLD avec un classeur fermé.

La meilleure solution trouvée est sur cette page
VBA - Excel : Lire dans un classeur fermé

Ca consiste a créer un nom défini par macro
Ce nom peut contenir la référence à un chemin ou une plage variable

Il suffit ensuite de faire appel au nom créé pour avoir le résultat même si le classeur source est fermé.

Exemple le + Simple
En cellule B2 de la feuille Cockpit du fichier actif la variable à utiliser dans le nom ou le chemin du fichier (exemple: Semaine13)

Sub ImporterDonneesSansOuvrir()
Dim Chemin As String, Fichier As String, Last_update As String

Last_update = Sheets("Cockpit").Range("B2").Value

Chemin = "C:\Pijaku\CCM\" & Last_update & "\"

Fichier = "Test " & Last_update & ".xlsx"

ThisWorkbook.Names.Add "valeur_cherchee", _
RefersTo:="='" & Chemin & "[" & Fichier & "]Feuil1'!$B$2"

End Sub

Ensuite, dans n'importe quelle cellule du classeur actif, rentrer
=Valeur_cherchee
Le résultat sera repris même si me classeur source C:\Pijaku\CCM\Semaine13\Test Semaine13.xlsx est fermé

Cdlt,
 

Discussions similaires

Statistiques des forums

Discussions
312 331
Messages
2 087 358
Membres
103 528
dernier inscrit
hplus