Récupération de données

J'ai plusieurs fois procédé aussi de cette façon en donnant un modèle aux différents secteurs pour que le gestionnaire n'ait plus qu'à compiler; mais la clé du succès se trouve bien dans une certaine structuration commune des fichiers de base.

On peut quand même s'adapter jusqu'à un certain point. Après je pense qu'il faut vraiment se trouner de nouveau vers les différents interlocuteurs pour faire évoluer leur contribution.

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

et justement, dans le fichier joint il n'y a rien en B11 ... j'ai même du mal à imaginer que cela puisse rester stable si tout le reste bouge

- 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).

ok je vais voir pour ajouter un paramètre de type mensuel ou cumulé qui déterminera la colonne à partir de laquelle rechercher l'info, mais je ne vois pas comment raccorder la ligne trimestre avec mensuel et cumulé !

Bonjour

Je suis désolé de ne pas avoir déterminé dès le départ les différents cas possibles.

Comme indiqué, la référence se trouve bien en b11 sur toutes les feuilles.

Concernant les libellés des colonnes doublés, le problème réside dans le fait que l'entête, mois ou cumulé, se trouve dans des cellules fusionnées comme dans le fichier joint précédemment d'où ma piste de test sur

Lettre ou numéro de colonne

Libellé à trouver pour le titre de colonne

Merci, si solution ou non.

Cordialement

Voici une évolution

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%, deltaC%, deltaR%

Set param = Sheets("paramètres")
nbC = param.Cells(2, Columns.Count).End(xlToLeft).Column
nbR = param.Cells(4, 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) = IIf(param.Cells(1, i) = "", "", param.Cells(1, i) & " ")
        .Cells(ligne, i + 1) = .Cells(ligne, i + 1) & param.Cells(2, i)
    Next
    ligne = ligne + 1

    For Each wks In wkb.Sheets
        For j = 2 To nbR
            .Cells(ligne, 1) = wks.Name
            .Cells(ligne, 2) = IIf(param.Cells(3, j) = "", "", param.Cells(3, j) & " ")
            .Cells(ligne, 2) = .Cells(ligne, 2) & .Cells(ligne, 2) & param.Cells(4, j)
            For i = 2 To nbC

                deltaC = 0
                If param.Cells(1, i).Value <> "" Then
                    Set celC = wks.UsedRange.Find(what:=param.Cells(1, i).Value)
                    If Not celC Is Nothing Then deltaC = celC.Column - wks.UsedRange.Column
                End If
                Set celC = wks.UsedRange.Offset(0, deltaC).Find(what:=param.Cells(2, i).Value)

                deltaR = 0
                If param.Cells(3, j).Value <> "" Then
                    Set celR = wks.UsedRange.Find(what:=param.Cells(3, j).Value)
                    If Not celR Is Nothing Then deltaR = celR.Column - wks.UsedRange.Row
                End If
                Set celR = wks.UsedRange.Offset(deltaR, 0).Find(what:=param.Cells(4, j).Value)

                If Not celR Is Nothing And Not celC Is Nothing Then
                    .Cells(ligne, i + 1).Value = wks.Cells(celR.Row, celC.Column).Value
                End If

            Next
            ligne = ligne + 1
        Next
    Next

    Workbooks(NomFichier).Close
End With

End Sub

Pour une fois, le fait d'avoir des cellules groupées (qu'il faut généralement bannir) ne me gêne pas ! car dans la recherche, ce qui est important c'est le fait de trouver sa position la plus haute et la plus à gauche ce qui est inhérent aux cellules fusionnées.

Par contre, dans l'onglet paramètres, ne pas les fusionner ! il faut rappeler la valeur de cet en-tête.

J'ai fait de même pour les lignes ... au cas où.

3destination.xlsm (24.02 Ko)

la référence se trouve bien en b11 sur toutes les feuilles.

Je te laisse faire car j'ai du mal à y croire si par ailleurs tout bouge ! Pourquoi ne pas plutôt se baser sur le nom de la feuille ?

Si tu veux le faire, modifie la ligne suivante

.Cells(ligne, 1) = wks.Name

par

.Cells(ligne, 1) = wks.Range("B11")

Bonjour,

Je viens de tester la macr par rapport au fichier "source' et je récupère que les données de la 1ère ligne.

Je ne suis pas certain si j'ai bien renseigné la feuille "paramètres".

Ci-joint le fichier "destination" avec la feuille paramètres renseignée.

P.S. : la récupération de la cellule fixe, en l'occurence B11, fonctionne (merci)

Cordialement

3destination.xlsm (27.34 Ko)
3source.xlsx (9.60 Ko)

Re bonjour,

En complément de mon message précédent, je tiens à préciser que :

  • les lignes sont uniques mais pas for cément au même n° de ligne d'une feuille à l'autre
  • les libellés des colonnes sont identiques à toutes les feuilles.

Si le fait d'indiquer le n° ou la lettre de la colonne peut simplifier le traitement, c'est jouable.

Cordialement

Je ne suis pas certain si j'ai bien renseigné la feuille "paramètres".

Non en effet. Mais en terme de présentation des paramètres, j'ai modifié et suivi ton raisonnement plus "naturel"

In fine mon truc n'est pas "ergonomique"

Donc voici avec la macro adaptée à "ta" mise en page des paramètres.

4destination.xlsm (23.90 Ko)

Bonjour,

Je viens de tester la macro et elle est OK.

Merci pour votre collaboration.

Bonne journée

Parfait !

