Faire la mise en page à partir de VB [Résolu]

Messages postés
9
Date d'inscription
mercredi 18 novembre 2009
Statut
Membre
Dernière intervention
21 février 2012
- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 21 févr. 2012 à 10:15
Bonjour,
Je vous expose mon problème. J'ai un fichier Excel contenant les données que je dois mettre en page. Pour le moment, j'ai réussi à extraire les données en fonction des sites, retirer les valeurs inutiles et mis en pleu et/ou en gras certaines données.
Maintenant que mon fichier est "nettoyé" j'aimerai savoir si il est possible de faire en Vb la mise en page suivante.
En colonne A : J'ai le titre
En colonne B : Le sous titre
En colonne C : Le 2 ème sous titre
Puis dans les colonnes suivantes les données. (D à N)
J'aimerai que mon programme prenne la premiere donnée dans la colonne A
Qu'il ecrive à la ligne suivante la valeur rencontrée en colonne B
Puis celle en colonne C
En enfin le reste des données en ligne
La seconde valeur en colonne C sur une nouvelle ligne
puis les données (D à N) En ligne
et ce jusqu'a ce qu'il rencontre une nouvelle valeur en B ou En A
Si il rencontre une nouvelle valeur en B alors noter cette valeur
puis celle de C à la ligne suivante
puis les données
et ainsi de suite jusqu'à la fin de mon fichier

Je ne sais pas si ce que j'essai d'expliquer est très clair.


Voilà le début de programme que j'ai déjà écrit avec de l'aide :



Sub CreationOnglets()
Dim Reponse As Integer
Dim Rw As Range
Dim Ligne As Long
Dim destination As Worksheet

Sheets("BASE COMMUNE_TRIEE").Select
ActiveCell.SpecialCells(xlLastCell).Select
Range(Selection, Cells(1)).Select
Reponse = InputBox("De quel centre voulez-vous créer le livret ? (1 St Brevin-2 Pornic 0 Aucun)")

For Each Rw In Selection.Rows
Ligne = Rw.Row

If Reponse = 1 Then
If Rw.Cells(1, 13).Value = "M" Then
Rw.Copy destination:=Worksheets("St-Brevin").Cells(Ligne, 1).EntireRow
End If
End If
If Reponse = 2 Then
If Rw.Cells(1, 12).Value = "P" Then
Rw.Copy destination:=Worksheets("PORNIC").Cells(Ligne, 1).EntireRow
End If
End If

Next Rw


Call mise_enforme
'Call suppr_blanc


MsgBox "Le fichier est prêt. Veuillez le vérifier.", vbOKOnly, "Macro terminée"


End Sub
 
Function mise_enforme()

Dim derlig As Long, i As Long, x As Integer

  With Sheets("St-Brevin")
    derlig = .Range("A" & Rows.Count).End(xlUp).Row
      For i = derlig To 2 Step -1

       If .Range("A" & i).Value = .Range("A" & i - 1).Value Then
         .Range("A" & i).Value = ""
         .Range("A" & i - 1).Font.ColorIndex = 5
         .Range("A" & i - 1).Font.Bold = True
      End If
      If .Range("B" & i).Value = .Range("B" & i - 1).Value Then
        .Range("B" & i).Value = ""
        .Range("B" & i - 1).Font.ColorIndex = 5

      End If
          If .Range("E" & i).Value = .Range("E" & i - 1).Value Then
        .Range("E" & i).Value = ""
      End If
    Next
  End With
  
  With Sheets("PORNIC")
    derlig = .Range("A" & Rows.Count).End(xlUp).Row
      For i = derlig To 2 Step -1

       If .Range("A" & i).Value = .Range("A" & i - 1).Value Then
         .Range("A" & i).Value = ""
         .Range("A" & i - 1).Font.ColorIndex = 5
         .Range("A" & i - 1).Font.Bold = True
      End If
      If .Range("B" & i).Value = .Range("B" & i - 1).Value Then
        .Range("B" & i).Value = ""
        .Range("B" & i - 1).Font.ColorIndex = 5

      End If
          If .Range("E" & i).Value = .Range("E" & i - 1).Value Then
        .Range("E" & i).Value = ""
      End If
    Next
  End With


 End Function
 Function InsereLigne()
 Dim sh As Worksheet
 Dim i As Integer
 
 
    With Sheets("St-Brevin")
    derlig = .Range("B" & Rows.Count).End(xlUp).Row
      For i = derlig To 2 Step -1

       If .Range("B" & i).Value <> " " Then
         .Range("B" & i - 1).EntireRow.Insert Shift:=xlShiftDown
      End If
    Next
  End With
