Importer des valeurs via un chemin d'accès (renseigné dans MsgBox)

Bonjour à tous,

Voilà mon premier post bien que j'utilise presque quotidiennement le forum, merci !

J'ai un problème que je n'arriva pas résoudre :

J'ai une multitude de tableaux (fichier séparé) qui respecte la même logique/en-tête, seul les valeurs change. Mais les fichiers xls se trouve dans des répertoires différents. (exemple : projet 1 et 2; ils ont une feuille 'BDD' avec le même tableaux mais des valeurs différentes).

-> J'aimerais compiler ces valeurs dans un tableau (fichier ci-dessous) :

  1. L'utilisateur clique sur un bouton pour insérer des données
  2. Une MsgBox apparait et donne la possibilité de renseigner l'emplacement du fichier (= chemin + nom du classeur)
  3. Automatiquement, la macro rajoute une ligne dans le tableau de la feuille 'Données' avec les valeurs contenue dans la feuille 'BDD' du fichier spécifié.
  4. Je peux répéter l'opération
  5. Je peux mettre à jour les données (sauf si autre solution ?) via un bouton.

Cela me permettra de cacluler des moyennes sur touts nos projets, les classer par date, prix, etc...

Ce projet me semble être une montagne insurmontable :p ... Une idée ? Un coup de pouce ?

Bonjour malanZach, bonjour le forum,

Je n'ai pas tout compris :

4. Je peux répéter l'opération... / Cela signifie que les données seront copiées plusieurs fois ?

5. Je peux mettre à jours les données / Cela signifie qui faut ouvrir tous les fichiers ayant servi à élaborer la compilation ?

Dans l'attente de te lire.

Désolé je n'ai pas l'habitude d'écrire mes problèmes excels ^^

4. Je peux intégrer autant de données provenant de fichier différents que je le souhaite, elle seront rajouter à la suite de ma compilation. Une fois le projet 1 intégré, je peux intégrer le 2 via le même bouton puis 5jours plus tard le projet 3. etc... toujours en renseignant uniquement le chemin d'accès :)

5. Si mes données du projet 1 viennent à changer dans le fichier xl du projet 1, seront-elles automatiquement mis à jour dans ma compilation ? Je ne connais pas la solution pour que cela soit automatique, je me dit que cela doit forcément passer par une macro. Si le prix change par exemple dans le projet 1, comment le mettre à jour dans la compilation ?

J'espère être plus clair :p Je ne sais pas si mon projet est réalisable ...

Re,

Il n'y aura toujours qu'une seule ligne par projet ?

Oui et toujours les même en-têtes ! peut-être de nouvelles colonnes avec une nouvelle donnée interessante pour l'analyse mais sinon rien.

Re,

J'ai remplacé ton tableau normal du classeur récap en tableau structuré et pour le premier bouton ça donnerait :

Option Explicit 'oblige à déclarer toutes les variables
Private CD As Workbook 'déclare la variable CD (Classeur Destination)
Private OD As Worksheet 'déclare la variable OD (Onglet Destination)
Private TD As ListObject 'déclare la variable TD (Tableau Destination)
Private CS As Workbook 'déclare la variable CS (Classeur Source)
Private OS As Worksheet 'déclare la variable OS (Onglet Source)
Private TS As ListObject 'déclare la variable TS (Tableau Source)

Private Sub CommandButton1_Click() 'bouton "Nouvelle donnée"
Dim EF As FileDialog 'déclare la variable EF (Explorateur de Fichiers)
Dim F As String 'déclare la variable F (Fichier)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)

ActiveCell.Select 'enlève le focus au bouton
Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("Données") 'définit l'onglet destination OD
Set TD = OD.ListObjects(1) 'définit le tableau destination TD (il n'existait pas au départ)
Set EF = Application.FileDialog(msoFileDialogOpen) 'définit l'explorateur de fichiers EF
EF.AllowMultiSelect = False 'n'autorise la sélection que d'un seul fichier
EF.Show 'affiche EF
If EF.SelectedItems.Count > 0 Then 'condition : si un fichier est sélectionné
    F = EF.SelectedItems(1) 'définit le fichier F
    Set CS = Workbooks.Open(F) 'définit le classeur source CS en l'ouvrant
    Set OS = CS.Worksheets(1) 'définit l'onglet source OS (le premier du classeur source)
    Set TS = OS.ListObjects(1) 'définit le tableau source TS
Else 'sinon
    Exit Sub 'sort de la procédure
End If 'fin de la condition
Set R = TD.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TD)
If R Is Nothing Or TD.ListRows.Count = 0 Then 'si aucune occurrence n'a été trouvée ou si TD ne comporte pas encore de ligne
    TD.ListRows.Add 'ajoute une ligne à TD
    LI = TD.ListRows.Count 'définit la lignes LI (dernière ligne de TD)
Else 'sinon (au moins une occurrence trouvée)
    LI = R.Row - TD.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-tête de TD)
