Utiliser la fonction "recherche" d'un classeur fermé sur un autre classeur

Bonjour à tous !

Je recherche vivement de l'aide !

J'ai automatisé une fonction recherche avec un boutton sur la feuille en question affichant un Userform et des critères dans un classeur intitulé BaseDeDonnée.

Maintenant je souhaite utiliser cette fonction dans un autre classeur sans le premier pendant la démarche.

Avez-vous une idée ?

Merci de votre aide !

Bonjour,

Il s'agit d'une fonction ou d'une procédure Sub ?

Sur le nouveau classeur, il est normalement possible d'affecter à un bouton la macro de l'autre classeur :

Affecter une Macro/Macros dans : choisir le classeur où se trouve la macro.

Cdlt,

Bonjour,

Je dirais que c'est un SUB car ça me fait un trie dans ma base de donnée (ci-dessous le UserForm en question)

image

Je peux ensuite sélectionner une des ligne et exporter le raccourci dans une case de me feuille.

J'ai bien exporter mon module, ma feuille "recherche" et lié mon bouton à mon UserForm sur mon nouveau classeur. Mais il me manque les quelques lignes qui lient mon nouveau classeur à mon classeur basededonnée. (je rappel que je voudrais que mon classeur BDD soit fermé)

Merci d'avance.

Re,

Manipuler le classeur BDD, s'il est fermé, depuis un autre par macros, je crois que ce n'est pas possible. Il y a d'autres solutions (que je ne connais pas d'ailleurs) mais, à ma connaissance, pas avec des macros.

Je vais attendre d'autres réponses au cas ou!

Merci bien.

Je viens de penser à plusieurs solutions :

- Création d'une macro qui va ouvrir le classeur contenant le feuille BDD en question en arrière plan.

- Importer la feuille BDD du classeur dans mon autre classeur.

Oui, c'est une bonne idée. Je dirais même qu'il faut tout mettre sur un même fichier. Parce qu'avoir un fichier qui sert à manipuler une BDD sur un autre fichier, c'est peut-être pas l'idéal. Sinon, il vaut peut-être mieux recourir à des vraies BDD.

Oui je comprends ton point de vu, cependant les bases de données que j'utilise sont énorme, et si tout est sur le même classeur, celui-ci est vraiment lent. Et ça permettrait aussi que plusieurs opérateurs utilisent les mêmes BDD lors de chiffrages différents chiffrage notamment.

J'ai trouvé un exemple d'import en fouillant sur le site, je test ça.

Sub Import()
'
' Import
'
    MonClasseurActif = ActiveWorkbook.Name 'memorise le classeur actif

    Dim QuelFichier
    QuelFichier = Application.GetOpenFilename("Fichier Excel (*.xls), *.xls", Title:="Sélectionnez le fichier à importer")

    If QuelFichier <> False Then
    Workbooks.Open QuelFichier
    Range("A2").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.Copy
    ActiveWindow.Close

    Windows(MonClasseurActif).Activate
    ActiveSheet.Range("A1").End(xlDown).Offset(1).Select
    ActiveSheet.Paste

    Else
        MsgBox "Vous n'avez pas sélectionné de fichier"
    End If

End Sub

Je ne suis pas sûr que cette macro te serve beaucoup.

En fait, si je comprends bien, ça ne sert à rien d'avoir la macro de recherche sur ton classeur BDD ? Donc tu devrais la rapatrier sur ton classeur exécutant.

Sinon, pour le code, ce serait plutôt comme ça :

Sub private sub commandbutton_click()

on error resume next
set wbdd = workbooks("chemincompletfichierbdd")
if err.number = 9 then
    on error goto 0: err.clear
    set wbdd = workbooks.open("chemincompletfichierbdd")
end if
run wbdd.name & nomdelamacrorecherche, arg1, arg2, ....

End Sub

A noter que tu n'as fourni aucun élément exploitable et que ça rend l'aide difficile, je ne sais pas vraiment ce que tu cherches à faire en fin de compte. Le mieux serait donc de poster cette fameuse macro (recherche ? filtre ? import ?) et de la placer dans ton classeur exécutant, il n'y aurait ensuite qu'à l'adapter pour l'exécuter à partir de ton Userform.

Plusieurs problèmes :

-Je ne trouve que des fichier Excel avec des versions de 2003.

-En essayant d'importer un fichier de 2003 dans mon classeur, j'ai une erreur.

Voici le fichier test pour l'import.

Dans l'attente de ta réponse.

3testimport.xlsm (21.40 Ko)

Je n'avais pas vu ta réponse, je regarde ça.

Il ne faut pas l'importer la BDD, tu as dit qu'elle était trop lourde. Soit tu gardes un seul fichier avec ton userform et la BDD (ce serait le plus simple), mais cette option ne te convient pas, soit tu ouvres le fichier contenant la BDD pour faire tes opérations de recherche et d'importation sélective à partir du fichier contenant l'UF.

Il faut alors rapatrier la macro sur le nouveau fichier car elle ne sert à rien sur le fichier contenant la BDD.

Je viens de te transmettre les fichiers en MP.

Merci d'avance.