End Function




Quelqu'un pourrait il me dire si ce que je veux faire est possible et comment faire. Cela me rendrait vraiment un énorme service car là je suis un peu bloquée.
Je vais essayer en insérant une fonction qui insere une ligne au dessus de la 1ère valeur rencontrée et fasse ensuite un copier coller des données mais je ne suis pas sure de choisir la meilleure option.



j'aurai aimé vous joindre un bout de la base de données excel pour que ma question soit plus claire mais malheureusement je ne sais pas comment faire.

Je vous remercie d'avance pour votre aide
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
3
Merci
Je reviens, lis ...
T'es pas dégourdi

Si j'en crois ce que tu as montré et dit de ta feuille ===>>

With Sheets("St-Brevin")
    premlig = 2
    derlig = .Range("A" & Rows.Count).End(xlUp).Row
    For i = derlig To premlig Step -1
      If .Range("A" & i) <> "" Then
        .Range("A" & i).EntireRow.Insert Shift:=xlShiftDown
        .Range("B" & i).Value = Range("A" & i + 1).Value
      End If
    Next
    .Columns(1).Delete
  End With


Ce n'est pas cela, que tu voulais ?

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Bonjour,
Tes explications ne sont pas vraiment claires, notamment ces passages :
En enfin le reste des données en ligne

en quelle "ligne" ?
Pas vraiment clair et assez confus.
La seule chose que je commence à voir, c'est la partie consistant à transposer en lignes d'une colonne les colonnes d'une ligne
Intéresse-toi donc à la fonction transpose de Worksheetfunction.
Regarde ce que fais ceci, par exemple
  Range("A1:A3") = WorksheetFunction.Transpose(Range("A1:c1"))

Je ne verrai le reste que lorsque tu auras su l'exprimer techniquement, avec concision et la plus grande précision

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
9
Date d'inscription
mercredi 18 novembre 2009
Statut
Membre
Dernière intervention
21 février 2012
0
Merci
Je vais essayer de m'espliquer un peu mieux. Pour cela j'ai tenter d'illustrer ce que j'avais et ce que je voulais. Pas évident car le plus simple aurait été de pouvoir montrer mon exemple avec une feuille excel mais je n'ai pas trouver comment le faire donc j'ai du bricoler.

Donc dans ma base de données j'ai les informations suivantes : groupe(en colonne A),sous groupe1 (en colonneB), sous groupe2 (en colonne C), liste (colonne D),medicaments(colonne E),dosage(colonne F),forme(colonne g),dci(colonne H),prix(colonne I),info(colonne J).

Mon fichier de départ se présente sous la forme suivante :

[*groupe ss g 1 ss g 2 liste medicaments dosage forme dci prix info
groupe1 ssg1a stupéfiant nom1 5 mg g dci1 0,074
groupe1 ssg1a stupéfiant nom1 10 mg g dci1 0,093
groupe1 ssg1a stupéfiant nom1 20 mg g dci1 0,167
groupe1 ssg1a stupéfiant nom2 12µg/h patch dci2 0,44
groupe1 ssg1a stupéfiant nom2 25µg/h patch dci2 0,6275
groupe1 ssg1a stupéfiant nom3 LP 10mg g dci3 0,068
groupe1 ssg1a stupéfiant nom3 LP 30mg g dci3 0,121
groupe1 ssg1a stupéfiant nom3 LP 60mg g dci3 0,184
groupe1 ssg1a stupéfiant nom3 LP100mg g dci3 0,341
groupe1 ssg1a stupéfiant nom4 10mg/1ml amp dci4 0,22
groupe1 ssg1a stupéfiant nom4 20mg/1ml amp dci4 0,24
groupe1 ssg1a stupéfiant nom4 100mg/10ml amp dci4 1,02
groupe1 ssg1a Liste II nom4 300mg/10mg/30mg g dci5 0,75
groupe1 ssg1a Liste II nom4 500mg/15mg/50mg sup dci5 0,2
groupe1 ssg1a Liste I niom5 37,5mg/325mg comp dci5 0,06
groupe1 ssg1a Liste I nom6 50 mg g dci6 0,035
groupe1 ssg1a Liste I nom6 LP 100mg comp dci6 0,065
groupe1 ssg1a Liste I nom6 LP 150mg comp dci6 0,09
groupe1 ssg1a Liste I nom6 LP 200mg comp dci6 0,115
groupe1 ssg1a Liste I nom6 100mg/ml flacon 1,95
groupe1 ssg2a Liste I nom7 30mg/400mg g dci7 0,03 ? Arrêt de commercialisation au cours de l'année 2010
groupe1 ssg2a Liste I nom8 500mg/30mg comp dci8 0,48
groupe1 ssg3a nom9 20mg/ml sus dci9 1,4
groupe1 ssg3a nom10 500mg g dci10 0,012
groupe1 ssg3a nom11 150mg sup dci10 0,06
groupe1 ssg3a nom11 300mg sup dci10 0,07
groupe1 ssg3a nom11 1000mg sup dci10 0,09
groupe1 ssg3a nom14 1g/100ml injectable dci10 1,55 RH
groupe1 ssg4a Liste II nom15 5% crè dci11 2,1
groupe1 ssg4a Liste II nom16 2% flacon dci12 0,8
groupe1 ssg4a Liste II nom17 2% gel dci13 2,79 NS
groupe1 ssg4a Liste II nom17 2% visqueuse gel dc14 2,11
groupe2 ssg5a Liste I nom18 100mg comp dci15 19,44383
groupe2 ssg5a Liste I nom19 500mg capsule dci16 0,203
groupe2 ssg5a Liste I nom20 2,5mg comp dci17 0,19
groupe3 ssg5a nom21 1% crè dci18 0,5841
groupe3 ssg5a nom21 1% émulsion 30ml dci19 0,7354
groupe3 ssg5a nom21 1% solution en spray dci19 1,18
groupe3 ssg5a nom21 1% poudre 30g dci19 0,9369
groupe3 ssg8a a) Non stéroïdiens nom22 1% gel dci20 0,86
groupe3 ssg8a a) Non stéroïdiens nom23 1% compresse dci20 1,36 non agréé
groupe3 ssg8a b) Steroïdiens Groupe I (activité très forte) Liste I nom24 0.5% crè dci21 1,34
groupe3 ssg8a b) Steroïdiens Groupe II (activité forte) Liste I nom25 0.1% crè dci22 0,71
groupe3 ssg8a b) Steroïdiens Groupe II (activité forte) Liste I nom26 0.1% crè dci22 1,15
groupe3 ssg8a b) Steroïdiens Groupe II (activité forte) Liste I nom26 0.1% pom dci22 0,71
groupe3 ssg8a b) Steroïdiens Groupe II (activité forte) Liste I nom26 0.1% pom dci22 1,15
]


LE PETIT PROGRAMME VB QUE J'AI DEJA ME PERMETde les copier sur la page resultat et de N'AVOIR PLUS QU'UNE FOIS,LE TITRE, les sous titres et le nom des produits. Il permet également de les écrire en bleu et gras [color=red]/color
après le passage de mon programme Vb il devient ainsi :

groupe1 ssg1a stupéfiant nom1 5 mg g dci1 0,074
------------- stupéfiant ---- 10 mg g dci1 0,093
------------- stupéfiant ---- 20 mg g dci1 0,167
------------- stupéfiant nom2 12µg/h patch dci2 0,44
------------- stupéfiant ---- 25µg/h patch dci2 0,6275
------------- stupéfiant nom3 LP 10mg g dci3 0,068
------------- stupéfiant ---- LP 30mg g dci3 0,121
------------- stupéfiant --- LP 60mg g dci3 0,184
------------- stupéfiant ---- LP100mg g dci3 0,341
------------- stupéfiant nom4 10mg/1ml amp dci4 0,22
------------- stupéfiant ---- 20mg/1ml amp dci4 0,24
------------- stupéfiant ---- 100mg/10ml amp dci4 1,02
--------------- Liste II --- 300mg/10mg/30mg g dci5 0,75
--------------- Liste II --- 500mg/15mg/50mg sup dci5 0,2
--------------- Liste I niom5 37,5mg/325mg comp dci5 0,06
--------------- Liste I nom6 50 mg g dci6 0,035
--------------- Liste I --- LP 100mg comp dci6 0,065
--------------- Liste I --- LP 150mg comp dci6 0,09
--------------- Liste I --- LP 200mg comp dci6 0,115
--------------- Liste I --- 100mg/ml flacon 1,95
--------- ssg2a Liste I nom7 30mg/400mg g dci7 0,03
--------- ---- Liste I nom8 500mg/30mg comp dci8 0,48
--------- ssg3a nom9 20mg/ml sus dci9 1,4
---------- ---- nom10 500mg g dci10 0,012
---------- ---- nom11 150mg sup dci10 0,06
---------- ---- ----- 300mg sup dci10 0,07
---------- ---- ----- 1000mg sup dci10 0,09
---------- ---- nom14 1g/100ml injectable dci10 1,55
--------- ssg4a Liste II ---------- ---- nom15 5% créme 5g dci11 2,1
--------------- Liste II nom16 2% flacon dci12 0,8
--------------- Liste II nom17 2% gel dci13 2,79
--------------- Liste II ----- 2% visqueuse gel dc14 2,11
groupe2 ssg5a Liste I nom18 100mg comp dci15 19,44383
--------------- Liste I nom19 500mg capsule dci16 0,203
--------------- Liste I nom20 2,5mg comp dci17 0,19
groupe3 ssg5a nom21 1% crè dci18 0,5841


