VBA Lire un classeur fermé avec ADO + INDEX/EQUIV

Bonjour à tous,

étant novice en VBA, je me suis penché sur l'utilisation du langage ADO pour lire des cellules d'un classeur fermé. Mon code marche de manière grossière :

- j'aimerai savoir s'il est possible d'utiliser les fonction INDEX et EQUIV pour saisir l'adresse de la cellule à récupérer.

- et également de se servir de Combox pour se connecter au fichier voulu

Private Sub CommandButton1_Click()

    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    Dim Fichier As String, Cellule As String, Feuille As String

    'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "A4:B4"                                                      'UTILISATION INDEX EQUIV A CE NIVEAU LA

    Feuille = "BDD$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
    'Chemin complet du classeur fermé
    Fichier = "D:\PFE TMH\BDD\REX LOTS\LOTGO.xlsm"                         'UTILISATION ComboBox.Value sachant que ma combobox extrait le nom des                                                                             fichiers du dossier

    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"

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

    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic

    Set Rst = Source.Execute("[" & Feuille & Cellule & "]")

    Range("A1").CopyFromRecordset Rst

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

Merci d'avance

Bonjour,

avec ADO, l'idée est d'utiliser une commande SQL pour retrouver l'info recherchée.

dans ton cas,

Select le nom de la colonne qui contient l'info que tu veux obtenir from 'la feuille' where la colonne qui contient le critère de recherche = le critère recherché

Salutations h2so4

Select le nom de la colonne qui contient l'info que tu veux obtenir from 'la feuille' where la colonne qui contient le critère de recherche = le critère recherché

J'étais très intéressé par ce sujet, alors je viens vous demander votre aide pour indiquer où vous devez ajouter les critères de recherche pour nom de la colonne (dans le code ADO présenté ci-dessus) ?

Merci de votre aide .

bonsoir,

voici un exemple

Sub aarght_testado()
    Excel_DB = "dbtestado.xlsx"    'Identification du classeur adapter le chemin
    Set Connexion = CreateObject("ADODB.Connection")

    With Connexion
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Excel_DB & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With

    ref = InputBox("refeference") 'critere de recherche
    Texte_SQL = "SELECT [quantite] FROM [inventaire$] where [reference]='" & ref & "'"
    Set requete = Connexion.Execute(Texte_SQL)

    If Not requete.EOF Then
        quantite = requete.Fields.Item(0).Value
        MsgBox quantite
    Else
        MsgBox "référence " & ref & " non trouvée"
    End If

End Sub

fichier de test

61dbtestado.xlsx (8.62 Ko)

bonjour h2so4 ,

votre exemple était bon pour rechercher des informations spécifiques dans la colonne .

Je souhaite importer (en même temps) avec la macro ADO (fichier fermé) les informations de colonnes entières et intercalées (avec plus de 3000 lignes) .

par exemple, importez uniquement les colonnes: B, G, P, Z ...

Si vous pouvez inclure des critères de recherche, ce sera encore mieux, mais si vous importez uniquement les colonnes entières et entrecoupées (mentionnées ci-dessus), ce sera déjà d'une grande utilité .

nota: Je ne veux pas importer la feuille entière, juste quelques colonnes entrecoupées .

merci pour votre aide et votre attention .

Bonjour,

