Fonction find dans un claseur fermé (Requête OLEDB)

Vorens

XLDnaute Occasionnel
Bonjour au forum !


Je suis en pleine élaboration d'une solution de traitement de données basé sur des fichier Excel.

Pour cela j'utilise des requête SQL afin de récupérer les données dans les différents classeur fermé que je manipule.

Le problème est que je ne parviens pas a trouver un exemple pour effectuer une fonction FIND dans un classeur fermé.

Je cherche à déterminer l’existence d'une en tête de colonne et d'en récupérer l'adresse.

Je répond de suite à la question qui tue et que j'ai vu sur les post similaire :"Pourquoi tu ouvre pas simplement tes classeur pour les manipuler"

Tout simplement pour des questions de performance. mon code manipule une cinquantaine de fichier et chaque requête récurer des dizaine de millier de lignes.

Voici un exemple de mon code pour la récupération des données par requêtes SQL. Ce que je recherche donc est la commande permettant d'effectuer un Find sur un classeur fermer dans l'objectif de déterminer la position de l'information que je souhaite extraire de mon fichier.

Code:
Sub CommandButton1_click()


    Dim Cn As ADODB.Connection
    Dim Fichier As String
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset

'Adresse de la cible

    Dim TargetCol As String
    
    Col = NumCol.Text



'Spécification de la feuille et du range à récupérer

    Feuille = "DB1$"
    Cellule = Col & "1" & ":" & Col & "10"


'Définit le classeur fermé servant de base de données

    Fichier = "C:\Users\Bruno\SkyDrive\Documents\Excel\Solution & Exemple VBA\Requête SQL dans Workbook et écriture dans un second Workbook\EA_Catalog_VPApplicationComponant.xlsx"
    Fichier2 = "C:\Users\Bruno\SkyDrive\Documents\Excel\Solution & Exemple VBA\Requête SQL dans Workbook et écriture dans un second Workbook\EA Catalog.xlsx"

'Nom de la feuille dans le classeur fermé

    NomFeuille = "DB1"
    Set Cn = New ADODB.Connection

'--- Connexion classeur 1 ---

    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
'-----------------
'
'... la requête ...



    Set Rst = Cn.Execute("[" & Feuille & Cellule & "]")
    
    
    
  '--- Connexion classeur 2 ---

    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier2 & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
'-----------------
    
    
    
    
    
    Range("A2").CopyFromRecordset Rst

'--- Fermeture connexion ---

    Cn.Close
    Set Cn = Nothing

End Sub



End Sub

Je fais appel au savoir infinis des membres les plus sages du forum pour parfaire mes connaissances en VBA et particulièrement le domaine des requêtes OLEDB.

Par avec merci pour votre aide


Meilleures salutations

Vorens
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Bonjour Vorens,

Qui dit connexion OLEDB ou ADO dit que tes données résultantes sont considérées comme le résultat d'une interrogation SQL, c'est ce que représente l'objet recordset
L'équivalent d'un "Find" devra donc se faire :
Soit en chargeant toutes les données de la feuille dans ton recordset, puis l'analyser ligne à ligne jusqu'à avoir trouvé la valeur cherchée
Soit en traduisant le filtre de ton Find en SQL pour ne charger que les lignes qui t'intéressent en résultat
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Hello Tototiti2008

Merci pour ta réponse rapide cela me met quelques idées en tête.

je viens tout juste de me mettre a ce type de manipulation. Si j'ai bien compris, je peux récupérer que les colonnes qui m’intéresse en appliquant un filtre sur le Recordset pour n'importe que les colonnes désirées.

Le problème est que je n'ai pas la moindre idée de comment on fait sa. je vais tente de chercher. Si quelqu'un à un exemple entre temps je dit pas non =)

Meilleures salutations
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,


Voila j'ai créé 3 fichier représentant ce que je désire réaliser. Ce sont évidement pas les fichier d'origine qui aurait été trop gros.


Le code est uniquement écrit dans le classeur du nom de "Test_find_SQL" les aute classeur ne doivent pas contenir de code.

L'objectif est de copier les colonnes mapée dans l'onglet "mapping" du classeur "test_find_SQL" du Catalogue 1 dans le Catalogue 2.

On remarque tout de suite que le nombre de colonne mappée est inférieur au nombre de colonne se trouvant dans les catalogues. De plus, la position des colonnes dans le catalogue 1 n'est pas la même que dans le catalogue deux d'ou la question sur la fonction find afin d'en déterminer la position.

Le catalogue 1 et le catalogue 2 doivent rester fermé tout le temps.

Les fichier en pièce jointe.
 

Pièces jointes

  • Catalogue_1.xlsx
    9.6 KB · Affichages: 54
  • Catalogue_2.xlsx
    7.8 KB · Affichages: 39
  • Test_find_SQL.xlsm
    21.5 KB · Affichages: 47
  • Test_find_SQL.xlsm
    21.5 KB · Affichages: 52
  • Test_find_SQL.xlsm
    21.5 KB · Affichages: 49