Si tu veux bien, je préférerais qu'on reste sur le fil . En fait, j'ai juste besoin du code (je n'aime pas trop ouvrir les fichiers !). Le code fonctionne n'est-ce pas ? Il suffit que tu le postes ici et j'essaierai de l'adapter de manière à ce qu'il marche depuis le nouveau fichier.

Je veux bien copier/coller la totalité mais c'est super long, c'est toi qui voit.

Voici un extrait ou je pense il faut rajouter les ligne pour lié ou plutôt ouvrir et dire dans quelle doc chercher:

Private Sub UserForm_Initialize()
 Me.StartUpPosition = 0
 Me.Top = 255
 Me.Left = 250
 For b = 1 To 35: Set Txt(b).GrSaisie = Me("textbox" & b): Next b
 B_tout_Click
 NbCol = [Tableau1].Columns.Count
 '---- A adapter si évolution
 TabBD = [Tableau1].Resize(, NbCol + 1).Value                 ' On utilise des Array car c'est plus rapide
 For i = 1 To UBound(TabBD): TabBD(i, NbCol + 1) = i: Next i
 ColCombo = Array(1, 2, 3, 4, 5, 6)                                   ' A adapter (1 à 6 colonnes max pour le moment)
 colVisu = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28)   ' Colonnnes  ListBox (à adapter)
 '----

Je pense qu'à chaque fois que j'appel le tableau 1, il faut rajouter une ligne avant expriment dans quelle classeur se rendre, des idées?

Je viens d'essayer ça, mais aucun résultat :

Set Workbook = Workbooks("Base_De_Données_Offi_V2.1.xlsm").Sheets("BD")

Bonjour à tous,

Est-ce que je peux me permettre de proposer une méthode pour lire/filtrer/trier des données provenant d'un classeur externe?

La méthode est du simple Sql.

Voir dans le zip, 3 fichiers démo à dézipper dans un même dossier.

  • Le fichier "Filtre_Sql_sur_usf_18dec2020.xlsm" fonctionne sur lui-même pour lire les données de l'onglet BDD
  • Le fichier "Filtre_Sql_sur_usf_4mars2021.xlsm" ne contient pas de données, il les tire du fichier "BDD.xlsx" de la même façon que précédemment.

A noter le code est en tous points identique dans les 2 fichiers sauf une ligne :

  • Connect_xls ThisWorkbook.FullName ' pour se lire en boucle fermée
  • Connect_xls ThisWorkbook.Path & "\BDD.xlsx" ' pour lire le fichier externe "\BDD.xlsx"

Cette méthode me semble particulièrement adapté si la base de données est conséquente.

C'est une simple démo, il faudra piocher dedans pour adapter au cas exposé.

Le Sql c'est bon, mangez-en

Pierre

Edit du 5mars : suppression des fichiers foireux => voir version du 5mars plus loin dans la discussion

Bonjour Pierre,

Merci pour cette intervention !

Cette méthode permet donc de lire les informations d'un classeur fermé si j'ai bien compris (je n'ai pas encore regardé les fichiers). Ce n'est pas la première fois que je te vois utiliser du sql. A vrai dire, ça m'intéresse mais me parait hors de portée. Est-ce que je pourrais avoir un rapide avant-propos ? Ou plutôt une notice permettant de déchiffrer ?

Merci par avance pour ta réponse.

Cdlt,

Merci Peter pour ce nouvel axe de recherche.

Je me plonge dans l'analyse de suite.

Bonjour à tous,

Pour répondre à la question de 3GB : en fait le Sql c'est pas très compliqué. Le schéma ordinaire c'est :

  • Connexion au fichier (pouvant être du Excel, du Access, du dbf, du MySql, du Oracle, même du csv ou du txt, etc ...)
  • Lecture ou écriture (ou éventuellement suppression)
  • Fermeture de la connexion

Donc il faut un script de connexion, un de lecture et un de fermeture (cf mes exemples de code, j'utilise toujours les mêmes scripts et chacun peut écrire ses scripts perso).

Pour la requête Sql, c'est une chaine de texte utilisant du langage Sql classique (le même qu'on utilise dans Access, ou presque)

Pour ma part j'aime bien placer le résultat de la requête dans un tableau, ça reste très facile à utiliser dans tous les cas => d'où mes 'function' qui retournent des tableaux de variant

Dans cette requête on peut directement lire/filtrer/trier/grouper/sommer/moyenner/ etc ...

Bref c'est puissant, c'est pour ça que PowerQuery est basé sur du Sql. Un publipostage classique depuis Word utilise aussi du Sql (car les scripts sont utilisables aussi depuis les autres appli d'Office ...)

La bonne référence pour le langage Sql => https://sql.sh/cours/select

Un exemple de connexion à des supports différents est à lire dans l'agenda que je propose ici =>

https://www.excel-pratique.com/fr/telechargements/plannings/agenda21-excel-no528

  • cf module 'Sql', procédure 'Connect' pour les connexions diverses
  • et cf module 'Table' pour la structure des données

Il ne reste plus qu'à essayer!

Pierre

Rechercher des sujets similaires à "utiliser fonction recherche classeur ferme"