ok merci je comprends et me renseigne sur les requêtes SQL, connaissez-vous une requête permettant de réaliser le même travail que la combinaison INDEX/EQUIV ? (trouver une valeur d'une cellule en croisant une ligne et une colonne).

De plus, ta requête InputBox référence demande d'entrer un texte, existe-il une requête du même style mais avec une liste déroulante prédéfinie ?

Description projet :

En fait j'ai une base de données réparties sur plusieurs classeurs Excel, j'ai un code vba propre à chaque classeur qui me permet de chercher une valeur avec la combinaison INDEX/EQUIV et des comboBox pour permettre à l'utilisateur de choisir l'info qu'ils recherchent. J'essaye maintenant d'adapter ce code à un classeur externe, pour pouvoir rechercher sur n'importe quel classeur en fonction du choix de l'utilisateur. Pour cela je me documente sur ADO etc...

Par exemple, est-ce que quelque chose du style et susceptible de marcher ?

Feuille = "BDD$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
    'Chemin complet du classeur fermé
    Fichier = "D:\PFE TMH\BDD\REX LOTS\LOTGO.xlsm"

    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";" 'HDR=NO titre de colonne

    'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "Application.Match(Me.ComboBox2.Value, Range("ListeOpé"), 0)":" Application.Match(Me.ComboBox3.Value, Range("ListeC"), 0)"

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

Avec l'adresse de la cellule à récupérer après la connexion à mon fichier, donc peut-il lire mes Range("ListeOpé") et Range("ListeC") ?

bonjour,

@start, il faudrait que tu ouvres un nouveau message pour ne pas polluer le sujet de Cesar3198

@Cesar3198,

De plus, ta requête InputBox référence demande d'entrer un texte, existe-il une requête du même style mais avec une liste déroulante prédéfinie ?

tu gères l'introduction des paramètres de recherche comme tu veux, ici l'idée était de montrer comment on peut retrouver une info dans une colonne sur base d'une donnée recherchée dans une autre colonne, au moyen d'une instruction SQL, pas de faire tout le programme qui fait la gestion de l'introduction des paramètres.

pour le reste, désolé je ne comprends pas ce que tu essaies de faire. mais pour lire le contenu d'une cellule dans un classeur fermé tu peux procéder ainsi :

Sub aarght_testado()
    Excel_DB = "d:\downloads\dbtestado1.xlsx"    'Identification du classeur
    Set Connexion = CreateObject("ADODB.Connection")
    '--- Connexion ---
    With Connexion
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Excel_DB & ";Extended Properties=""Excel 12.0;HDR=no;"""
        .Open
    End With

    Texte_SQL = "SELECT * FROM [sheet1$E10:E10]"
    contenucelluleE10 = Connexion.Execute(Texte_SQL)

    MsgBox "contenu cellule E10" & contenucelluleE10

End Sub

bonjour,

oui merci j'ai mon code pour lire une cellule dans un classeur fermé, je cherche à savoir si l'on peut utiliser la fonction EQUIV pour déterminer les coordonnées de la cellule à lire. Utiliser une fonction EQUIV me permettrai, par l'intermédiaire de liste déroulante (comboBox), de déterminer n'importe quelle cellule sur mon classeur fermé.

Sachant que cette fonction ne marche pas sur classeur fermé, je ne sais pas si une connexion ADODB suffit... (mes essais pour le moment ne sont pas concluants).

Bonjour,

je pense que le moment est venu que tu mettes tes fichiers et donnes une explication d'un cas précis exemplatif de ce que tu veux obtenir.

Bonjour,

le fichier LOTGO est un des fichiers servant de base de données. La feuille formulaire contient un userform qui à l'aide de INDEX / EQUIV et de comboBox permet de déterminer le ratio voulu par l'utilisateur (La ligne d'en tete du tableau est caché mais renseignée).

Je cherche à utiliser la même méthode mais pour lire sur des classeurs fermés. En me renseignant j'ai cru comprendre que cela peut fonctionner via ADO.

Vous pouvez voir que mon userform contient 2 comboBox, je souhaite en ajouter une troisième pour que l'utilisateur choisisse le classeur dans lequel il faut chercher l'info et donc se connecter.

Est-ce plus clair?

36lotgo.xlsm (44.81 Ko)

Bonjour,

c'est beaucoup plus clair. la manière dont tes données sont organisées dans tes "bdds" ne permettent que difficilement un accès via ADO, Il faut revoir la structure de tes données soit il faut jouer avec des combinaisons d'instructions ADO pour obtenir l'info que tu souhaites. Je ne vois plus d'avantage par rapport à une macro qui ouvrirait le fichier qui convient et qui ferait une recherche via index equiv.

Ok très bien, c'est ce que je voulais éviter mais tant pis je n'ai pas le niveau pour coder ce que je veux aha ! Je vais certainement rester sur mon userform inclus dans chaque classeur !

Merci pour ton aide précieuse et bonne fin de journée

re-bonjour,

rien ne t'empêche d'avoir ton userform dans un seul classeur et d'ouvrir les fichiers qui t'intéressent à partir de macro dans ce classeur

Rechercher des sujets similaires à "vba lire classeur ferme ado index equiv"