Extraire les données des lignes; les séparer en colonnes

Bonjour,

J’ai besoin de l’aide pour mettre en forme un fichier Excel, dont les données ont été entrées à l’ancienne. Par conséquent elles sont inexploitables. Ce fichier comprend plus de 5000 lignes par an et il commence au 1er janvier 2012. J’ai omis les dates car je sais comment les intégrer par la suite.

Le fichier a déjà bénéficié d’un premier traitement pour supprimer les données superflues ainsi que les lignes vides. Je ne peux pas mettre les données ici (je ne sais pas le faire, car le fichier contient des couleurs pour faciliter la compréhension ainsi que des tableaux). Je vous envoie en pièce jointe le fichier. Merci de votre compréhension.

Les buts de ce travail :

  • évaluer l’activité d’un bloc opératoire,
  • montrer à l’administration que l’on est en sous-effectif
  • justifier le recrutement du personnel infirmier
  • et donc d’assurer un service de qualité aux patients.

Une fois que le fichier est correctement informatisé, je pourrai y rajouter les paramètres nécessaires, tels que temps d’occupation des salles, nombre de personnel disponible … que je pense pouvoir faire !

Votre aide nous sera très utile.

Vous remerciant.

Bonjour HABD,

vous trouverez dans le fichier joint un début de réponse,

je pense qu'il faudra passer par plusieurs traitements

Voyez les colonnes D à I, je n'ai pas encore trouvé la

parade pour les cellules contenant " #VALEUR ! "

Bonsoir,

Souhaites-tu comme dans ton modèle garder tous les intitulés de lignes : A1 A2... avec Rien en regard ? Ou bien élimine-t-on ces "rien" ?

Et résultat sur la même feuille ou sur une nouvelle feuille ?

Cordialement.

Bonjour njhub,

J'apprécie le travail déjà effectué.

Mes commentaires :

(1) pour la date "Mardi 20/06/2017", ce n'est pas nécessaire de la travailler; donc sa valeur en D1 est inutile.

Ça doit simplifier le travail !

(2) dans les cellules où j'ai marqué Rien, aucune donnée n'est à mettre dans la ligne correspondante

(3) ainsi E2 est à décaler vers E3,

E4 vers E5

et E4 copié vers E6, puisque c'est la même salle

E7 vers E8

E9 vers E11

E14 vers E15 et copié à E16 E17 E18 E19 E20 (même salle)

Je reconnais que cela va être difficile ... je déprime !

Pas moyen de faire appel à des codes de VBA ?

Cordialement


Bonjour Mferrand,

(1) En effet les lignes (ou cellules) où j'ai écrit Rien, ce n'est que pour vous informer que je ne veux rien dans cette ligne.

(2) Que ces lignes soient vides ou qu'elles contiennent le terme "Rien", ça ne me dérange pas ... elles seront supprimées.

J'ai un Code qui peut me le faire !

(3) Je préfère que les données soient sur la même feuille pour que je puisse voir les correspondances d'un seul coup.

Si le code fournit fait le travail que je veux, je peux sélectionner les colonnes 1-2-3 et les supprimer

et appliquer mon Code pour supprimer les lignes vides ou contenant "Rien"

Merci d'avoir pris la peine de comprendre mes fichiers !

Cordialement

HABD

Bonjour HABD,

un peu plus abouti

Non, pas moyen de faire appel à des codes de VBA en ce qui me concerne, je ne connais pas

mais tel quel, c'est utilisable, il suffit de recopier les formules

Cordialement

Il faut préciser ! Si je supprime les "rien" les lignes disparaissent, et tu n'auras plus la correspondance entre les lignes...

En gros, je constitue un nouveau tableau qui peut être mis n'importe où une fois constitué.

Si tu dois incorporer une date et si elle figure dans ton fichier actule, autant le signaler, si on a le moyen de l'extraire, la macro pourra le faire dans la foulée...

Pour le reste, si ta structure est régulière on peut sortir les données de chaque colonne...

Cordialement.

Bonjour HABD,

ma version finale, avec les décalages pour les salles

Bonjour Mferrand

(1) La date : sera la même pour toutes les lignes validées d'une fiche.

Si la date est intégrée de façon automatique, cette date sera toujours positionnée en A1 sur la feuille initiale,

