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
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?
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