Extraire une ou plusieurs lignes d'une feuille d'un classeur fermé

6 réponses
Avatar
Nemroth
Bonjour,

Je voudrais, plutôt en utilisant ADO et les requêtes SQL en VBA,
récupérer à partir de Word une ou plusieurs lignes d'une feuille d'un
classeur Excel fermé. La recherche serait basée sur la valeur de la
cellule située en colonne A de chaque ligne, valeur non sensible à la
casse. Si une même valeur est présente sur plusieurs lignes, chaque
ligne serait récupérée.

Pourriez-vous m'indiquer comment faire (exemples de code très appréciés
... ) ?

Merci par avance

6 réponses

Avatar
Tschuß
On 18 août, 13:22, Nemroth wrote:
Bonjour,

Je voudrais, plutôt en utilisant ADO et les requêtes SQL en VBA,
récupérer à partir de Word une ou plusieurs lignes d'une feuille d' un
classeur Excel fermé. La recherche serait basée sur la valeur de la
cellule située en colonne A de chaque ligne, valeur non sensible à la
casse. Si une même valeur est présente sur plusieurs lignes, chaque
ligne serait récupérée.

Pourriez-vous m'indiquer comment faire (exemples de code très appréci és
... ) ?

Merci par avance



J'ai ce bout de code là qui s'insère en tant que fonction si ça peut
t'aider
'-------------------------------------------------------------------------- --
'
'Fonction qui va récupérer la valeur d'une cellule d'un classeur sans
l'ouvrir
'
'-------------------------------------------------------------------------- --

Function GetValue(Rep_travail, classeur_courant, Feuille_lue,
Adr_cellule)

Dim Arg As Variant

'Vérie l'existence du fichier, ajoute les séparateurs manquants
If Right(Rep_travail, 1) <> "" Then Rep_travail = Rep_travail &
""
If Dir(Rep_travail & classeur_courant) = "" Then
GetValue = "Classeur Inexistant"
Exit Function
End If

Arg = "'" & Rep_travail & "[" & classeur_courant & "]" &
Feuille_lue & "'!" & Range(Adr_cellule) _
.Range("A1").Address(, , xlR1C1)

'Exécute la macro XLM
GetValue = ExecuteExcel4Macro(Arg)

If IsError(GetValue) Then
GetValue = "0"
End If

End Function
Avatar
Nemroth
Merci Tschuß pour ta réponse, mais celà ne m'aide pas vraiment.
Pour ce qui concerne l'existence du classeur, pas besoin en ce qui me
concerne de la vérifier. De plus, je souhaite travailler avec ADO et un
classeur fermé (plutôt que d'en ouvrir un et donc attendre le démarrage
d'Excel et le chargement du fichier, cacher Excel, etc...).
Mon tableau Excel est sous forme base de donnée (1ère ligne d'en-têtes
puis les lignes de données). Donc à priori, c'est plutôt la séquence de
requêtes SQL (SELECT, FROM, WHERE, ...) nécessaire pour récupérer dans
des variables ou une structure le contenu de la ou des lignes qui me
manque le plus.

Tschuß a écrit :
On 18 août, 13:22, Nemroth wrote:
Bonjour,

Je voudrais, plutôt en utilisant ADO et les requêtes SQL en VBA,
récupérer à partir de Word une ou plusieurs lignes d'une feuille d'un
classeur Excel fermé. La recherche serait basée sur la valeur de la
cellule située en colonne A de chaque ligne, valeur non sensible à la
casse. Si une même valeur est présente sur plusieurs lignes, chaque
ligne serait récupérée.

Pourriez-vous m'indiquer comment faire (exemples de code très appréciés
... ) ?

Merci par avance



J'ai ce bout de code là qui s'insère en tant que fonction si ça peut
t'aider
'----------------------------------------------------------------------------
'
'Fonction qui va récupérer la valeur d'une cellule d'un classeur sans
l'ouvrir
'
'----------------------------------------------------------------------------

Function GetValue(Rep_travail, classeur_courant, Feuille_lue,
Adr_cellule)

Dim Arg As Variant

'Vérie l'existence du fichier, ajoute les séparateurs manquants
If Right(Rep_travail, 1) <> "" Then Rep_travail = Rep_travail &
""
If Dir(Rep_travail & classeur_courant) = "" Then
GetValue = "Classeur Inexistant"
Exit Function
End If

Arg = "'" & Rep_travail & "[" & classeur_courant & "]" &
Feuille_lue & "'!" & Range(Adr_cellule) _
.Range("A1").Address(, , xlR1C1)

'Exécute la macro XLM
GetValue = ExecuteExcel4Macro(Arg)

If IsError(GetValue) Then
GetValue = "0"
End If

End Function


Avatar
FS
Bonjour,

As-tu été fouiner par là :

http://frederic.sigonneau.free.fr/Ado.htm

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Nemroth a écrit :
Merci Tschuß pour ta réponse, mais celà ne m'aide pas vraiment.
Pour ce qui concerne l'existence du classeur, pas besoin en ce qui me
concerne de la vérifier. De plus, je souhaite travailler avec ADO et un
classeur fermé (plutôt que d'en ouvrir un et donc attendre le démarrage
d'Excel et le chargement du fichier, cacher Excel, etc...).
Mon tableau Excel est sous forme base de donnée (1ère ligne d'en-têtes
puis les lignes de données). Donc à priori, c'est plutôt la séquence de
requêtes SQL (SELECT, FROM, WHERE, ...) nécessaire pour récupérer dans
des variables ou une structure le contenu de la ou des lignes qui me
manque le plus.

Tschuß a écrit :
On 18 août, 13:22, Nemroth wrote:
Bonjour,

Je voudrais, plutôt en utilisant ADO et les requêtes SQL en VBA,
récupérer à partir de Word une ou plusieurs lignes d'une feuille d'un
classeur Excel fermé. La recherche serait basée sur la valeur de la
cellule située en colonne A de chaque ligne, valeur non sensible à la
casse. Si une même valeur est présente sur plusieurs lignes, chaque
ligne serait récupérée.

Pourriez-vous m'indiquer comment faire (exemples de code très appréciés
... ) ?

Merci par avance



J'ai ce bout de code là qui s'insère en tant que fonction si ça peut
t'aider
'----------------------------------------------------------------------------

'
'Fonction qui va récupérer la valeur d'une cellule d'un classeur sans
l'ouvrir
'
'----------------------------------------------------------------------------


Function GetValue(Rep_travail, classeur_courant, Feuille_lue,
Adr_cellule)

Dim Arg As Variant

'Vérie l'existence du fichier, ajoute les séparateurs manquants
If Right(Rep_travail, 1) <> "" Then Rep_travail = Rep_travail &
""
If Dir(Rep_travail & classeur_courant) = "" Then
GetValue = "Classeur Inexistant"
Exit Function
End If

Arg = "'" & Rep_travail & "[" & classeur_courant & "]" &
Feuille_lue & "'!" & Range(Adr_cellule) _
.Range("A1").Address(, , xlR1C1)

'Exécute la macro XLM
GetValue = ExecuteExcel4Macro(Arg)

If IsError(GetValue) Then
GetValue = "0"
End If

End Function




Avatar
MichDenis
Bonjour,

Tu dois charger la référence suivante dans la fenêtre de
l'éditeur de code de Word :
"Microsoft Activex Data Object 2.8 librairy"

J'ai supposé que les données étaient sur la "Feuil2" du classeur.