Sur le tableau modifié si la date est prise en considération, elle doit alors être dans les 2 1ères colonnes :

  • chaque cellule de la 1ère colonne en format jour (Lundi, Mardi, etc)
  • chaque cellule de la 2e colonne en format jj/mm/aaaa

(2) Que le tableau modifié soit sur la même feuille ou si une autre feuille, ça ne me dérange pas.

Par contre, pour faciliter la vérification, je préfère que les lignes vides ou contenant "Rien" ne soient pas supprimées.

J'ai un code qui le fera;

Sub Macro1()
Dim Cel As Range
Do
    Set Cel = Cells.Find(What:="Rien", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
                    SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)
    If Cel Is Nothing Then
        Exit Do
    Else
        Rows(Cel.Row).Delete
    End If
Loop
End Sub

(3) Pour supprimer les lignes inutiles, je pourrai intégrer une fonction Call à la fin du Code proposé,

et ce Call fera appel à mon bout de Code en haut

(4) Pour une année il y aura 365(6) fiches ! Chaque fiche comprend une centaine de lignes. Je ne veux pas les assimiler pour éviter de me perdre. Je prendrai le temps d'appliquer le Code une fiche par fiche !

(5)Les données dans le fichier initial n'ont pas toujours été renseignées de façon logique ... nos secrétaires n'ont pas toutes eu de formation informatique, et certaines étaient des pré-retraitées. Donc voilà le problème !

Vous remerciant

Cordialement

HABD

Bonjour njhub,

Merci pour le travail fait ce dimanche !

J'ai vu le nouveau tableau.

Pour les salles, ça coince :

(1) tableau modifié : chaque fois qu'il y a rien

de F2 à J2, de F4 à J4, de F7 à J7, etc

ces cellules ne doivent pas contenir de données

elles seront supprimées ultérieurement

Les salles doivent correspondre aux intitulés en rouge : Orthopédie, Viscéral, Gynécologie ...

Orthopédie .... quelle salle?

Viscéral .... quelle salle?

etc

(2) sur le tableau initial est précisé une Salle en B2 B4 B7 B14 etc ...

ce ne sont que des lignes de titre

les salles s'appliquent aux interventions précisées en dessous

explication:

B2 : Salle 1; Donc B3 sera en Salle 1 et ainsi pour F3

B4 : Salle 2 ; Donc B5 et B6 seront aussi en salle 2, donc idem pour F5 et F6

B7 : Salle 3 ; Donc B8 sera en Salle 8, et pour F8

B14 salle 7 ; Donc B15 à B20 seront toutes en salle 7, donc idem pour F15 à F20

Merci de votre aide

Cordialement

HABD

Re,

J'ai laissé les dates de côté parce que ça ne m'a pas paru très clair de mettre 2 fois la date juste pour afficher le jour de semaine à part, alors que tout peut s'afficher dans la même cellule avec le format adéquat.

De toute façon il n'y avait pas de raison de l'intégrer au tableau, elle peut se mettre en une fois ensuite sur toute la colonne...

Donc selon tes préférences, on suit les lignes...