Bonjour

Au contrôle des fichiers sources à traiter, je viens de constater que les libellés, les supers colonnes, sont libellés mensuel et cumul complété avec la période.

Exemple mensuel octobre 2019 ou cumul de janvier à octobre 2019.

À priori en mettant mensuel* ou cumul* , la macro semble fonctionner mais je n'en connais pas les limites.

Les seules certitudes sont :

Les lignes sont toujours dans la même colonne

Les valeurs recherchées par rapport aux libellés des colonnes sont toujours dans la même colonne

Question

Est-ce que l'indication du numéro de colonne avec le libellé à rechercher serait faisable au lieu du libellé de la super ligne et ligne et super colonne et libellé colonne?

Bonne journée

À priori en mettant mensuel* ou cumul* , la macro semble fonctionner mais je n'en connais pas les limites.

Oui c'est sans doute la meilleure solution. Après on risque de rencontrer encore des écarts, par exemple minuscule/majuscule !

Est-ce que l'indication du numéro de colonne avec le libellé à rechercher serait faisable au lieu du libellé de la super ligne et ligne et super colonne et libellé colonne?

On peut en effet, ce n'est ni plus ni moins que le deltaC et deltaR du code

                deltaC = 0
                If param.Cells(1, i).Value <> "" Then
                    Set celC = wks.UsedRange.Find(what:=param.Cells(1, i).Value)
                    If Not celC Is Nothing Then deltaC = celC.Column - wks.UsedRange.Column
                End If
                Set celC = wks.UsedRange.Offset(0, deltaC).Find(what:=param.Cells(2, i).Value)

                deltaR = 0
                If param.Cells(3, j).Value <> "" Then
                    Set celR = wks.UsedRange.Find(what:=param.Cells(3, j).Value)
                    If Not celR Is Nothing Then deltaR = celR.Column - wks.UsedRange.Row
                End If
                Set celR = wks.UsedRange.Offset(deltaR, 0).Find(what:=param.Cells(4, j).Value)

Il faudrait que je me replonge dans le sujet ...

Avec indication de la colonne (alpha ou num) et de ligne (num) ...

Remplace ce qui précède par :

                deltaC = IIf(IsNumeric(param.Cells(1, i).Value), param.Cells(1, i).Value, Asc(param.Cells(1, i).Value) - 64)
                Set celC = wks.UsedRange.Offset(0, deltaC).Find(what:=param.Cells(2, i).Value)

                deltaR = param.Cells(3, j).Value
                Set celR = wks.UsedRange.Offset(deltaR, 0).Find(what:=param.Cells(4, j).Value)

(pas testé)

Bonjour,

Je viens enfin tester vos modifications (enfin).

Vous trouverez ci-joint le fichier destination et source pour contrôle.

En contrôlant le résultat obtenu, je retrouve le CA de la colonne G dans la colonne C.

Pouvez-vous m'indiquer si je me suis trompé dans l'indication des colonnes dans le fichier destination, sachant que je n'ai pas indiqué de colonne pour les lignes qui se touvent toujours dans la colonne B ?

D'avance merci.

Bonne journée

2destination.xlsm (28.28 Ko)
1source-1.xlsx (9.62 Ko)

Re,

En complément du mail précédent, j'ai l'impression que les valeurs trouvées ne correpondent pas aux libellés ENTIERS.

Dans le fichier source ci-joint, j'ai rajouté une ligne "trimestre suivant" dans la feuille 2 (mag1) et je récupère quelques valeurs de cette ligne alors que ce terme n'est pas mis dans la recherche dans les paramètres de "destination".

Merci d'avance pour votre implication.

3source-1.xlsx (9.66 Ko)

Voici

mais pour les libellés entiers il faut que je regarde

pour le reste cela semble ok, confirme moi déjà là-dessus

2destination.xlsm (24.07 Ko)

j'ai l'impression que les valeurs trouvées ne correpondent pas aux libellés ENTIERS.

Est-ce que cette évolution correspond alors à ce que tu recherches ?

3destination.xlsm (24.15 Ko)

Bonjour,

D'après les tests effectués, la macro reprend effectivement les libellés COMPLETS.

Encore merci. Super.

Question autre : où se trouve la coche pour clôturer un dossier ?

Bonne journée

regarde ici ...

resolu

Bonjour,

La dernière version de la macro ne semble plus tenir compte du n° ou de la lettre de la super colonne. Je récupère les mêmes valeurs selon le libellé de la ligne.

Ci-joint le fichier source dans lequel, au lieu de chiffre, j'ai mis des noms pour contrôle.

exemple :

mag1 camoismois pour le CA mensuel pour la ligne mois

mag1 camoiscum pour le CA cumulé pour la ligne mois

Cordialement

2source-1.xlsx (9.69 Ko)

Re,

Si la recherche par le n° ou la lettre de la colonne + le libellé complet est trop complexe, je verrais encore une autre solution qui serait, comme toutes les feuilles ont la mêm structure par rapport au nombre et positionnement des colonnes, de se baser que sur le libellé de la ligne.

C'est-à-dire, de récupérer toutes les informations de toutes les colonnes par rapport à la ligne. Je me charche par la suite de prendre les infos de la colonne qui m'intéresse dans la feuille généré.

Ce n'est qu'une possibilité supplémentaire car votre macro, avec le "couplage" n° de colonne + libellé de la colonne + libellé de la ligne est bien entendu plus fiable.

cordialement

Rechercher des sujets similaires à "recuperation donnees"