Récupération de données

Bonjour à tous,

N'ayant aucune compétence en VBA, je me permets de vous solliciter pour le problème suivant :

j'ai un fichier excel "source" qui provient de l'export d'un ERP.

Lors de l'export, le nombre de feuille peut varier selon la demande de l'utilisateur.

Le point positif est que dans ce fichier "source", les données à récupérer sont toujours dans les mêmes cellules, quelque soit le nombre de feuilles générées.

Mon idée serait de mettre dans le fichier "destination", sur une feuille dédiée à l'import, les indications suivantes :

  • en première ligne : la référence de la cellule à récupérer dans le fichier "source" (ligne qui sera masquée par la suite)
  • en deuxième ligne, le libellé que je souhaite attribuer à cette colonne

Ce principe permettrait de ne pas être limité avec le nombre de cellules à récupérer pour anticiper toute nouvelle demande ultérieure.

Y-a-t-il moyen, à traver une macro, de "lire" le fichier "source", nonobstant le nombre variant de feuilles et de "récupérer" les valeurs des cellules selon l'emplacemeent défini (rappel : nombre de références à récupérer" non figé) ?

D'avance merci pour vos idées, conseils et implication.

Bonne journée

Bonjour,

Tout à fait possible et pas très complexe à mettre en oeuvre.

As-tu un exemple anonymisé d'un fichier source ? avec a minima 2 onglets. Les données sont-elles structurées en tableau ?

Et également la structure de ton fichier destination tel que tu l'imagines. Y a t-il une seule zone concernée ou plusieurs ?

Bonjour et merci pour votre rapidité.

Vous trouverez ci-joint les 2 fichiers d'exemples de données et récupération.

Si vous pouvez créer la macro, pourriez-vous l'annoter (ou me préciser) où je dois modifier le nom :

  • du fichier "source" (le chemin d'accès sera le même que le fichier de récupération pour simplifier (un peu j'espère) le traitement.
  • de la feuille sur laquelle seront récupérer les données ainsi que le 1er champ concerné par une donnée récupérée
(je ne connais pas à aujourd'hui le schéma final de la feuille du fichier "récupération".

Dès à présent, merci.

Bonne soirée

9recup.xlsx (8.11 Ko)
15source.xlsx (8.63 Ko)

Doit-on conserver un lien actif avec le fichier source ?

Proposition avec recopie sans lien des données :

Option Explicit
Sub importer()
Dim NomFichier As Variant, wkb As Workbook, wks As Worksheet, ligne%, colonne%

With ActiveSheet
    .Range("A1").CurrentRegion.Offset(2, 0).ClearContents
    ligne = 3

    NomFichier = Application.GetOpenFilename("Classeurs Excel(*.xlsx),*.xlsx)")
    If NomFichier = False Then Exit Sub
    Workbooks.Open Filename:=NomFichier
    NomFichier = Dir(NomFichier)
    Set wkb = Workbooks(NomFichier)
    For Each wks In wkb.Sheets
        .Cells(ligne, 1) = wks.Name
        For colonne = 2 To .Cells(1, Columns.Count).End(xlToLeft).Column
            .Cells(ligne, colonne).FormulaLocal = "='[" & NomFichier & "]" & .Cells(ligne, 1) & "'!" & .Cells(1, colonne)
            .Cells(ligne, colonne).Formula = .Cells(ligne, colonne).Value
        Next
        ligne = ligne + 1
    Next
    Workbooks(NomFichier).Close
End With

End Sub
11recup.xlsm (18.13 Ko)

Bonjour et merci pour votre fichier.

J'ai modifié dans la macro, le nom du fichier comme indiqué ci-dessous

NomFichier = Application.GetOpenFilename("Mois-Cumul par rayon.xlsx")

Est-ce correct ou dois-je indiquer le chemin complet ?

Encore merci.

Bonne journée

Bonjour

J'ai le même cas mais je suis obligé de copier le fichier source vers une feuille (BD_CLMT) de fichier récup et puis importer les données vers la feuille CLMT.

comme puis je faire pour éviter le copier coller et importer directement à partir du fichier le fichier .

je vous donne la macro que j'utilise (dans l'opération copier/coller) et aussi le fichier se trouve dans le répertoire D:\AUDIT\Compta

Sub Importer_base_CLMT()
Dim col1%, col2%, a, ub%, util, d As Object, i&, tablo, resu(), j%, v As Variant, n&
col1 = 1: col2 = 6 'à adapter
a = Array(2, 3, 4, 6, 7, 8, 10, 11, 12) 'numéros des colonnes à copier
ub = UBound(a)
'---mémorise les utilisateurs---
util = Sheets("Utilisateurs").[A4].CurrentRegion.Resize(, 2)
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(util)
    d(UCase(util(i, 1)) & Chr(1) & util(i, 2)) = ""
Next i
'---tableau des résultats---
tablo = Sheets("BD_CLMT").[A1].CurrentRegion.Resize(, a(ub))
ReDim resu(UBound(tablo), ub) 'base 0
For i = 2 To UBound(tablo)
    If d.exists(UCase(tablo(i, col1)) & Chr(1) & tablo(i, col2)) Then
        For j = 0 To ub
            v = tablo(i, a(j))
            If IsNumeric(v) Then resu(n, j) = CDbl(v) Else resu(n, j) = v
        Next j
        n = n + 1
    End If
Next i
'---restitution---
With Sheets("CLMT")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    If n Then .Cells(.Rows.Count, 4).End(xlUp)(2).Resize(n, ub + 1) = resu
End With
'---RAZ---
With Sheets("BD_CLMT")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    .[A1].CurrentRegion.Offset(1).Delete xlUp
End With
End Sub

Merci

NomFichier = Application.GetOpenFilename("Mois-Cumul par rayon.xlsx")

Dans ce cas ce n'est pas la peine de faire appel à Application.GetOpenFilename

Mets directement le nom du fichier avec son chemin complet.

J'ai le même cas mais je suis obligé de copier le fichier source vers une feuille (BD_CLMT) de fichier récup et puis importer les données vers la feuille CLMT.

comme puis je faire pour éviter le copier coller et importer directement à partir du fichier le fichier .

Bonjour anasimo

C'est pas mal de rebondir, mais d'un autre côté n'hésite pas à ouvrir un autre post (car quand quelqu'un prend la main d'autres contributeurs potentiels passent leur chemin ... et dans le cas présent je ne suis pas sûr d'être très dispo dans l'immédiat (sauf la nuit !)).

En tous cas un bout de fichier serait bienvenu, surtout que la macro que tu as postée est assez complexe avec appel à l'outil dictionnaire.

Bonjour anasimo

C'est pas mal de rebondir, mais d'un autre côté n'hésite pas à ouvrir un autre post (car quand quelqu'un prend la main d'autres contributeurs potentiels passent leur chemin ... et dans le cas présent je ne suis pas sûr d'être très dispo dans l'immédiat (sauf la nuit !)).

En tous cas un bout de fichier serait bienvenu, surtout que la macro que tu as postée est assez complexe avec appel à l'outil dictionnaire.

voila j'ai ouvert une nouvelle discussion

https://forum.excel-pratique.com/viewtopic.php?f=2&t=131669

Merci

Bonjour

Après tests et vu que plusieurs utilisateurs vont utiliser cette macro, il est préférable que chacun donne son chemin d'accès au fichier source, chacun ayant des pratiques personnelles qu'on n'arrive pas toujours à modifier.

Encore merci pour la réponse et surtout la rapidité de celle-ci.

Bonne journée

Parfait !

Bonjour,

Je suis désolé mais au contrôle du fichier source (réel), il s'avère que les champs ne sont pas forcément dans la même ligne d'une feuille à l'autre.

Le seu repère est le libellé de la ligne (qui se trouve en colonne B) et la colonne.

Y-a-t-il moyen à ce que la macro recherche le libellé (qui sera mis à la place du n° de ligne ? (quitte à mettre la colonne et le libellé à part sur la feuille que vous avez transmis avec la macro).

A nouveau, désolé et merci pour votre réponse.

Bonne journée

Cela veut dire que les zones de ton exemple

b2 d14 e4 c5 f14

ne sont pas toujours celles-ci ? mais elles peuvent varier en ligne et colonne ?

Oui il est possible d'en chercher la position puisqu'on ouvre le fichier source.

Peux-tu mettre un exemple "bidon" avec le fameux repère que je ne fasse pas fausse route.

Bonsoir

N'ayant accès à un PC pour l'instant, je ne peux fournir de fichier d'exemple.

Les lignes peuvent varier mais pas les colonnes, pour l'instant.

Afin de palier aux futurs mises à jour du fichier source, est-il possible de déclarer sur le fichier destination par exemple en

Ligne 1: le libellé de la ligne à rechercher

Ligne 2 : le libellé de l'entête de colonne à rechercher? Ou vice-versa

En complément d'information, je sais que la colonne A ne contient rien mais ne suis plus certain si les entêtes de colonnes sont en ligne 1.

Merci d'avance pour l'implication.

Bonne soirée

Bonjour,

Comme demané, ci-joint 2 fichiers (source et destination) pour exemple.

D'avance merci.

Bonne journée

2destination.xlsx (8.68 Ko)
6source.xlsx (9.08 Ko)

A vérifier quand même !

Option Explicit
Sub importer()
Dim NomFichier As Variant, wkb As Workbook, wks As Worksheet, ligne%, colonne%
Dim celR As Range, celC As Range, i%, nb%
With ActiveSheet
    .Range("A1").CurrentRegion.Offset(2, 0).ClearContents
    ligne = 3
    nb = .Cells(1, Columns.Count).End(xlToLeft).Column
    NomFichier = Application.GetOpenFilename("Classeurs Excel(*.xlsx),*.xlsx)")
    If NomFichier = False Then Exit Sub
    Workbooks.Open Filename:=NomFichier
    NomFichier = Dir(NomFichier)
    Set wkb = Workbooks(NomFichier)
    For Each wks In wkb.Sheets
        .Cells(ligne, 1) = wks.Name
        For i = 2 To nb
            Set celC = wks.UsedRange.Find(what:=.Cells(1, i).Value)
            Set celR = wks.UsedRange.Find(what:=.Cells(2, i).Value)
            If Not celR Is Nothing And Not celC Is Nothing Then
                .Cells(ligne, i).Value = Cells(celR.Row, celC.Column).Value
            End If
        Next
        ligne = ligne + 1
    Next
    Workbooks(NomFichier).Close
End With
End Sub
3destination.xlsm (18.33 Ko)

Bonjour

Après comquentrôle, il semble manquer des éléments.

Dans le fichier joint, en feuille 4 et surligné, se trouvent les résultats attendus selon les infos colonne/ligne.

Attention, volontairement, je n'ai pas gardé le même ordre des colonnes (le problème vient peut-être de là).

Merci d'avance pour votre contribution.

Cordialement

1destination.xlsm (18.19 Ko)

Ah ok, j'avais interprété la demande comme initialement (les paramètres étaient sous la forme d'une combinaison de lignes et colonnes b2 d14 e4 c5 f14), à savoir mettre sous les 2 paramètres dissociés LA valeur de chaque feuille.