Dans la mesure où tu traiteras différentes feuilles, la macro est lancée avec en argument la feuille à traiter (en tant qu'objet Worksheet). Elle est donc lancée par une autre macro qui l'appelle en lui passant la feuille à traiter.

Ce qui te permet d'aménager cette macro d'appel pour faire traiter en boucle plusieurs feuilles, et avoir cet ensemble dans un classeur distinct des ceux que tu traites...

Je n'ai donc pas mis de bouton, tu la testes en la lançant par la boîte de dialogue macro, puis tu aménageras ton système selon tes voeux.

La macro proprement dite :

Sub Reclasser(ws As Worksheet)
    Dim Tbl(), Tmp, Temp, h, n%, i%, Sl$, UrPr$, Sce$
    With ws
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        ReDim Tbl(1 To n, 6)
        For i = 1 To n
            If .Cells(i, 1) Like "A*" Then
                Tbl(i, 0) = .Cells(i, 1)
                If IsDate(Left(LTrim(.Cells(i, 2)), 5)) Then
                    h = Left(LTrim(.Cells(i, 2)), 5)
                    If .Cells(i + 1, 2) Like "*urgence*" Then
                        UrPr = "Urgence": Tbl(i, 1) = "Rien"
                        i = i + 1
                        Tbl(i, 0) = .Cells(i, 1)
                    Else
                        UrPr = "Programmée"
                    End If
                    Sce = Trim(Split(.Cells(i, 2), " - ")(1))
                    Tmp = Split(.Cells(i, 2), "C:")
                    Temp = Split(Trim(Tmp(0))): Tmp(0) = Trim(Temp(UBound(Temp)))
                    If InStr(Tmp(0), "h") = 0 Then Tmp(0) = "0h" & Tmp(0)
                    Temp = Split(Tmp(1), "A:"): Tmp(1) = Trim(Temp(0))
                    Tbl(i, 1) = Sce: Tbl(i, 2) = Sl: Tbl(i, 3) = Tmp(1)
                    Tbl(i, 4) = UrPr: Tbl(i, 5) = h: Tbl(i, 6) = Tmp(0)
                Else
                    Tbl(i, 1) = "Rien"
                    If .Cells(i, 2) Like "Salle*" Then Sl = Left(.Cells(i, 2), 7)
                End If
            End If
        Next i
        With .Range("D1").Resize(n, 7)
            .Value = Tbl
            .Columns.AutoFit
            With .Borders
                .LineStyle = xlContinuous: .Weight = xlThin
            End With
        End With
    End With
End Sub

Le traitement repose sur des détections et séparations successives dont je t'indique les points clés, car ce qui ne correspond pas exactement ne sera pas reconnu (aucune variante potentielle n'étant indiquée au départ, s'il se révèle qu'il y en a, certaines peuvent être rattrapées facilement, d'autres beaucoup moins...

Salle se détecte en début de ligne commençant par "Salle" (initiale majuscule et non précédée d'une espace)

[s'agissant de la salle, on récupère ce libellé suivi d'un numéro à un chiffre, s'il y a d'autres cas, il faudra modifier...]

L'heure en début de ligne se détecte par reconnaissance de valeur de type Date, après élimination de l'espace qui précède et prélèvement de la valeur.

Le service est isolé au moyen du séparateur " - " (tiret encadré d'espaces) [le tiret seul conduisait à scinder Gastro-Entérologie...]. Il y a donc lieu de veiller à l'existence de ces espaces, sans quoi la récupération deviendrait nettement plus complexe.

Les autres séparateurs utilisés sont "C:" et "A:"... Tant qu'ils sont uniques, pas de problème.

Pour la durée horaire qui précède le "C:", petite manoeuvre et utilisation du séparateur par défaut (espace) pour l'isoler. On ne pouvait utiliser un nombre de caractères en raison de la variation de longueur, mais là où il n'y a que les minutes indiquées, on complète la mention en les faisant précéder de "0h".

Cordialement.

Bonsoir,

Merci pour ce travail. Je vais l'étudier demain après midi. Tu dois savoir que mon niveau de VBA se limite à piquer des idées ici et là sur le forum ! Je vais faire tout faire pour comprendre et ne pas poser de question bête.

Pour la date : le jour est intéressant car les horaires des Salles d'intervention ne sont pas les mêmes selon le jour. Par exemple, chez moi, les mardis sont des journées difficiles; je commence à 07H45 et je ne quitte pas le bloc opératoire avant 17H00, non stop. Donc si au cours de la réunion on parle des problèmes de mardi, je n'ai qu'à prévoir un TCD avec un choix de mardi. Si je ne mets pas le jour, et je ne mets que la date je n'aurai pas le réflexe de réponse instantanée. Prenons un exemple : 27/06/2017 ??? si je prévois à côté" mardi" c'est plus parlant. Les stats ne sont pas intéressants si on parle d'une date fixe, par contre ils sont intéressants si on parle d'un jour fixe, ou d'un mois (été, hiver, congés) ...

Vu que je peux intégrer facilement les deux formats de date et que ces dates n'ont aucune influence sur l'élaboration du tableau, je n'ai pas insisté pour leur assimilation. Par contre les facteurs indispensables sont les salles (Salle 1 et 2 : prévoir 3 infirmières car chirurgie lourde, orthopédique) (salle 6 prévoir 1 infirmière car gastroendoscopie) ...

Justement pour la gasrto: j'ai vu que parfois c'est renseigné :

  • Gastro-Entérologie - Coloscopie + gastroscopie
  • Gastro-Entérologie - Coloscopie
Ce n'est pas important : toutes ces variantes peuvent être mises sous un seul titre :

- Gastro-

Çà ne change rien, puisque c'est la même salle, même opérateur, même instrumentation.

Merci mille fois pour le travail ... alors que l'on est un dimanche!

A bientôt

HABD

Bonjour,

J'ai un soucis: je ne sais pas utiliser cette fonction : Sub Reclasser(ws As Worksheet). Ma connaissance de VBA est très basique et de toute façon c'est de l'auto-formation. J'ai pour habitude créer un code du genre:

Sub DeleteRemiseEt3Lignes()

xxxxx

End Sub

Ensuite je crée un bouton et j'associe ce code à ce bouton et en cliquant sur le bouton, le travail se fait ... quand ça marche! Mes codes sont tous des bouts de codes pompés ici et là ... aucune réelle création !

Donc j'ai fait la même chose pour ton code ... je n'ai jamais utilisé un système type (ws As Worksheet). Est-ce possible pour toi de modifier le code pour qu'il soit à mon niveau. Inutile de préciser que je n'ai rien compris dans la structure du code!

Merci.

Cordialement

HABD

Bonsoir,

Tu ne vas pas te noyer dans un verre d'eau tout de même ! C'est une macro tout ce qu'il y a de plus ordinaire, le fait qu'elle ait un argument n'y change rien.

Quand tu utilises la fonction SOMME, tu ne te contentes pas de taper : =SOMME() ! Entre les parenthèses tu mets bien les nombres ou références de plage à addtionner ! Ce sont les arguments de la fonction !

Là c'est pareil, une macro à qui tu demandes de faire quelque chose ! Tu lui indiques simplement où elle doit opérer ! Et c'est ce qui la rend utilisable sans modification pour toute feuille que tu auras à traiter ! Il suffit de la lancer avec une autre feuille...

Le code permettant de lancer une macro consiste en une instruction : NomMacro Argument (et quand il y a plusieurs arguments, tu les mets tous en les séparant par une virgule, et quand il n'y en a pas, tu n'en mets pas !)

Elle doit seulement être lancée par une autre macro, dans laquelle tu changes la feuille à traiter... Ou mieux tu réaménages ta macro de lancement :

Sub ReclasserDonnées()
    Dim i%, wb$, ws$
    i = 2
    With ActiveSheet
        Do While .Cells(i, 4) <> "" And .Cells(i, 5) <> ""
            wb = .Cells(i, 4): ws = .Cells(i, 5)
            Reclasser Workbooks(wb).Worksheets(ws)
            i = i + 1
        Loop
        .Range("D2:E" & i).ClearContents
    End With
End Sub

Tu mets les deux macros dans un classeur qui servira à ça. Sur la feuille du classeur un bouton auquel tu affectes cette macro de lancement. Sur la même feuille tu réserves la colonne D pour mettre le nom du classeur à traiter et la colonne E le nom de la feuille à traiter. Et tu peux faire des listes... Les classeurs à traiter doivent être ouverts. Tu cliques sur le bouton, ce qui lancera le traitement des feuilles que tu auras listées !

13habd.xlsm (21.89 Ko)

ok, j'ai lu en diagonale;

je n'ai pas tout compris ...

au fait ... je n'ai rien compris !!!

il est 02H00

dans 6 heures je suis au bloc !!

demain je reviens vers toi

ceci dit j'ai un peu avancé à ma façon basique !!

je t'expliquerai demain

merci et bonne nuit

Bonjour,

J’ai beaucoup évolué dans mon projet. Je vous explique ce que j’ai réussi à faire et là où je coince. Bien entendu, je ne fonctionne pas comme les informaticiens, vu que je n’ai jamais suivi de formation en informatique. Mes connaissances en informatique se limitent au VBA, dont les codes sont pompés ici et là sur divers forums.

J’ai pu régler pas mal de problèmes : isoler certains paramètres et les mettre dans des colonnes appropriées : (1) salle, (2) service (3) urgent ou programmé (4) chirurgien (5) horaire début d’intervention format 14:05 (6) durée d’intervention format 4h25

Une ligne représentative de ma liste :

A1 : 07:40 PATIENT Jean louis 18/09/1934 BR - Orthopédie - Epaule prothèse totale Traumatique 3h27 C: CHIRURGIEN JEAN-PAUL / AG + ALR/ droit/

Mes problèmes :

Le Chirurgien: Puisque il y a environ une vingtaine de chirurgiens, j’ai trouvé une façon facile de l’isoler. J’ai utilisé la fonction « Like » et j’ai mis les noms de chaque chirurgien. C’est un peu fastidieux, mais ça marche. Le problème c’est que si d’ici quelques années, un nouveau chirurgien est recruté … il va falloir que je re-actualise la liste :

Mon code de chirurgien :

Sub Docteur()
    Dim i As Integer
        For i = 1 To 100
            If Range("A" & i) Like "*THEV*" Then Range("E" & i) = "THEVENAUD"
            If Range("A" & i) Like "*HOLL*" Then Range("E" & i) = "HOLLANDE"
        Next i
End Sub

Si on me donne un code qui peut chercher le chirurgien en A1 (le nom se trouvera toujours après C: ) (et je n’ai pas besoin des prénoms), je suis preneur.

NB mes connaissances sont limitées à utiliser des codes simples commençant par Sub et et terminant par End Sub … et j’utilise un bouton auquel j’associe le code. Je préfère des bouts de code que je peux comprendre que quelque chose de complexe, qui marche mais que je ne comprends pas.

NB pour le moment, j’utilise « for i = 1 to 100 » afin de vérifier rapidement mes codes. Plus tard je le modifierai pour prendre toute la liste jusqu’à la dernière ligne vide -1.

Mon code de service :

Même raison que pour « chirurgien » … mais vu qu’il n’y a que 6 services et que les services seront toujours les même services ça ne me dérange pas d’entrer chaque service à la main :

Sub Service()
    Dim i As Integer
        For i = 1 To 100
            If Range("A" & i) Like "*Orthopédie*" Then Range("C" & i) = "Orthopédie"
            If Range("A" & i) Like "*Viscéral*" Then Range("C" & i) = "Viscéral"
        Next i
End Sub

Pour durée d’intervention : Mon Code :

Sub DuréeIntervention()
    Dim i As Integer
        For i = 1 To 100
            Cells(i, 7).Value = Right(Cells(i, 13).Value, 5)
        Next i
End Sub

Le problème c’est le format. J’ai des réponses comme 3h52, 2h, 24 (24 = 24 minutes). Comment peut-on y associer un code pour être au format 03 :52, 02H00 ou 00H24 ? La durée de l’intervention sera toujours avant C :

En vous remerciant

HABD

Tu as posé une question débouchant sur un problème de manipulation de chaîne. J'ai fourni un code utilisant quelques uns des outils dont dispose VBA à cette fin. La procédure fournit un résultat conforme à ce qui est attendu sur ton échantillon. Et je ne vois nulle part mention d'une erreur d'execution ou d'un résultat erroné sur lesquels il faudrait se pencher.

A partir de là, la décision de l'utiliser ou non t'appartient ! Mais si ça fonctionne comme prévu, je n'ai pour ma part rien à reprendre...

je ne fonctionne pas comme les informaticiens, vu que je n’ai jamais suivi de formation en informatique

Moi non plus ! Pour les deux ! Et l'ésotérisme dans lequel se complaise souvent les informaticiens m'insupporte !

Pour résoudre un problème ou une question, je commence toujours par une analyse, qui n'a rien d'informatique ! Mais qui demeure le maillon le plus important pour aller vers une solution rationnelle, efficace, la plus simple possible, et autant que possible rapide.

L'analyse de ta question est assez vite faite ! Tu dois extraire des éléments d'une chaîne et en recomposer une ligne. Il s'agit donc de voir comment on peut découper, charcuter, etc. la chaîne et tel ou tel de ses morceaux pour en extraire chaque élément, tenant compte que certains éléments communs à plusieurs lignes se trouvent sur des lignes n'ayant pas le même statut, et une fois les éléments récupérés, en recomposer une ligne.

Une fois le tour fait, et établie une vue globale de l'opération, on peut rechercher les outils VBA les plus propres à la réalisation souhaitée. Il faut parcourir les lignes, de la première à la dernière occupée, donc boucle... On teste chaque ligne pour connaître son statut : ligne "nulle" (aucun élément à reprendre ni à signaler), ligne neutre (codée mais rien à reprendre sauf le code), ligne salle (on récupère la salle pour les lignes suivantes, jusqu'à la prochaine salle), ligne de données (où l'on a l'essentiel à extraire).

Et qu'en fait-on ? On est d'autant plus efficace qu'on opère le plus possible hors Excel, donc on va éviter de mettre bêtement chaque données recueillie immédiatement dans une cellule... On va donc tout mettre dans un tableau de la taille de celui qu'on devra obtenir à la fin, ce qui est d'autant plus simple que l'on a ses dimensions dès le départ... Une fois atteint la dernière ligne, on a servi tout le tableau, il n'y a plus qu'à le poser sur Excel ! (on dit affecter à la plage de destination, et c'est simple à faire : on dit en tout et pour tout plage = tableau ! plus simple qu'un copier-coller ordinaire !)

Je suis donc très dubitatif de te voir saucissonner à qui mieux mieux, cela ne me semble guère aller vers une recherche d'efficacité et de rapidité...

J’ai utilisé la fonction « Like »

Like est un opérateur ! Il vaudrait mieux ne pas confondre opérateurs et fonctions, cela ne fonctionne pas de la même façon.

mes connaissances sont limitées à utiliser des codes simples commençant par Sub et et terminant par End Sub …

On en est tous là ! Tout le code exécutable doit se trouver dans des procédures, et les procédures Sub sont les principales utilisées, les plus nombreuses. Si l'on y ajoute les procédures Function qui ne se distinguent des Sub que par le fait qu'on peut leur faire renvoyer un résultat, on aura au moins 95% de ce qu'on utilise en VBA...

et j’utilise un bouton auquel j’associe le code.

Ça, on peut toujours, comme je te l'ai déjà fait remarquer... C'est d'ailleurs le moyen le plus pratique pour lancer une procédure...

Je préfère des bouts de code que je peux comprendre que quelque chose de complexe, qui marche mais que je ne comprends pas.

Oh, moi également ! Mais quand je ne comprends pas, je commence par faire l'effort de chercher à comprendre. Et je ne vais jamais pêcher des bouts de code ici ou là dont l'assemblage ne peut qu'être hasardeux, et je n'ai jamais enregistré la moindre macro ! Le code doit être pensé en fonction de la réalisation entreprise et y être adapté du mieux possible.

Cordialement.

Bonjour,

Je suis désolé, ça marche pas chez moi. Pas parce que le code n'est pas bon, ... parce que je n'arrive pas à l'intégrer. Je m'explique :

Dans ma feuille des données il n'y a pas d'entête. Les données sont entrées de façon brute, dans la 1ère colonne, et j'aurai aimé que le travail se fait sur la même feuille à partir de la colonne 3. Je pourrai comparer les résultats aux données initiales; ensuite je supprimerai les données de la colonne 1.

Dans ta feuille il y a une ligne avec des renseignements dont je ne perçois pas la pertinence. "Documents à traiter" & "Nom classeur avec extension" & "Nom feuille" ... j'en fais quoi?

Ensuite tu as mis un bouton intitulé "Reclasser les données" dont le code est ":

Sub ReclasserDonnées()
End Sub

Vu que je n'ai pas compris comment entrer les données sur ta feuille, je l'ai fait à ma façon : j'ai copié toutes mes données que je les ai intégrées en colonne 1 de ta feuille à partir de A2 (ligne A : les titres). Bien sur ça doit pas être bon puisque ça ne marche pas.

Autre question : je te l'ai déjà dit : à part utiliser des Codes comme

Sub machin()
end Sub

Or Tu utilises un Code

Sub machin (ws as Worksheet)
End Sub

Pourquoi ce rajout ? Comment ça marche ? Est-ce que isolé, il peut se déclencher à l'aide d'un bouton?

Je peux comprendre ton agacement, tant pis. Néanmoins l'art de transmettre la connaissance c'est de s'adapter à l'ignorant afin qu'il puisse lui aussi voir un peu de lueur ! et en se rapprochant de cette lueur vague, il verra que c'est de plus en plus brillant Qu'est ce que je deviens philosophe ... même moi je suis surpris !

re Bonjour,

J'ai relu ce que tu as écris :

Tu mets les deux macros dans un classeur qui servira à ça. Sur la feuille du classeur un bouton auquel tu affectes cette macro de lancement. Sur la même feuille tu réserves la colonne D pour mettre le nom du classeur à traiter et la colonne E le nom de la feuille à traiter.

1e essai : J'ai copié toutes mes données. Je les ai collées sur MA feuille (sans ligne de titre). J'ai crée un bouton sur cette feuille et je lui ai affecté le Code

Sub ReclasserDonnées()
End Sub

Que les deux codes que tu m'as fournis soient sur ma feuille ou dans un module, ça marche pas

2e essai. J'utilise TA feuille. Je copie en cellule D2 : le nom de mon classeur (sans le = au début et terminant par .xlsm) et en E2 : Feuil2 (ou feuil2) (sans le = au début). Les deux classeurs sont ouverts. Il ne se produit q'une mise en forme (les bordures) des cellules en colonnes D à I. Sans contenu.

Voilà ... je vais les revoir !

Amicalement

HABD

C'est à se demander ! Tu ferais exprès de jouer à l'incompréhension, le résultat serait le même...

Je te fournis un classeur :

2017 07 02 153036

qui te montre une zone colorée en jaune sur deux colonnes. En intitulé en ligne 1 ces colonnes portent les mentions : 'Nom classeur' et 'Nom feuille'. Outre que j'ai fournir des explications, tu vas me dire que tu ne comprends que à partir de la ligne 2 tu peux lister des noms de classeurs et feuilles à traiter. Ce que l'on traite c'est le contenu d'une feuille (établi par tes soins). Il est logique d'indiquer le classeur qui la contient puisqu'elle ne se balade pas de façon isolée... Tu établis toi-même la liste de ce que tu as à traiter, tu peux avoir plusieurs classeurs, chacun contenant une ou plusieurs feuilles à traiter, ou bien un seul classeur avec une seule feuille.

Tu ouvres le ou les classeurs contenant des feuilles à traiter et c'est toi qui fixe ce que tu traites lors de ta session en le listant en colonne C et D...

Excuse-moi mais il faut être un peu vicieux devant cela pour aller mettre une liste en colonne A !

Les classeurs concernés étant ouverts, ta liste étant faite (et étant précisé qu'un nom de classeur inclut son extension (ce que chacun sait dès lors qu'il utilise Excel, mais il ne coûte rien de le rappeler ! ) Tu as à côté un bouton, assez gros pour ne pas passer inaperçu qui déclenchera l'opération au clic...

Ce bouton lance une macro ! (C'est en général le rôle dévolu à un bouton !) Et tu peux vérifier la macro affectée, mais je n'ai pas manqué de l'indiquer et d'en reproduire le code :

Sub ReclasserDonnées()
    Dim i%, wb$, ws$
    i = 2
    With ActiveSheet
        Do While .Cells(i, 4) <> "" And .Cells(i, 5) <> ""
            wb = .Cells(i, 4): ws = .Cells(i, 5)
            Reclasser Workbooks(wb).Worksheets(ws)
            i = i + 1
        Loop
        .Range("D2:E" & i).ClearContents
    End With
End Sub

Cette macro, d'une simplicité désarmante, va lire ta liste dans les colonnes C et D, au moyen d'une boucle sur chaque ligne, et à chaque inscription dans la liste, elle lance la procédure principale en lui fournissant l'indication de la feuille à traiter :

Reclasser Workbooks(wb).Worksheets(ws)

et elle va activer cette procédure autant de fois qu'il y a de feuilles dans ta liste, sans que tu aies autrement à intervenir.

En fin de liste, elle s'arrête et efface la liste ! Pour éviter une relance par inadvertance...

Je vois en fin de ton post (Excuses pour ne pas l'avoir noté plus tôt !) que tu en es finalement venu à utiliser le classeur que j'ai fourni (pour t'éviter d'avoir à le faire à partir d'indications littérales qui n'illustrent pas toute l'opération, rien ne t'empêche d'en refaire un à ton goût, mais tu as un modèle te permettant de voir la relation entre le listage en feuille et le contenu de la macro lancée par le bouton). L'avantage de cette procédure est que tu n'as éventuellement besoin d'adapter que la macro de lancement attachée au bouton et la procédure principale suit, sans qu'on ait à y toucher !

Tu imagines bien que j'ai pris 2 ou 3 secondes pour tester que cela fonctionnait avec ton modèle ! Le résultat est évidemment le même que précédemment.

Je ne dispose pas de plusieurs feuilles pour des essais en répétition, mais je viens de vérifier en dupliquant la feuille modèle, que le résultat est bien obtenu pour les deux feuilles...

Je n'exclue pas pour autant que cela puisse dysfonctionner dans d'autres situations, dysfonctionnement qui se manifesterait par le fait que certaines feuilles ne soient pas traitées... ce qui conduirait à introduire un peu de temporisation dans le déroulement...

Mais ce cas ne s'est pas pour le moment produit ! Tu fais état de deux feuilles où le traitement n'est pas effectué et où tu n'obtiens que des bordures !

Ce qui signifie que les feuilles ont bien été reconnues (puisqu'on a écrit dessus), et si les bordures coincident avec le nombre de lignes occupées, que le dimensionnement de la zone à traiter s'est effectué. C'est donc ensuite lors du parcours ligne par ligne que le tableau final n'aurait pu être rempli, ce qui signifie qu'il ne correspond pas à ton modèle cependant particulièrement précis et détaillé avec soin !

Une chose m'intrigue ! Tu fais état d'un report en colonne A de tes données lors d'un essai, et rien d'autre ! Or, et on y a particulièrement insisté lors de l'élaboration au départ. Tes lignes de données sont en colonne B et tu as en A un code de ligne. Et la procédure ignore les lignes dépourvues de code de ligne en A (même d'ailleurs de code de ligne qui ne commencerait pas par la lettre "A") et ne traite les ligne en B, avec inscription "Rien" ou le contenu extrait, que si elle trouve un code adéquat en A !

Cordialement.

Hello,

J'ai lu ce que tu as écris ... si tu ne me remontes pas trop les bretelles, je veux bien t'expliquer certaines choses !

C'est que mon classeur ... il a évolué entre-temps ! ... comme j'ai pu "créer" quelques codes. T'énerves pas !

Donc je fais un pré-trie de mes données. Les caractéristiques de mon nouveau classeur :

(1) Toutes les données sont en colonne 1, sans ligne de texte

(2) Toutes les lignes vides sont supprimées

(3) Chaque fois qu'une ligne ne contient qu'un horaire, cette ligne est suivie par une ligne commençant pas (urgence). Ces deux lignes sont fusionnées, commençant par l'horaire et la 2e ligne est supprimée

Donc, il n'y plus le terme RIEN ni de lignes vides et toutes les lignes commencent par un horaire format 14:45

Dernière précision, j'ai vu que certaines lignes contiennent des erreurs de frappe :

09:20 (urgence) PATIENT Jonathan 29/03/1956 BR - Viscéral - Appendicectomie coelio 1h51 C: CHIRURGIEN Christophe A: ANESTHESISTE Aida / aucun/

(tu as du remarquer que cette ligne a été fusionnée déjà et elle commence bien par un horaire !)

Cette ligne est la ligne idéale. Elle contient bien les repères A: et C:

Or pas toutes les lignes sont ainsi :

07:40 PATIENT Jean louis 18/09/1934 BR - Orthopédie - Epaule prothèse totale Traumatique 3h27 C: CHIRURGIEN JEAN-PAUL / AG + ALR/ droit/

Ici il n'y a pas de A: ... pas parce qu'il n'y avait pas d'anesthésiste ... on a oublié de renseigner les cases !

Donc le repère A: est à oublier. Ceci dit, il n'est pas important dans notre étude.

Je comprend que cela va t'agacer que les choses ont été modifiées entre temps ... c'était un oubli de ma part ... je m'en excuse.

Amicalement

Rechercher des sujets similaires à "extraire donnees lignes separer colonnes"