End If 'fin de la condition
TD.DataBodyRange(LI, 1) = F 'renvoie le nom du fichier et son chemin d'accès dans la ligne LI colonne 1 de TD
'renvoie les données de la ligne 1 de TS dans la ligne LI colonne 2 de TD
TD.DataBodyRange(LI, 2).Resize(1, 29).Value = TS.DataBodyRange(1, 1).Resize(1, 29).Value
CS.Close False 'ferme le classeur source sans enregistrer
CD.Save 'sauve le classeur destination
End Sub

La suite au prochain message...

Re,

Pour le second bouton :

Private Sub CommandButton2_Click() 'bouton "Mettre a jours les données
Dim I As Integer 'déclare la variable I (Incrément)

Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("Données") 'définit longlet destination OD
Set TD = OD.ListObjects(1) 'définit le tableau destination TD (il n'existait pas au départ)

For I = 1 To TD.ListRows.Count
    Set CS = Workbooks.Open(TD.DataBodyRange(I, 1).Value) 'définit la classeur source CS en l'ouvrant
    Set OS = CS.Worksheets(1) 'définit l'onglet source OS
    Set TS = OS.ListObjects(1) 'définit le tableau source TS
    'renvoie les données de la ligne 1 de TS dans la ligne LI colonne 2 de TD
    TD.DataBodyRange(I, 2).Resize(1, 29).Value = TS.DataBodyRange(1, 1).Resize(1, 29).Value
    CS.Close False 'ferme le classeur source sans enregistrer
Next I 'prochaine ligne de la boucle
MsgBox "Mise à jour effectuée !" 'message
CD.Save 'sauve le claseeru destination
End Sub

C'est juste dingue ! Je ne sais même pas comment tu as pu faire cela si rapidement !

Je doit encore tester le deuxième bouton, mais je prends plus de temps pour comprendre les macros qu'il t'en as fallu pour les écrir je crois

Merci vraiment !

Je relance ce sujet.

Suite à une modification, nous avons dans nos tableaux sources plusieurs valeurs issues de tableaux externes. C'est donc systèmatiquement que la macro me demande de "Mettre à jour les liaisons" (oui ou non dans une boite de dialogue). En fouillant sur le forum, j'ai trouvé ce topics (https://forum.excel-pratique.com/excel/vba-eviter-le-message-mettre-a-jour-les-liaisons-t40337.html) qui traite du sujet. Mais je n'arrive pas à intégrer le code UpdateLinks:=False

En effet, la fonction woorbooks est intégré à une variable, où dois-je alors intégrer la consigne de "ne pas mettre à jour les données" ?

"Nous ne souhaitons jamais mettre à jour ces données car trop complexe pour nos ordinateurs de mettre à jour toutes les données externes de tous les tableaux :p )

Code en l'état :

Sub Import_donnees() 'bouton "Nouvelle donnée"
Dim EF As FileDialog 'déclare la variable EF (Explorateur de Fichiers)
Dim F As String 'déclare la variable F (Fichier)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)

ActiveCell.Select 'enlève le focus au bouton
Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("BDD") 'définit l'onglet destination OD
Set TD = OD.ListObjects(1) 'définit le tableau destination TD
Set EF = Application.FileDialog(msoFileDialogOpen) 'définit l'explorateur de fichiers EF
EF.AllowMultiSelect = False 'n'autorise la sélection que d'un seul fichier
EF.Show 'affiche EF
If EF.SelectedItems.Count > 0 Then 'condition : si un fichier est sélectionné
    F = EF.SelectedItems(1) 'définit le fichier F
    Set CS = Workbooks.Open(F) 'définit le classeur source CS en l'ouvrant
    Set OS = CS.Worksheets(1) 'définit l'onglet source OS (le premier du classeur source)
    Set TS = OS.ListObjects(1) 'définit le tableau source TS
Else 'sinon
    Exit Sub 'sort de la procédure
End If 'fin de la condition
Set R = TD.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TD)
If R Is Nothing Or TD.ListRows.Count = 0 Then 'si aucune occurrence n'a été trouvée ou si TD ne comporte pas encore de ligne
    TD.ListRows.Add 'ajoute une ligne à TD
    LI = TD.ListRows.Count 'définit la lignes LI (dernière ligne de TD)
Else 'sinon (au moins une occurrence trouvée)
    LI = R.Row - TD.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-tête de TD)
End If 'fin de la condition
TD.DataBodyRange(LI, 1) = F 'renvoie le nom du fichier et son chemin d'accès dans la ligne LI colonne 1 de TD
'renvoie les données de la ligne 1 de TS dans la ligne LI colonne 2 de TD
TD.DataBodyRange(LI, 3).Resize(1, 87).Value = TS.DataBodyRange(1, 1).Resize(1, 87).Value
CS.Close False 'ferme le classeur source sans enregistrer
CD.Save 'sauve le classeur destination
End Sub
Rechercher des sujets similaires à "importer valeurs via chemin acces renseigne msgbox"