IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

MACRO tableau multi donnees à copier par feuil


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Par défaut MACRO tableau multi donnees à copier par feuil
    Bonjour à tous,
    N'ayant pas une gde connaissance des macros, cherchant des solutions depuis x jours, je fais appel à vous.
    J'aimerais, à partir d'un tableau excel de synthèse comprenant un gd nombre de données les copier dans un autre classeur excel par feuil.
    J'arrive au plus compliqué pour moi. C'est que, dans ce tableau de synthèse, la colonne A donne la liste des établissements représenté par un code.
    ex : colonne A2 = 060208079 (colonne B2 = Centre hospitalier de tourcoing)
    colonne A3 = 054187357 (colonne C3 = Centre hospitalier de Versailles
    colonne A4 = 028792522 (colonne C3 = Centre hospitalier de toulon)
    etc...
    les autres données du tableau sont chiffrées et ce sont elles que je dois copier dans un autre classeur excel où chaque feuille est le nom de l'établissement
    Feuil1 renommé en CH_TOURCOING
    Feuil2 renommé en CH_VERSAILLES...
    etc....
    Votre aide sera la bienvenue car je galère grave .
    Si vous avez besoin d'explications complémentaires, je reste connectée.
    un grand merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une piste. A mettre dans un module standard et tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    Sub CentreHospitalier()
     
        Dim Classeur As Workbook
        Dim Fe As Worksheet
        Dim FeRecup As Worksheet
        Dim Plage As Range
        Dim Cel As Range
        Dim Dico As Object
        Dim Cle As Variant
        Dim NomFeuille As String
        Dim I As Integer
     
        'la feuille où se trouve la base de données, à adpter
        Set Fe = ThisWorkbook.Worksheets("Feuil1")
     
        'défini la plage seulement en colonne "A" sur les codes qui sont sensés être uniques
        With Fe
     
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'supprime les doublons de codes pour faire le filtrage par la suite
        Set Dico = CreateObject("Scripting.Dictionary")
     
        For Each Cel In Plage
     
            If Cel.Row <> 1 Then '<-- évite la ligne d'entêtes
     
                If Dico.exists(Cel.Value) = False Then
     
                    Dico.Add Cel.Value, Cel.Offset(, 1).Value ' Cel.Value
     
                End If
     
            End If
     
        Next Cel
     
        'si il y à au moins 1 résultat (on pourrait tester ce code sur n'importe quoi ;o) )
        If Dico.Count > 0 Then Set Classeur = Workbooks.Add
     
        'parcour le dico pour filtrer la base de données sur la colonne "A"
        For Each Cle In Dico.Keys
     
            I = I + 1
     
            'construit le nom de la feuille en présument que la ville du centre hospitalier se trouve
            'en fin de phrase (ici, les noms composés ne sont pas prix en compte, à adapter sinon !)
            NomFeuille = UCase("ch_" & Right(Dico(Cle), Len(Dico(Cle)) - InStrRev(Dico(Cle), " ")))
     
            'crée la feuille une fois les trois par défaut utilisées (Feuil1, Feuil2 et Feuil3)à adapter si classeur anglais
            On Error Resume Next
            Set FeRecup = Classeur.Worksheets("Feuil" & I)
     
            If Err.Number <> 0 Then
     
                Set FeRecup = Classeur.Worksheets.Add(, Classeur.Worksheets(Classeur.Worksheets.Count))
                On Error GoTo 0
     
            End If
     
            FeRecup.Name = NomFeuille
     
            'filtre
            Plage.AutoFilter 1, Cle
     
            'récupère les valeurs avec la ligne d'entête
            Fe.AutoFilter.Range.EntireRow.Copy FeRecup.Range("A1")
     
            'supprime le filtre
            Plage.AutoFilter
     
        Next Cle
     
    End Sub
    Hervé.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Par défaut
    Merci de votre réponse mais je ne suis pas assez costaude pour modifier quelques données à cette macro .
    Je vous adresse les fichiers pour affiner cette macro déjà trop complexe pour moi.
    je vous explique rapidement.
    je dois copier du fichier "valo des act...etc" des données (colonnes I, J, Q, R et V) par établissements (Colonne C) et ce pour tous les mois représentés
    sur un autre tableau "ENQUETE TRESO...etc" par feuille nommée par le nom des établissements en question pour tous les mois..
    en espérant que vous arriverez à résoudre mon problème.
    Je dois faire ce travail tous les mois et j'aimerais bien l'automatiser.

    A+
    bon casse tête

    je n'arrive pas à joindre les fichiers dont je parle.
    Je vais tenter une explication.*
    Mon fichier excel "tablo de valo" compte 20 lignes et 10 colonnes (A à J).
    La colonne C contient les noms des centre hospitaliers, les autres colonnes des données chiffrées que je dois copier dans un autre classeur qui contient 20 feuilles. Ces 20 feuilles sont nommées par le nom des Centres hospitaliers, les mêmes noms que sur mon fichier "tablo de valo".
    Pour augmenter la difficulté, mon fichier "tablo de valo" contient 12 feuilles correspondant au 12 mois de l'année.
    Toutes les feuilles sont faites sur le même modèle, un tableau de 20 lignes et 10 colonnes avec le même nom des centres hospitaliers.

    merci de ce que vous pourrez faire pour moi.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    ex : colonne A2 = 060208079 (colonne B2 = Centre hospitalier de tourcoing)
    colonne A3 = 054187357 (colonne C3 = Centre hospitalier de Versailles
    colonne A4 = 028792522 (colonne C3 = Centre hospitalier de toulon)
    Pour les noms, dans ton 1er post, une fois tu parle de colonne B et après de colonne C :o(
    Voici un nouveau code. Le classeur de récup doit être ouvert et avoir été enregistré. Les feuilles peuvent soit exister, soit être créées. Quand la feuille n'existe ou que son nom est orthographié de façon différente à la construction du nom que je fais dans le code, en message va te demander si tu veux faire la correction manuellement du nom de la feuille dans le classeur de récup dans ce cas, clique sur "Non" et fais la modif sinon, clique sur "Oui" et à partir de là, une feuille est ajoutée au classeur avec le nom correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    Sub CentreHospitalier()
     
        Dim Classeur As Workbook
        Dim Fe As Worksheet
        Dim FeRecup As Worksheet
        Dim TblNomFeuille() As String
        Dim Plage As Range
        Dim Cel As Range
        Dim Dico As Object
        Dim Cle As Variant
        Dim NomFeuille As String
        Dim Existe As Boolean
        Dim I As Integer
     
        'classeur de récup, adaper le nom
        Set Classeur = Workbooks("Classeur2.xls")
     
        'récupère les nom des feuilles pour un contrôle ultérieur
        For Each Fe In Classeur.Worksheets
     
            I = I + 1
            ReDim Preserve TblNomFeuille(1 To I)
            TblNomFeuille(I) = Fe.Name
     
        Next Fe
     
        'la feuille où se trouve la base de données, à adpter
        Set Fe = ThisWorkbook.Worksheets("Feuil1")
     
        'défini la plage seulement en colonne "A" sur les codes qui sont sensés être uniques
        With Fe
     
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'supprime les doublons de codes pour faire le filtrage par la suite
        Set Dico = CreateObject("Scripting.Dictionary")
     
        For Each Cel In Plage
     
            If Cel.Row <> 1 Then '<-- évite la ligne d'entêtes
     
                If Dico.exists(Cel.Value) = False Then
     
                    'construit le nom de la feuille à partir du mot "de" pour ne récupérer que la ville et rajoute "CH_" comme préfixe
                    NomFeuille = UCase("ch_" & Right(Cel.Offset(, 2).Value, Len(Cel.Offset(, 2).Value) - InStrRev(Cel.Offset(, 2).Value, "de") - 2))
     
                    'met ou remet à faux
                    Existe = False
     
                    'vérifie l'existance de cette feuille dans le classeur de récup
                    For I = 1 To UBound(TblNomFeuille)
     
                        If TblNomFeuille(I) = NomFeuille Then
     
                            Existe = True
                            Exit For
     
                        End If
     
                    Next I
     
                    'si la feuille n'existe pas (ou le nom n'est pas orthographié de la même manière) :
                    '- soit on la crée (clic sur le bouton "Oui")
                    '- soit on effectue la modif manuellement (clic sur le bouton "Non"), dans ce cas, fin de procédure
                    If Existe = False Then
     
                        If MsgBox("La feuille '" & NomFeuille & "' n'existe pas dans le classeur '" & Classeur.Name & "' ou son nom n'est pas orthographié de la même manière !" & _
                                  vbCrLf & "Voulez-vous :" & vbCrLf & _
                                  "1- faire la correction manuellement pour avoir la correspondance ? Cliquez sur 'Non'" & _
                                  vbCrLf & "2- qu'un feuille soit créée ? Cliquez sur 'Oui'", _
                                  vbExclamation + vbYesNo, _
                                  "Vérification des noms de feuilles.") = vbYes Then
     
                            'si clic sur "Oui", ajoute une feuille à la fin de la collection et la renomme
                            Set FeRecup = Classeur.Worksheets.Add(, Classeur.Worksheets(Classeur.Worksheets.Count))
                            FeRecup.Name = NomFeuille
     
                            ReDim Preserve TblNomFeuille(1 To UBound(TblNomFeuille) + 1)
                            TblNomFeuille(I) = NomFeuille
     
                        Else
     
                            Exit Sub
     
                        End If
     
                    End If
     
                    'ajoute le code dans la clé et le nom de la feuille dans l'élément
                    Dico.Add Cel.Value, NomFeuille
     
                End If
     
            End If
     
        Next Cel
     
        'parcour le dico pour filtrer la base de données sur la colonne "A"
        For Each Cle In Dico.Keys
     
            'défini la feuille qui va recevoir les valeurs
            Set FeRecup = Classeur.Worksheets(Dico(Cle))
     
            'filtre
            Plage.AutoFilter 1, Cle
     
            'récupère les valeurs avec la ligne d'entête
            With FeRecup
     
                Fe.AutoFilter.Range.EntireRow.Copy .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0)
     
            End With
     
            'supprime le filtre
            Plage.AutoFilter
     
        Next Cle
     
    End Sub
    Hervé.

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2015, 02h00
  2. [XL-2003] tableau depuis une liste par une macro
    Par crissud dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 13/03/2011, 11h48
  3. recherche dans une base de donnees; copier coller via une macro
    Par yannlvr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/04/2010, 17h58
  4. Tableau croisé dynamique créé par macro
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 20/01/2010, 18h45
  5. Réponses: 5
    Dernier message: 04/10/2006, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo