[VBA] Problème Tri alpha (3 lignes)

Staple1600

XLDnaute Barbatruc
Bonsoir le forum


Dans le cadre de la création d'un annuaire
(format imposé)

Je suis confronté au problème suivant:

Les données sont saisies dans un userform
puis reportées dans la feuille adéquate
(en se basant sur la première lettre du nom)
dans la première cellule vide de la colonne A

Or comme les données s'incrivent sur trois lignes
je ne peux donc pas opérer de tri alphabétique.

Dans la version ci-jointe j'ai essayé d'utiliser chr(10)
pour mettre les données sur une seule ligne
mais dans ce cas je perds le format.

Vous trouverez dans l'userform1 deux macros liées au bouton Valider
(celle qui est active est celle qui insère les données sur 3 lignes
l'autre est commentée)

Est-il possible d'opérer un tri alphabétique en identifiant la ligne ou insérer les nouvelles données?
La macro identifierait la ligne contenant le nom précedant, insérerait 3 lignes puis dans
ces 3 nouvelles lignes,les données de l'userform.

Je ne vois pas comment faire autrement.

Merci de votre aide et bonne soirée à tous

Staple

PS: pour tester n'utiliser que des noms allant de A à C
 
Dernière édition:

Luki

XLDnaute Accro
Re : [VBA] Problème Tri alpha (3 lignes)

Bonsoir Staple,

tu envisage d'insérer directement à l'endroit voulu, pour ma part, je m'orienterais vers cette solution: cancaténer le valeurs des 3 cellules dans une seule, faire le tri puis redistribuer le tout.
ou via une variable tablo, trier et redistribuer le tout , ou encore via une collection.

A voir ce qui semble le plus fiable et le plus simple...
 

Staple1600

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Bonsoir Luki (et merci de ton intérêt)
Code:
Private Sub cmbValidez_Click()
Dim X As String
Dim Y As String
Dim DerLig As Integer
X = UCase(Left(tbNom, 1))
Y = X & " ."
DerLig = Sheets(Y).Range("A65536").End(xlUp).Row
Sheets(Y).Cells(DerLig + 1, 1).Value = tbNom & Chr(10) & tbAdresse & Chr(10) & tbTel
Sheets(Y).Cells(DerLig + 1, 2).Value = tbCPville & Chr(10) & tbPort
Sheets(Y).[A1].CurrentRegion.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Me.Hide
End Sub

Avec ce code j'insère les données dans une seule cellule
puis trie la feuille active

Mais comment faire pour ensuite identifier la ligne ou insérer 3 lignes
et scinder la cellule sur trois lignes?

C'est là que je bloque pour le moment
 

Luki

XLDnaute Accro
Re : [VBA] Problème Tri alpha (3 lignes)

re,
Autre approche qui me semble assez simple(un peu de code certes, mais bon:D)
  1. Tu colles le nouveau nom et ses champs dans ta feuille
  2. Tu extrais les noms seuls dans une feuille temporaire :en col1, le nom en col2, une clé éventuellement(plus précis)
  3. tu tries
  4. tu regardes où est ton nom ou ta cle ( voir comment la mémoriser avant, ce serait plus simple
  5. dans ta feuille d'origine, tu supprimes le nom et ses champs ajouté et tu les insères à la bonne position.
Quelque chose comme ça....:rolleyes:
 

Cousinhub

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Bonsoir Staple, re Ludi (Edit : euh, luKi)

tu pourrais t'inspirer de ce code :

Sub Macro18()
X = [a65000].End(xlUp).Row - 1
Columns("A:A").Insert Shift:=xlToRight
For i = 1 To X Step 3
Range(Cells(i + 1, 1), Cells(i + 3, 1)).Value = Cells(i + 1, 2).Value
Next i
Range("A2:D" & X + 1).Sort Key1:=Range("A2"), Order1:=xlAscending
Columns("A:A").Delete Shift:=xlToLeft
End Sub

Peut-être?

Edit le smiley...
le code : Range("A2 : D " & X + 1) sans les espaces
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

ReBonsoir à tous

Sans avoir encore lu (et tester) la proposition de bhbh
Code:
Private Sub cmbValidez_Click()
'Version en test
Dim X As String
Dim Y As String
Dim LigneIns As Integer
'Dim tbNom As String
Dim DerLig As Integer
X = UCase(Left(tbNom, 1))
Y = X & " ."
DerLig = Sheets(Y).Range("A65536").End(xlUp).Row
Sheets(Y).Cells(DerLig + 1, 1).Value = tbNom & Chr(10) & tbAdresse & Chr(10) & tbTel
Sheets(Y).Cells(DerLig + 1, 2).Value = tbCPville & Chr(10) & tbPort
Sheets(Y).[A1].CurrentRegion.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
[B]LigneIns = Sheets(Y).Cells.Find(What:=tbNom, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False).Row + 1[/B]
[B]Sheets(Y).Cells(LigneIns, 1).EntireRow.Insert
Sheets(Y).Cells(LigneIns + 1, 1).EntireRow.Insert[/B]
Me.Hide
End Sub

La je trie et j'insère deux lignes à la bonne place
mais pour scinder le contenu de la cellule?

Je vais tester la marco de bhbh de ce pas.


Merci encore de vos contributions.

Ps: Précisions
Je n'ai pas le choix de formater le classeur d'une autre manière quedans le fichier joint

cad:
en ligne n: NOM PRENOM
en ligne n+1: Adresse, ligne (n+1,colonne 2) : CP VILLE
en ligne n+2: telephone, ligne (n+2, colonne 2): portable


Staple
 
Dernière édition:

Catrice

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Bonsoir,

Ci-joint une solution à tester dans l'onglet "C ."
Il s'agit d'une colonne supplémentaire (à rajouter par macro ou non, à masquer ou non) qui contient une formule qui affiche le Nom sur 3 lignes.
Ne reste plus ensuite qu'à trier en utilisant comme clé cette colonne.
Pour tester se placer en C2 par exemple et cliquer sur les fleches de tri ...
 

Pièces jointes

  • testANNU1.xls
    44 KB · Affichages: 87
  • testANNU1.xls
    44 KB · Affichages: 70
  • testANNU1.xls
    44 KB · Affichages: 67

Luki

XLDnaute Accro
Re : [VBA] Problème Tri alpha (3 lignes)

Re, staple, bhbh,bonjour catrice

mais pour scinder le contenu de la cellule?
Fonction split qui te renvoie un tableau des chaines séparées par le caractère de ton choix:

tablo = split(string,chr(10))

Edit: je vous laisse pour ce soir, bonne nuit ;)...
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Re


-> Catrice:
OK pour la colonne supplémentaire pour le tri

Le problème est que l'annuaire contiendra 26 feuilles
avec chacune de 10 à 50 lignes

Ce qui fera autant de formules

Cela risque d'alourdir le classeur à force non?

->Luki (l'annuaire est destiné à un poste sous XL97 et sous windows 95 snif)
et je crois que split n'est disponible qu'à partir d'xl2000
mais j'ai vu une fonction slipt pour 97 quelquepart sur le net


PS: ma macro précédente après test ne fonctionne pas correctement.
 
Dernière édition:

Luki

XLDnaute Accro
Re : [VBA] Problème Tri alpha (3 lignes)

Une dernière réflexion avant dodo:

J'essaie toujours d'anticiper l'évolution d'un projet quand je développe (surtout pour moi et mes demandes n'arrêtent pas d'évoluer :D)

Alors, imaginons qu'il faille transférer cet annuaire vers ACCES ou OUTLOOK ou n'importe où. Le fait de ne pas avoir les données en table risque de poser de sérieux problèmes. (A moins que tu ne soit payé à la ligne de code! :D bingo!).

Donc, ne serait t-il pas plus judicieux de créer toute la base dans une feuille cachée, puis de trier et ventiler les données dans les différentes feuilles au bon format, bonnes lignes etc. lors de l'activation de la feuille par exemple.

C'est ce que j'ai fait pour la récupération de données de débits de bois en fonction des unités (m,m2,m3 etc) et ça marche plutôt bien.

Voili, voilou.

Sur ce, bonne nuit. ;) ( j'ai déjà un oeil fermé)
 

Catrice

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Re,

Ca ne fait que 1300 cellules. A tester...
Mais comme tu passes par macro, tu peux facilement insérer ces formules par macro temporairement, faire le tri et effacer les formules => fichier léger ;)

Insérer une formule sur 50 lignes, peu de pb de performances

Enfin, la derniere solution c'est =A5 dans 3 cellules à recopier en incrementé.
C'est plus léger.

Edit : Quitte à faire du code, je ferais plutot comme le propose Luki. Un format de base classique sur lequel on a moins de risque de faire des mauvaises manip et des macros qui ventilent tout ça dans des onglets pour le coté esthétique.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Re à tous

J'ai suivi a peu près le même cheminement que toi (Catrice)
Code:
Private Sub cmbValidez_Click()
Dim X As String
Dim Y As String
Dim DerLig As Integer
X = UCase(Left(tbNom, 1))
Y = X & " ."
Application.ScreenUpdating = False
DerLig = Sheets(Y).Range("A65536").End(xlUp).Row
Sheets(Y).Cells(DerLig + 1, 1).Value = tbNom
Sheets(Y).Cells(DerLig + 1, 1).Font.Bold = True
Sheets(Y).Cells(DerLig + 2, 1).Value = tbAdresse
Sheets(Y).Cells(DerLig + 2, 2).Value = tbCPville
    With Sheets(Y).Cells(DerLig + 3, 1)
        .Value = Right(tbTel, 9)
        .NumberFormat = """Téléphone: ""00\.00\.00\.00\.00"
        .HorizontalAlignment = xlLeft
    End With
    With Sheets(Y).Cells(DerLig + 3, 2)
        .Value = Right(tbPort, 9)
        .NumberFormat = """Portable: ""00\.00\.00\.00\.00"
        .HorizontalAlignment = xlLeft
    End With
Sheets(Y).Range("D2:D" & DerLig + 3).FormulaR1C1 = _
        "=INDIRECT(CHOOSE(MOD(ROW(),3)+1,""L(-1)C(-3)"",""L(-2)C(-3)"",""LC(-3)""),FALSE)"
Sheets(Y).[A1].CurrentRegion.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets(Y).Columns("D:D").Delete Shift:=xlToLeft
Sheets(Y).[A1].Select
Application.ScreenUpdating = True
Unload UserForm1
End Sub

Cela semble fonctionner correctement

Merci de ton aide Catrice

Pour ce qui est de suivre l'idée de Luki, je suis moins à l'aise.

edit: -> Luki
Je ne suis pas l'utilisateur final du classeur.
Cet annuaire sous Excel n'est que la transcription d'un annuaire papier.
Il a été commencé par une autre personne
J'ai juste ajouté l'userform pour faciliter la saisie et automatiser le tri alphabétique
On me demande juste de conserver la présentation telle quelle.
(cad sur trois lignes)

Je vois a peu près ce dont tu parles
Pourrais-tu joindre un exemple anonymisé de ton fichier débits bos, stp?
Que je me rende compte plus précisement du mode de fonctionnement que tu préconises.

Merci à toi.





Mais je reste preneur de tout conseil, d'autres pistes, ou de simplification du code présent
dans ce post.

Merci à tous et bonne nuit.


Staple
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Problème Tri alpha (3 lignes)

Bonsoir à tous

->bhbh (merci de ta contribution)
ton chemimenent m'intèresse également
Merci pour l'ajout de vérification des saisies

Par envie de me compliquer la tâche (et pour progresser en VBA)

j'essaierai bien de poursuivre l'idée de Luki

(en créant un bd en en visualisant les données dans un userform)
(et en ajoutant un userform pour modification)

Je vais chercher sur le forum si un ou des sujets similaires ont été traités.

Je ne manquerai pas de revenir vers vous en cas de soucis.

Merci à tous pour vos conseils et aides.

Pour ce qui est de l'annuaire, je pense qu'il conviendra dans sa version actuelle à celui qui me l'a demandé.

Mais je reste preneur de tout conseil ou autre approche.

Bonne soirée

Staple
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 107
Membres
103 120
dernier inscrit
83400ren