Manipuler les cellules d'une base de données externes présente sur serveur

Bonjour à tous,

Alors ma problématique est assez complexe et je ne sais pas si cela est possible en VBA mais je vous expose tout ça tout de même :

J'ai un fichier principale où on retrouve toute ma macro.

Je dispose de plus d'une base de données présente dans un dossier lui même présent sur le serveur. Dans ce dossier, plusieurs fichiers Excel comportant une feuille avec d'autres fichiers qui s'ajouteront dans le futur dans ce même dossier. Dans ces feuilles on retrouve une nomenclature qui est différente selon les fichiers mais disposés de la même manière (exemple : dans la colonne A c'est toujours le nom d'un produit, dans la colonne B sa masse,...). A partir de ces fichiers, j'aimerais lancer une fonction qui va me permettre de les analyser sans les ouvrir (du moins, l'utilisateur ne devra pas voir ces fichiers) . Par exemple, j'aimerais que ma fonction soit capable de me dire si dans la colonne A des fichiers du dossier une des cellules a pour valeur "TABLE". Si c'est le cas, j'aimerais alors afficher dans la cellule A1 de mon fichier principale le nom "TABLE" et dans la cellule B1 sa masse associée. Tout cela sans que l'utilisateur s'aperçoivent de la présence des fichiers composant cette base de données. En fait il faudrait je pense une fonction qui puisse ouvrir tous les fichiers du dossiers en arrière plan pour pouvoir ensuite analyser mais je n'ai aucune idée de comment faire ni même si c'est possible de faire cela.

J'ai essayé d'expliquer et de simplifier au mieux et je vous remercie pour le temps que vous prendrez pour me répondre.

Bonsoir à tous,

Il me semble possible d'étudier la piste Power Query (sans VBA).

Connaissez-vous cet outil nativement intégré à Excel depuis 2016 ?

Pouvez-vous mettre à la disposition de la communauté 2 ou 3 classeurs représentatifs et anonymisés de vos fichiers "nomenclature" ?

Le problème c’est que j’ai déjà une très très grosse macro que je fais tourner donc me tourner vers un nouveau logiciel est impensable

Bonjour à tous !

Un nouveau logiciel ? Power Query est un outil intégré à votre Excel.

Mais c'est noté

Il y a sur notre Forum de merveilleux contributeurs qui vous apporteront, très certainement, une solution.

bonjour,

mais je n'ai aucune idée de comment faire ni même si c'est possible de faire cela.

A priori, c'est tout à fait faisable en vba. Pour le reste, je te renvoie aux conseils pour augmenter les chances d'obtenir une réponse. (cfr message : à lire avant de poster, sur ce forum)

Ça marche merci, je vais attendre que quelqu’un puisse m’aider alors 😁

A mon avis tu n'as pas dû (bien) lire le message "à lire avant de poster"

Ah oui je n’avais pas bien compris ! 😁 je vais m’occuper de ça demain et je vous enverrai tout ça

Comme convenu ci-dessous vous retrouverez deux tableaux similaires avec des éléments différents qui les composent. Ils sont présents dans un même dossier et d'autres nomenclatures comme celles-ci le compose. Ce sont des petites nomenclatures car mon fichier serait bien trop lourd sinon. Dans un autre message je vous envoie mon document principal

Et voici le document principal :

Pour rappel, j'ai besoin de savoir si les éléments de ma colonne A existent dans ma base de données et si ils existent j'aimerais que la masse qui lui est associée soit ajoutée à coté de l'élément. De plus, il ne faut pas que l'utilisateur ait accès à la base de données donc il ne faut pas qu'elle s'ouvre devant lui.

Je vous remercie d'avance pour votre aide

bonjour,

voici

Sub aargh()
    Set twb = ThisWorkbook
    Application.ScreenUpdating = False
    rep = "d:\downloads\" ' repertoire contenant les fichiers nomenclature <--- à adapter
    fn = Dir(rep & "nomenclature*.xlsx")
    Do While fn <> ""
        Workbooks.Open rep & fn 'on ouvre tous les fichiers nomenclature du répertoire
        fn = Dir
    Loop
    ' on va rechercher le poids de chaque item dans documentprincipal
    twb.Activate
    With Sheets("feuil1") ' sur la feuil1
        dl = .Cells(Rows.Count, 1).End(xlUp).Row 'nombre de lignes utilisées
        For i = 5 To dl 'on parcourt toutes les lignes utiles
            nom = Trim(.Cells(i, 1)) ' item à rechercher
            For Each wb In Application.Workbooks 'on parcourt tous les fichiers nomenclature ouverts
                If InStr(wb.Name, "nomenclature") > 0 Then
                    Set re = wb.Sheets("feuil1").Range("a:a").Find(nom, lookat:=xlWhole) 'on cherche l'item
                    If Not re Is Nothing Then
                        .Cells(i, 2) = re.Offset(, 1).Value 'si trouvé on copie le poids
                        Exit For
                    End If
                End If
            Next wb
        Next i
        'on a examiné toutes les lignes de documentprincipal
        For Each wb In Application.Workbooks 'on ferme tous les fichiers nomenclature
            If InStr(wb.Name, "nomenclature") > 0 Then
                wb.Close
            End If
        Next wb
    End With
End Sub
Merci h2So4 pour ta réponse qui m'aide beaucoup et qui est très détaillé ! J'ai une petite question par rapport au code, quel est le rôle des lignes suivantes ? J'ai un peu de mal à les comprendre, pour le reste tout est limpide je n'ai plus qu'à le tester sur mon programme !
 fn = Dir(rep & "nomenclature*.xlsx")               'Pourquoi une étoile ? 
    Do While fn <> ""
        Workbooks.Open rep & fn 'on ouvre tous les fichiers nomenclature du répertoire
        fn = Dir                                              'Pourquoi faire l'égalité ?

Le fait de ne pas mettre de majuscule au "N" de nomenclature c'est volontaire ou mettre une majuscule ca ne change rien ? Car mes fichiers ont une majuscule dans le titre (pas là bizarrement)

De même dans la ligne ci-dessous à quoi sert-elle ?

nom = Trim(.Cells(i, 1))

Encore merci pour ton aide je ne pensais pas qu'il était possible d'analyser des fichiers d'un dossier !

J'ai essayé ton code et cela ne me complète pas mon document principal lorsque je lance l'éxécution, est-ce normal ? ou alors c'est parce que j'ai mal recopié l'emplacement du fichier ? Parce que dans ton code une fois que j'ai copié le poids il n'y a pas de lignes de code qui le colle dans mon fichier principal il me semble

bonjour,

le signe = s'il n'est pas dans une instruction de test, est une instruction d'affectation, pas d'égalité.

a=1 signifie mettre la valeur 1 dans la variable a

la fonction dir suivi du nom d'un répertoire et de "nomenclature*.xlsx" donne le nom du premier fichier xlsx, de ce répertoire, qui commence par les caractères "nomenclature". Ce nom est mis dans la variable fn. La commande dir suivante va chercher le nom de fichier suivant qui correspond aux critères donnés dans la commande dir initiale.

Pour le gestionnaire de fichier windows, les majuscules dans les noms de fichiers n'ont pas d'importance. Par contre pour les noms de classeurs dans excel oui, donc je te conseille de mettre la casse qui convient, pour ne pas avoir de souci avec ce code.

enfin Trim permet de supprimer les espaces inutiles. Dans ton fichier principal, table est suivi d'un espace dans ton fichier nomenclature, il n'y a pas d'espace. Cette instruction supprimer cet espace inutile après table et la correspondance entre tes 2 fichiers peut se faire.

Super je comprends mieux maintenant ! j'ai compris l'ensemble des lignes et je te remercie !

En revanche ce qui est étrange c'est que lorsque j'éxécute ma fonction mon document principal ne se complète pas et les masses n'apparaissent pas. Je n'ai aucun message d'erreur au lancement. De ton côté cela fonctionne ? Mon dossier est situé sur mon bureau, voici le chemin mais je ne pense pas qu'il y ait d'erreur car quand j'utilise workbooks.Open() il m'ouvre bien le fichier. (J'ai écrit la fonction dans un module)

rep = "C:\Users\adri\Desktop\Stage\TEST" 

bonjour,

essaie ceci

rep = "C:\Users\adri\Desktop\Stage\TEST\" 

CA FONCTIONNE !

Un immense merci pour ton aide très précieuse. Je commençais à perdre espoir mais là c'est un immense ouf de soulagement. Encore merci !

Rechercher des sujets similaires à "manipuler base donnees externes presente serveur"