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 :

Extraction de lignes non contigües pour les copier dans nouveau classeur [XL-2002]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Extraction de lignes non contigües pour les copier dans nouveau classeur
    Bonjour le forum,

    Etant très maladroit dans mes codes VBA, je m'en remets à vous pour m'aider à résoudre un "petit" problème...

    Je souhaite réaliser un "copier/coller" de lignes non contigües vers un nouveau classeur, de lignes dont la colonne A contient un nom de service hospitalier (exemple: CARDIOLOGIE). Mon but est de coller dans un nouveau classeur toutes les lignes ayant pour valeur dans la colonne A un nom de service choisi par l'utilisateur dans un InputBox.

    J'ai encore beaucoup de mal avec les "copier/coller" de lignes non contigües.
    J'ai donc effectué une recherche sur le forum, mais malheureusement, ça ne m'aide pas beaucoup (mes critères de recherche ne sont peut-être pas les bons)...

    Voici le code que j'ai commencé à rédiger mais que je n'arrive pas à finaliser:

    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
     
    Sub extraction()
    Application.ScreenUpdating = False
    extractservice = InputBox("Entrez le nom du service")
    Set colonne = Range("A3:A500").Find(what:=extractservice, LookIn:=xlValues, LookAt:=xlWhole)
        If colonne Is Nothing Then
            MsgBox "Désolé, il n'existe pas de données pour ce service!"
        Else
     
     
            ' C'est là que je voudrais dire : "on sélectionne toutes les lignes ayant pour nom le service
            ' choisi dans le InputBox par l'utilisateur". Mais en VBA, je ne sais pas faire...
            ' puis le code se poursuivrait par:
     
            Selection.Copy
            Workbooks.Add
            Range("A3").Select
            Selection.Paste
            ActiveSheet.Name = extractservice
        End If
    Application.ScreenUpdating = True
    End Sub

    Quelqu'un parmi vous pourrait-il m'aider à la résolution de mon problème?
    Vous remerciant par avance de toute l'aide que vous pourrez m'apporter...

    Afin de respecter la charte du forum, je ne joins pas d'extrait de mon fichier, mais si jamais vous en avez besoin, je l'ai "sous le coude"...

    Encore merci d'avance pour l'aide et la patience que vous me consacrerez.
    Jérôme.

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    j'avais commencé à préparer quelque chose mais il faut plus d'explications :
    - garderas-tu ton nouveau classeur créé en ajoutant des feuilles par service
    si oui, tu peux le creer d'avance, en l'appelant "services" par exemple
    et tu ne creeras que des feuilles dans ce classeur en inserant les données désirées sans etre obliger de passer par un copier/coller mais
    avec une boucle for next
    et un if then
    classeur2.feuil1.range = classeur1.feuil1.range si tu comprends ce que je veux dire
    mais dis-moi tout
    Bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonjour casefayere, et merci de prendre en compte mon problème et de me proposer ton aide!

    Si je comprends bien ce que tu me proposes, j'ai la possibilité d'extraire les données concernant un service de soins précis (par exemple, la gériatrie) de mon classeur d'origine, et de les "cloner" dans un nouvel onglet d'un classeur pré-créé, et ayant un onglet par service, c'est bien ça? DAns ce cas, est-ce possible de faire une "mise à jour" régulière?

    De plus, le soucis, c'est que dans mon classeur d'origine, les données des services se remplissent les unes à la suite des autres, dans un même onglet... On peut donc arriver à extraire les données "par service" et les dupliquer dans un onglet spécifique d'un classeur donnée, c'est bien cela? Car si j'ai bien compris, effectivement, cette solution peut me convenir parfaitement!

    Etant novice en VBA, j'arrive à assembler des bouts de codes glanés "par-ci par-là", mais je n'arrive pas à avoir une vue d'ensemble des possibilités apportées... C'est pour cela que je pose des questions qui peuvent sembler candides... j'en suis désolé!

    Je me rends compte que ce que j'explique n'est pas très compréhensible, aussi, je joins pour l'exemple un extrait de mon fichier source.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    j'ai commencé une approche (une première étape) sur ton module "macro", contente toi de copier ce code mais attention si c'est un essai renomme tes classuers pour ne pas perdre ton travail, pour la compréhension, j'ai laissé le nom de "jercaz" et l'autre classeur nommé "services" tu coles le code dans le classeur jercaz et quand tu la lances autant de fois que tu veux, regardes le résultat dans "services"
    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
    Option Explicit
    Option Base 1
    Public bases(), services, x As Long, a, tablo(), y
    Public TableDesFeuilles() As String
     
    Sub ExtractionDonnées()
    Dim classeur As Workbook, ouvert As Boolean
    For Each classeur In Workbooks
    If classeur.Name = "services.xls" Then ouvert = True
    Exit For
    Next classeur
    If ouvert = False Then
    Workbooks.Open Filename:=ActiveWorkbook.Path & "\" & "services.xls"
    End If
    Windows("jercaz.xls").Activate
    With Sheets("saisie des données ADULTES")
    bases = .Range("a3:r" & .Range("a" & .Rows.Count).End(xlUp).Row).Value
    Set services = CreateObject("Scripting.Dictionary")
    For x = 1 To UBound(bases)
         If Not services.Exists(bases(x, 1)) Then
            services.Add bases(x, 1), bases(x, 1)
            ReDim tablo(1 To services.Count)
            tablo(services.Count) = bases(x, 1)
        End If
      Next x
    a = services.keys
    End With
    With Workbooks("services.xls")
    .Sheets(1).Name = "feuil1"
    select_feuilles
    If .Sheets.Count > 1 Then
        Application.DisplayAlerts = False
        .Sheets(TableDesFeuilles).Delete
        Application.DisplayAlerts = True
    End If
    For x = 1 To services.Count - 1
        .Sheets.Add After:=.Sheets(.Sheets.Count)
    Next x
    For x = 1 To services.Count
        .Sheets(x).Name = services(a(x - 1))
    Next x
    End With
    End Sub
    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
    Sub select_feuilles()
    Application.DisplayAlerts = False
     
    Dim i As Integer
    Dim S As Worksheet
    i = 1
    With Workbooks("services.xls")
    If .Sheets.Count > 1 Then
    For x = 2 To .Sheets.Count
    ReDim Preserve TableDesFeuilles(i)
    TableDesFeuilles(i) = .Sheets(x).Name
    i = i + 1
    Next
    End If
    End With
    Application.DisplayAlerts = True
    End Sub
    pour la copie des données, on verra après (je n'ai pas trop le temps)
    comprends déjà ma 1ere démarche
    Bonne nuit

    je viens de m'apercevoir que les noms de service ne pourront pas etre copié comme nom de feuille parce qu'ils comportent des noms de feuille interdit, soit dépassant le nombre de caractères autorisés, soit comportant des signes qu'on ne peut intégrer dans un nom de feuille
    mais la base est là, à revoir pour tes noms de service

    j'avais fait l'essai avec des noms bidons donc ça marchait
    encore bonne nuit
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonjour le forum,
    Bonjour casefayere

    Je ne dirai que trois mots: UN GRAND MERCI !!! pour ton aide précieuse!

    Effectivement, pour les noms de service, ça ne collait pas, mais j'ai adapté avec les "noms courts" compris par tout le monde au sein de l'établissement.

    Pour le classeur "jercaz", c'était un extrait d'une base de données beaucoup plus importante, mais l'essentiel y était, et tu as su en tirer pleinement partie pour m'aider dans mon problème.

    A mon niveau, je ne maîtrise pas encore suffisamment les compteurs pour les mettre en application avec des créations d'onglets, c'est pour cela que ça me semblait insurmontable. Grâce à toi, non seulement j'ai donc résolu mon problème, mais ton exemple me permets en plus de perfectionner d'autres classeurs déjà utilisés, mais où je bloquais également (Ah, ces fichus compteurs, quand on est débutant....)


    Donc, encore une fois, vraiment merci pour ton aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/02/2014, 15h34
  2. [XL-2007] Récupération des valeurs d'un fichier pour les copier dans un autre
    Par stelme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/11/2011, 06h00
  3. [Toutes versions] Recherche de données dans une feuille pour les copier dans une autre
    Par mattdogg97 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/02/2011, 14h22
  4. Réponses: 2
    Dernier message: 10/09/2007, 16h40

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