Afin d'extraire facilement seulement les lignes dont les données
du champ en colonne A est présent plus d'une fois, si ces données
en colonne A ne sont pas des valeurs numériques, ajoute une
colonne(champ) avec une formule de ce type : =NB.SI($A$2:$A$10;A2)
Dans mon Exemple ce champ, je l'ai nommé NB.
(tu peux masquer cette colonne si tu le désires.

Le nom des 2 champs de la requête : Nom et NB

Il ne te reste plus qu'à trouver comment copier le contenu
dans ton application Word à l'endroit désiré.
'-------------------------------------
Sub MaRequête()

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Fichier As String, Tblo

'À définir
Fichier = "c:UsersDMDocumentsClasseur1.xls"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'2 façons d'écrire la requête
'Utilisation du nom de la plage nommée "Données"
Requete = "SELECT Nom From Données Where Nb > 2"

'Utilisation du nom de la feuille où se trouve les données
Requete = "SELECT Nom From [Feuil2$] Where Nb > 2"

Rst.Open Requete, Conn, adOpenKeyset, adLockOptimistic

Tblo = Rst.GetRows

'Insertion du contenu du tableau (array) tblo
'dans ton document Word
'ton code ici

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Sub
'-------------------------------------




"Nemroth" a écrit dans le message de groupe de discussion :
4a8a8f0d$0$416$
Bonjour,

Je voudrais, plutôt en utilisant ADO et les requêtes SQL en VBA,
récupérer à partir de Word une ou plusieurs lignes d'une feuille d'un
classeur Excel fermé. La recherche serait basée sur la valeur de la
cellule située en colonne A de chaque ligne, valeur non sensible à la
casse. Si une même valeur est présente sur plusieurs lignes, chaque
ligne serait récupérée.

Pourriez-vous m'indiquer comment faire (exemples de code très appréciés
... ) ?

Merci par avance
Avatar
Nemroth
Merci FS. Je ne connaissais pas et je vais étudier celà de près.

FS a écrit :
Bonjour,

As-tu été fouiner par là :

http://frederic.sigonneau.free.fr/Ado.htm

FS


Avatar
Nemroth
Merci MichDenis,
En combinant ton information avec celle que m'a donné FS, je vais
essayer de trouver la solution à mon problème. Si ce n'est pas le cas je
reviendrai vers vous. Si je trouve, je publierai ma solution.

MichDenis a écrit :
Bonjour,

Tu dois charger la référence suivante dans la fenêtre de
l'éditeur de code de Word :
"Microsoft Activex Data Object 2.8 librairy"

J'ai supposé que les données étaient sur la "Feuil2" du classeur.

Afin d'extraire facilement seulement les lignes dont les données
du champ en colonne A est présent plus d'une fois, si ces données
en colonne A ne sont pas des valeurs numériques, ajoute une
colonne(champ) avec une formule de ce type : =NB.SI($A$2:$A$10;A2)
Dans mon Exemple ce champ, je l'ai nommé NB.
(tu peux masquer cette colonne si tu le désires.

Le nom des 2 champs de la requête : Nom et NB

Il ne te reste plus qu'à trouver comment copier le contenu
dans ton application Word à l'endroit désiré.
'-------------------------------------
Sub MaRequête()

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Fichier As String, Tblo

'À définir
Fichier = "c:UsersDMDocumentsClasseur1.xls"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

'2 façons d'écrire la requête
'Utilisation du nom de la plage nommée "Données"
Requete = "SELECT Nom From Données Where Nb > 2"

'Utilisation du nom de la feuille où se trouve les données
Requete = "SELECT Nom From [Feuil2$] Where Nb > 2"

Rst.Open Requete, Conn, adOpenKeyset, adLockOptimistic

Tblo = Rst.GetRows

'Insertion du contenu du tableau (array) tblo
'dans ton document Word
'ton code ici

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Sub
'-------------------------------------




"Nemroth" a écrit dans le message de groupe de discussion :
4a8a8f0d$0$416$
Bonjour,

Je voudrais, plutôt en utilisant ADO et les requêtes SQL en VBA,
récupérer à partir de Word une ou plusieurs lignes d'une feuille d'un
classeur Excel fermé. La recherche serait basée sur la valeur de la
cellule située en colonne A de chaque ligne, valeur non sensible à la
casse. Si une même valeur est présente sur plusieurs lignes, chaque
ligne serait récupérée.

Pourriez-vous m'indiquer comment faire (exemples de code très appréciés
... ) ?

Merci par avance