Maintenant ce que j'aimerai obtenir me semble plus compliqué et difficile à exprimer. J'espère donc que mon illustration est assez claire.

et voici ce que j'aimerai obtenir au final :

[b]groupe1
ssg1a/b
-----stupéfiant nom1 5 mg g dci1 0,074
-----stupéfiant ---- 10 mg g dci1 0,093
-----stupéfiant ---- 20 mg g dci1 0,167
-----stupéfiant nom2 12µg/h patch dci2 0,44
-----stupéfiant ---- 25µg/h patch dci2 0,6275
-----stupéfiant nom3 LP 10mg g dci3 0,068
-----stupéfiant ---- LP 30mg g dci3 0,121
-----stupéfiant --- LP 60mg g dci3 0,184
-----stupéfiant ---- LP100mg g dci3 0,341
-----stupéfiant nom4 10mg/1ml amp dci4 0,22
-----stupéfiant ---- 20mg/1ml amp dci4 0,24
-----stupéfiant ---- 100mg/10ml amp dci4 1,02
-----Liste II --- 300mg/10mg/30mg g dci5 0,75
-----Liste II --- 500mg/15mg/50mg sup dci5 0,2
-----Liste I niom5 37,5mg/325mg comp dci5 0,06
-----Liste I nom6 50 mg g dci6 0,035
-----Liste I --- LP 100mg comp dci6 0,065
-----Liste I --- LP 150mg comp dci6 0,09
-----Liste I --- LP 200mg comp dci6 0,115
-----Liste I --- 100mg/ml flacon 1,95

ssg2a
-----Liste I nom7 30mg/400mg g dci7 0,03
-----Liste I nom8 500mg/30mg comp dci8 0,48
ssg3a
----- ----- nom9 20mg/ml sus dci9 1,4
----- ----- nom10 500mg g dci10 0,012
----- ----- nom11 150mg sup dci10 0,06
----- ----- ----- 300mg sup dci10 0,07
----- ----- ----- 1000mg sup dci10 0,09
----- ----- nom14 1g/100ml injectable dci10 1,55
ssg4a
-----Liste II nom15 5% créme 5g dci11 2,1
-----Liste II nom16 2% flacon dci12 0,8
-----Liste II nom17 2% gel dci13 2,79
-----Liste II ----- 2% visqueuse gel dc14 2,11
groupe2
ssg5a
-----Liste I nom18 100mg comp dci15 19,44383
-----Liste I nom19 500mg capsule dci16 0,203
-----Liste I nom20 2,5mg comp dci17 0,19
groupe3
ssg5a
----- ----- nom21 1% crè dci18 0,5841


Je vous remercie à l'avance de votre aide.
Commenter la réponse de titamy
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Ben mon vieux...
Clair, comme explications ? heu ...
Bon ...
Ce qu'il me semble avoir compris :
- tu as trois colonnes, la première pour des groupes, la seconde pour des sous-groupes et la troisième pour les données de chaque article du sous-groupe
- tu souhaiterais ne plus avoir que deux colonnes : celles des sous-groupes et de la donnée, dans le sous-groupe, de chaque article du sous-groupe. Mais tu voudrais, dans cette colonne, intercaler entre chaque sous-groupe une ligne reprenant le nom du groupe initial.