Il faut donc croiser en fait les x paramètres ligne avec les y paramètres colonne pour chaque feuille, x et y pouvant être différents.

J'ai donc mis ces paramètres dans une feuille séparée.

Ils sont repris dans l'ordre dans lequel ils sont définis.

Option Explicit
Sub importer()
Dim NomFichier As Variant, wkb As Workbook, wks As Worksheet, ligne%, colonne%, param As Worksheet
Dim celR As Range, celC As Range, i%, j%, nbR%, nbC%

Set param = Sheets("paramètres")
nbC = param.Cells(1, Columns.Count).End(xlToLeft).Column
nbR = param.Cells(2, Columns.Count).End(xlToLeft).Column

With ActiveSheet
    .UsedRange.ClearContents
    ligne = 1

    NomFichier = Application.GetOpenFilename("Classeurs Excel(*.xlsx),*.xlsx)")
    If NomFichier = False Then Exit Sub
    Workbooks.Open Filename:=NomFichier
    NomFichier = Dir(NomFichier)
    Set wkb = Workbooks(NomFichier)

    For i = 2 To nbC
        .Cells(ligne, i + 1) = param.Cells(1, i).Value
    Next
    ligne = ligne + 1

    For Each wks In wkb.Sheets
        For j = 2 To nbR
            .Cells(ligne, 1) = wks.Name
            .Cells(ligne, 2) = param.Cells(2, j)
            For i = 2 To nbC
                Set celC = wks.UsedRange.Find(what:=param.Cells(1, i).Value)
                Set celR = wks.UsedRange.Find(what:=param.Cells(2, j).Value)
                If Not celR Is Nothing And Not celC Is Nothing Then
                    .Cells(ligne, i + 1).Value = Cells(celR.Row, celC.Column).Value
                End If
            Next
            ligne = ligne + 1
        Next
    Next

    Workbooks(NomFichier).Close
End With

End Sub
4destination.xlsm (20.64 Ko)

Bonjour et merci,

J'ai testé votre macro sur le fichier source et elle fonctionne.

En voulant l'adapter au fichier réel, je rencontre 2 problèmes :

- chaque feuille concerne une agence précise et son nom se trouve en cellule B11 (sans entê de colonne et sans libellé de ligne).

- La plupart des libellés des colonnes sont "doublés" (C.A. du mois et C.A. cumulé) comme dans l'exemple ci-joint; La différence est affichée par la cellule juste au-dessus mais qui est fusionnée sur plusieurs colonnes (je n'étais pas assez attentif à la structure du fichier source réel qui provient, comme indiqué dans mon premier message, d'un ERP métier et dont la production du fichier n'est pas modifiable).

Cordialement

4source.xlsx (9.60 Ko)

Bonsoir

En complément de mon message précédent et afin de palier aux différents positionnements des colonnes (les lignes n'étant pas doublées), une piste serait de rajouter une ligne dans la feuille paramètres où se trouvent déjà les libellés des colonnes et lignes à rechercher dans laquelle j'indique la lettre ou le numéro de la colonne.

Si à travers la macro on peut tester ces 3 informations le résultat devrait être correct.

Comme indiqué, n'ayant pas de compétences vba je ne sais si c'est réalisable ou s'il n'y a pas une solution autre.

D'avance merci pour votre prise en charge.

Cordialement

Rechercher des sujets similaires à "recuperation donnees"