C

Compte Supprimé 979

Guest
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Salut Vorens
Salut Tototiti2008 ;) (bon courage)

De sérieux problème dans le fichier transmis !?

Une Sub sans End Sub
Un : Col = NumCol.Text sans contrôle "NumCol"
Un : Set Rst = Cn.Execute qui n'est pas formulé comme il faut

Bref .... avant de vouloir utiliser des fonctions avancées, il faut peut-être les étudier un peu ;)

A+
 

tototiti2008

XLDnaute Barbatruc
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Bonjour Bruno :)
Re,

ou peut-être plutôt (chez moi le fichier s'appelle aaa.xls)

Code:
    Set rst = Cn.Execute("select 'GUID', 'ID', 'Model ID ', 'Name', 'Stereotype', 'from', 'To' from `C:\temp\aaa`.`DB1$`")
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,

@Toto

Merci pour la proposition mais le code s'arrête sur cette ligne pour une erreur de syntaxe

Code:
Set Rst = Cn.Execute("select GUID, ID, [Model ID], Name, Stereotype, [from], To from [" & feuille & "]")

@BrunoM45

J'ai dit que ce n'est pas le fichier principale donc certaines variable ne sont pas utilisée dans ses fichier rapidement fait comme Col = Numcoltext qui n'est pas utile pour la question posée.

Le manque d'un end sub résulte d'un mauvais copier / coller

Le set Rst est fonctionnel sur un autre fichier ou le tape la lettre de la colonne qu'il faut importé. C'est justement cette ligne que je cherche a modifier pour les objectif présenté dans la question.

En espérant avoir des réponses plus constructive à l'image de celle de Toto...

Meilleures salutations
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,

A nouveau merci pour cette proposition. Malheureusement chez moi cette ligne ne fonctionne pas non plus c'est étrange.

Code:
 Set Rst = Cn.Execute("select 'GUID', 'ID', 'Model ID ', 'Name', 'Stereotype', 'from', 'To' from `C:\temp\EA_Catalog_VPApplicationComponant.xlsx`")

Peut tu m'envoyer les fichiers avec les quels tu as fais le test ?

Meilleures salutations
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,

En modifiant la ligne j'obtiens un résultat

Code:
Set Rst = Cn.Execute("select 'GUID', 'ID', 'Model ID ', 'Name', 'Stereotype', 'from', 'To'")

Cela m'importe les en-têtes de colonne mais je désire importer les colonne dont les noms sont spécifié ci-dessus.

Savez vous comment il faut s'y prendre ?


Merci de votre aide

Cordialement
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,

Avec la ligne proposée précédemment (sans oublier la feuille) j'obtient le résultat que vous trouverez en pièce jointe.

Le nombre de ligne est correcte mais le contenu représente l'en-tête de colonne.
 

Pièces jointes

  • Résultat.xlsx
    8.9 KB · Affichages: 40
  • Résultat.xlsx
    8.9 KB · Affichages: 43
  • Résultat.xlsx
    8.9 KB · Affichages: 42

tototiti2008

XLDnaute Barbatruc
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,

Oui, il a l'air chatouilleux des apostrophes
ce qui est bizarre, c'est qu'avec une connexion en excel 2003 et le sql proposé ça fonctionne, mais sur 2007 pas...

encore un essai, sur 2007 cette fois ci

Code:
Sub test()


    Dim Cn As ADODB.Connection
    Dim Fichier2 As String
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset


'Définit le classeur fermé servant de base de données

    fichier2 = "C:\temp\Catalogue_1.xlsx"

'Nom de la feuille dans le classeur fermé

    NomFeuille = "DB1$"
    Set Cn = New ADODB.Connection

  '--- Connexion classeur 2 ---

    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & fichier2 & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
'-----------------
   
   
   Set Rst = Cn.Execute("select `REQ$`.`GUID`, `REQ$`.`ID`, `REQ$`.`Model ID `, `REQ$`.`Name`, `REQ$`.`Stereotpe`, `REQ$`.`from`, `REQ$`.`To` FROM `" & fichier2 & "`.`" & NomFeuille & "` `REQ$`")

   
    Range("A2").CopyFromRecordset Rst

'--- Fermeture connexion ---

    Cn.Close
    Set Cn = Nothing

End Sub
 

Vorens

XLDnaute Occasionnel
Re : Fonction find dans un claseur fermé (Requête OLEDB)

Re,


Extraordinaire cela fonctionne ! Je vais pouvoir adapter cette solution et la compléter !

Un très grand mega merci pour ton aide et ta patience. J'aurais une dernière question :)

Comment à tu fait (et surtout ou tu as trouver la doc) pour savoir qu'il faut mettre un REQ$ pour spécifier le nom de l'en-tête de colonne car j'ai rien vu de tel durant mes recherche.

Encore un gros merci !

Meilleures salutations

Vorens
 

Discussions similaires

Statistiques des forums

Discussions
314 630
Messages
2 111 384
Membres
111 118
dernier inscrit
gmc