Tri alphabétique particulier
Bonjour,
Je cherche à savoir comment il est possible de trier par ordre alphabétique les données dans la pièce jointe.
Cependant j'ai quelques règles à respecter:
- le tri commence à partir de la ligne 4
- les lignes [contactX] ne doivent pas bouger
- l'ordre alphabétique doit être fait à partir des lignes commencent par 0= (lignes 4-8-12-16)
- les trois lignes commençant par 1 - 2 et 3 en dessous doivent suivre le tri
La liste doit évoluer et je dois donc pouvoir effectuer ce tri à la demande.
Cette liste est utiliser dans un poste radioamateur, je dois donc par la suite l'enregistrer en mode .txt
que je mets également en PJ
Merci pour votre aide.
gaetan
Bonsoir,
J'avais décidé de répondre à ta demande... mais j'ai dû m'interrompre !
Ta demande était précise, malgré une erreur (sur les lignes déjà !
stipulant bien la présence des lignes 0-1-2-3 pour chaque contact...
Or la macro a planté sur le contact 370 pour lequel il manque une ligne (ligne 3) !
J'ai introduit un test sur le nombre de lignes au démarrage pour que ça stoppe si le nombre de lignes n'est pas conforme.
Mais il faudrait tout de même savoir si le risque d'erreurs dans le fichier source est susceptible d'exister ou s'il n'a pas lieu d'être.
Dans ce dernier cas, on arrête et on attend un nouveau fichier txt conforme ! Ce que je fais !
Dans le premier, si on veut traiter, cela impose une vérification ligne par ligne et des modifications en cas d'erreurs pour pouvoir le traiter, ce qui allongera le traitement...
Cordialement.
Bonjour MFerrand,
En premier lieu merci pour ton aide!
Le fichier .txt est une extraction de mon poste radio, donc je suppose que cela puisse varier en fonction des contacts incrémenté dans la mémoire de celui-ci.
Dans le premier, il est peut être possible de lancer le contrôle de ligne et en fonction de l erreur, rajouter une ligne temporaire,commençant par un 8, et en faisant une seconde macro pour supprimer l'ensemble des lignes commençant par 8...
J ai les idées mais pas la méthode... Comme je dis souvent à d'autres sur d'autres sujets, il faut faire avec ta bouche et mes bras
Et bien aujourd'hui hui, c est avec MA bouche et tes bras
Encore merci de ton aide qui servira à une communauté de passionné de radiocommunication.
Bon week-end
Gaetan
Je suis retombé sur ma macro que j'avais oubliée !
Je l'ai modifiée pour qu'en cas d'anomalie (la détection d'anomalie ne porte que sur le nombre de lignes qui doit être un multiple de 5 +2 lignes, il peut y avoir des anomalies aboutissant à respecter un nombre de lignes conforme et qui ne seront donc pas détectées...) en cas d'anomalie détectée donc, cela est signalé à l'utilisateur, qui peut lancer une procédure annexe ou non.
La proc. annexe teste alors toutes les lignes du fichier en remontant en fonction de modèles : 3=* 2=* 1=* 0=* [*] (j'avais oublié mes classiques en la matières, que les crochets sont des caractères particuliers dans la confection de modèles de chaînes et que le modèle devait alors être défini ainsi : "[[]*[]]" ce qui m'a valu une batterie de tests conséquente dont je me demandais pourquoi ils renvoyaient Faux avant que la mémoire me revienne...
La procédure principale opère le tri et réenregistre le fichier en .txt. Rien à voir : peut-être faudra-t-il mettre un message pour signaler que c'est terminé !
Je conseille en tout cas de tester sur quelques fichiers (pas trop longs) sur lesquels tu pourras facilement vérifier si le résultat est bon (parce que là je ne me suis pas tapé la vérification des 3200 lignes environ...
Sub TriContact()
Dim chDos$, nFich$, wb As Workbook
Dim d As Object, k, T, n%, i%, j%, h%
With ThisWorkbook.Worksheets(1)
chDos = .Range("C2"): nFich = .Range("C3")
End With
Application.ScreenUpdating = False
Set wb = Workbooks.Open(chDos & nFich)
Set d = CreateObject("Scripting.Dictionary")
With wb.Worksheets(1)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
If (n - 2) Mod 5 > 0 Then
If MsgBox("Nombre de lignes du fichier non conforme !" & Chr(10) _
& "Voulez-vous lancer la vérification détaillée du fichier ?", _
vbCritical + vbYesNo, "Erreur") = vbNo Then Exit Sub
VérifTxt wb, n
n = .Cells(.Rows.Count, 1).End(xlUp).Row
End If
For i = 4 To n Step 5
For j = 0 To 3
k = k & "=" & Split(.Cells(i + j, 1), "=")(1)
Next j
k = Replace(k, "=", "", 1, 1)
d(k) = "": k = ""
Next i
End With
T = d.keys: h = LBound(T)
For i = h To UBound(T) - 1
For j = i + 1 To UBound(T)
If T(j) < T(i) Then
k = T(j): T(j) = T(i): T(i) = k
End If
Next j
Next i
With wb.Worksheets(1)
For i = 4 To n Step 5
k = Split(T(h), "="): h = h + 1
For j = 0 To 3
.Cells(i + j, 1) = j & "=" & k(j)
Next j
Next i
End With
Application.DisplayAlerts = False
wb.SaveAs chDos & nFich, xlUnicodeText
wb.Close False
End Sub
Sub VérifTxt(wb As Workbook, n As Integer)
Dim chref, i%, j%
chref = Array("3=*", "2=*", "1=*", "0=*", "[[]*[]]")
With wb.Worksheets(1)
For i = n To 3 Step -5
Réit:
For j = 0 To 4
If .Cells(i - j, 1) Like chref(j) Then
Else
i = i + 1
.Cells(i - j, 1).Insert xlShiftDown
.Cells(i - j, 1) = chref(j)
GoTo Réit
End If
Next j
Next i
End With
End SubCordialement.
Bonjour et merci pour le fichier.
Apres recherche... je ne peux tester le fichier au sur le Pro puisque je suis encore en excel 2003...
j'essaye de tester le fichier ce soir et revenir vers toi pour un grand merci
Gaetan
Bonjour,
J'ai testé le fichier et malheureusement, je n'arrive pas à le faire fonctionner...
Je dois partir sur quel base. fichier en XLS, XLSX ou TXT?
Je suppose qu'il me suffit de :
- mettre le lien de mon fichier dans chemin du dossier
- Indiquer le nom du fichier
Quel devrait être le résultat? affichage de la liste nouveau fichier TXT...
merci pour ta réponse et le temps que tu me consacres.
Gaetan
Tu n'as pas bie regardé le fichier que je t'ai retourné !
Tu mets le chemin du dossier contenant le fichier en C2 (sans oublier de terminer par un slash).
Tu mets le nom du fichier en C3 (sans oublier l'extension).
Et tu peux appuyer sur le bouton à côté qui lance la macro (elle ira prendre le chemin et le nom en C2 et C3...)
Ensuite, si le nombre de lignes du fichier est conforme et s'il ne contient pas d'élément pouvant générer une erreur, tu ne verras rien !
Il te faudra aller chercher le fichier txt dans son dossier, l'ouvrir, pour vérifier que c'est trié !
Si ça bute sur le nombre de lignes, tu auras un message te demandant si tu veux lancer une vérification détaillée. Si tu réponds oui, la vérif. est lancée. Si elle se déroule sans erreur, le tri suit et tu ne vois rien d'autre...
Je n'ai pas prévu que l'on puisse forcer la vérification (cas où une erreur apparaît mais que le nombre de lignes est conforme), mais cela pourrait s'envisager...
Cordialement.
Bonsoir et merci pour cette réponse rapide!
C'est donc bien ce que j'avais compris dans l’exécution de la macro.
Je vais tester ça lors de la prochaine mis à jour du fichier.
encore un grand merci!
N'oublie pas mon conseil de tester sur un fichier pas trop long et dont tu pourras facilement vérifier le tri (car la vérification dans une telle structure n'est très facile...)
Cordialement.
oui tout à fait, encore merci pour cette macro.
Il semble que cela fonctionne bien!