Si c'est bien cela :
- comment se fait-il que j'arrive à l'exprimer ainsi et pas toi, dont c'est l'appli ? (bizarre, hein !)
- tes données sont-elles déjà triées sur ta feuille de calcul ? et si oui : comment EXACTEMENT (réponse uniquement technique, s'il te plait, sinon je ne lirai même pas).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
9
Date d'inscription
mercredi 18 novembre 2009
Statut
Membre
Dernière intervention
21 février 2012
0
Merci
oui c'est à peu près ce que je veux. J'ai exactement 13 colonnes de données. Elles sont triées dans la feuille excel par groupe (donc en colonne A) et sous groupe (en colonne B) et nom du produit (en colonne E).

Ce que je veux c'est que le progamme écrive en première ligne le groupe, en seconde ligne le sous groupe et en troisième ligne les informations concernant les produits appartenant à ces 2 groupes. Bien entendu il y a plusieurs produits correspondant.

Je te remercie du temps que tu m'accorde car je suis conciente de ne ^pas être claire du tout dans mes explications.
Commenter la réponse de titamy
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Tu n'as toujours pas répondu à une question pourtant claire :
Bis repetita, donc, mais pour la dernière fois (je ne transformerai pas cette discussion en un jeu de questions/réponses sans fin) :
tes données sont-elles déjà triées sur ta feuille de calcul ? et si oui : comment EXACTEMENT (réponse uniquement technique, s'il te plait, sinon je ne lirai même pas).

Ou tu réponds, complètement et clairement, ou je te laisse seul. Compris ?

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
9
Date d'inscription
mercredi 18 novembre 2009
Statut
Membre
Dernière intervention
21 février 2012
0
Merci
mes données sont triées dans ma feuille excel par groupe dans l'ordre croissant puis par sous groupe dans l'ordre croissant également.

je pense cette fois avoir réussi à répondre à ta question

Désolé d'être un peu bête et de ne pas tout comprendre
Commenter la réponse de titamy
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Mécanisme alors (très simple, tu verras).
-------------------------------------- étape 1 -------------------------------------------
boucler de haut en bas, de la première ligne à la dernière ligne de ta plage et :
- si cellule colonne A est vide : y mettre le contenu de la cellule qui la précède
- si cellule de la colonne B est vide : y mettre le contenu de la colonne qui la précède
Sauras-tu au moins faire cette première étape ?
Essaye d'abord et montre-nous le code tenté pour y parvenir si tu n'y es pas parvenu.



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
ou mieux encore :
de la dernière ligne, en remontant vers la première :
si cellule colonne B non vide : insérer une ligne au-dessus et y mettre en colonne B son contenu
si cellule colonne A non vide : insérer une ligne au-desus et y mettre en colonne B son contenu

Vas-y.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
9
Date d'inscription
mercredi 18 novembre 2009
Statut
Membre
Dernière intervention
21 février 2012
0
Merci
c'est un peu ce que j'ai tenté de faire mais bon pas terrible mon résultat car mon programme insère une ligne partout et pas uniquement quand A est vide. De plus, je copie bien la valeur de la cellule A mais plutot que de la copier la couper chose que je ne sais pas faire:

 Function InsereLigne()
 Dim i As Integer

   With Sheets("St-Brevin")
    derlig = .Range("A" & Rows.Count).End(xlUp).Row
      For i = derlig To 2 Step -1

       If .Range("A" & i).Value <> " " Then
          .Range("A" & i - 1).EntireRow.Insert Shift:=xlShiftDown
            End If
       If .Range("A" & i).Value <> " " Then
        
          .Range("A" & i - 1).Value = .Range("A" & i).Value
      End If
    Next
  End With
End Function

Commenter la réponse de titamy
Messages postés
9
Date d'inscription
mercredi 18 novembre 2009
Statut
Membre
Dernière intervention
21 février 2012
0
Merci
c'est tout à fait ce que je veux. Merci pour ton aide

Bonne journée
Commenter la réponse de titamy
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Bien.
Tu sais quoi ? ===>> ce n'est pas le style de code, qui te manquait, mais juste une petite réflexion.
Du genre :
je mets devant moi, au sol, une allumette rouge en 1er rang, une verte en second et une bleue en troisième rang.
Quel est le nouveau rang de l'allumette bleue si j'ajoute, n'importe où avant elle, une allumette jaune ?
Et tu avais ta réponse ===>> et donc ton code, sans moi.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu