Insérer des ; dans une liste de caractère

Fermé
vinceCS Messages postés 1 Date d'inscription mercredi 1 décembre 2010 Statut Membre Dernière intervention 1 décembre 2010 - Modifié par vinceCS le 1/12/2010 à 12:04
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 - 1 déc. 2010 à 22:38
Bonjour à tous

j'ai une tache a faire sous excel, mais je bloque !

j'ai un fichier de plus de 1000 lignes, dans une des colonnes, j'ai une chaines de caractères, dont le nombre peut varier en gros de 2 à 192

Exemple:
810253951525455
84
384269
2776
596280
18
30
33

ces nombres (qui sont en fait des N° de département), je souhaite les séparer deux par deux avec un point virgule, comme ci dessous:

81;02;53;95;15;25;45;50;
84;
38;42;69;
27;76;
59;62;80;
18;
30;
33;

mais je ne sais pas comment faire ca de maniere "industrielle", pour les 1000 lignes d'un coup, mes compétences en macro sont largement dépassées

je remercie par avance la communauté pour son aide !

A bientot,

Vincent

(config: vista, office 2007)
A voir également:

4 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
1 déc. 2010 à 13:45
Bonjour,

dans un module :
Function sep2(s As String) As String
    Dim i As Long
    For i = Len(s) - 2 To 1 Step -2
        s = Left(s, i) & ";" & Mid(s, i + 1)
    Next i
    sep2 = s
End Function

eric
1
Deux détails...

- ne gère pas le terminateur ;
- ne gère pas les anomalies (impair)
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
1 déc. 2010 à 19:39
Bonsoir,

- ne gère pas le terminateur ;

Bonne remarque, je n'avais pas vu.
remplacer sep2 = s par sep2 = s & ";"

- ne gère pas les anomalies (impair)
Pas demandé, les données sont sensées être correctes pour moi

eric
0
Pour les impairs : dans l'absolu tu as raison et ta formule est très courte. Moi je suis habitué à la prog défensive, raison pour laquelle j'accumule tranquillement mes caractères, et ajoute un pv lorsque c'est nécessaire.

Et c'est en testant ma fonction que j'ai remarqué que l'énoncé ne correspondait pas à la question.

Il semble qu'on était tout un peloton sur le coup ? C'est un peu con...

On ne pourrait pas prévoir quelque chose du genre un post "JE PRENDS..." à éditer dans la 1/2h ? Parce que là ça fait un peu débauche même si en finale, j'ai comme l'impression qu'il n'y a que deux solutions sur quatre qui fonctionnent.dans le cas général. Mais je vais arrêter de critiquer sinon je vais me faire manger tout cru.

La palme de l'artisanat (no pun intended) revient à ccm81 qui réussit à trouver une solution garantie 100% sans produits dopants de type VBA. :D Par contre, impossible de prédire la longueur de la chaine initiale.

Bonne soirée,
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
1 déc. 2010 à 20:53
bonsoir maxime

RQ1. comme eriic pas vu le ; final d'où la modif ..

Function inserepv(ByVal s As String) As String
If Len(s) = 2 Then
inserepv = s & ";"
Else
inserepv = Left(s, 2) & ";" & inserepv(Right(s, Len(s) - 2))
End If
End Function

RQ2. pourquoi se contenter de gerer les espaces et pas les eventuelles erreurs de frappes (+,-,*,/, sont si près geographiquement du pavé numérique )
RQ3. que veux tu dire par
Par contre, impossible de prédire la longueur de la chaine initiale.

cordialement
0
Eh bien qu'il me semble en fait que tu dois recopier des cellules à droite, notamment autant de fois qu'il y a de paires ? Et le cas général suppose au contraire de l'exemple que la chaîne peut avoir n'importe quelle longueur pour peu qu'elle soit paire...

Pourquoi les "blanks' c'est à dire pas uniquement les espaces, mais aussi les ; Tout simplement parce que les données sont plus susceptibles d'être polluées (copies, manips) par ces caractères. Le mieux aurait été en fait de ne permettre QUE les car de 0 à 9 qui suffisent pour noter les départements.
0
tchernosplif Messages postés 600 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 21 juin 2015 244
1 déc. 2010 à 13:50
Bonjour,

J'ai décomposé le problème en 4 étapes:

- découpage par paires (stxt)
-concatener des paires avec un ; intermédiaire
-supression des ; en double (substitue)
-ajoute le dernier ; si manquant

http://www.cijoint.fr/cj201012/cij2y5KHqP.xls
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
1 déc. 2010 à 16:12
bonjour
une autre ...

Private Sub CommandButton1_Click()
Dim c As Range
For Each c In Selection
  c.Value = inserepv(c.Value)
Next c
End Sub

Function inserepv(ByVal s As String) As String
  If Len(s) = 2 Then
    inserepv = s
  Else
    inserepv = Left(s, 2) & ";" & inserepv(Right(s, Len(s) - 2))
  End If
End Function


dans ton pb
RQ1. les cellules contiennent des chaines de caracteres
RQ2. les chaines de caracteres sont de longueurs paires (ce n'est pa verifie)

bonne suite
0
Ton exemple d'énoncé est incorrect (nombre impair de car).

Voici la solution.

F11 éditeur VBA, ajouter module, dedans du colles ça

Public Function DeuxParDeux(Cel As Range) As String
Dim S As String
Dim S2 As String
Dim i As Integer
Dim Ct As Integer
S = CStr(Cel)
If Len(S) / 2 = Len(S) \ 2 Then
'Delete possible blanks
S = Replace(S, " ", "")
S = Replace(S, ";", "")
For i = 1 To Len(S)
S2 = S2 & Mid$(S, i, 1)
Ct = Ct + 1
If Ct = 2 Then
Ct = 0
S2 = S2 & ";"
End If
Next i
DeuxParDeux = S2
Else
DeuxParDeux = "IMPAIR !"
End If
End Function

Puis tu fais dans une colonne =deuxpardeux(colonnenonséprarée)

si le nombre de car est impair, il retourne impair.

TRES vite fait sur le gaz, signale-moi si tu vois un bug.

Oki ?
0
Dans mon code les trois lignes 'delete possible blanks doivent être en dehors du If. Cela n'empêche pas celui-ci de fonctionner puisque en principe on ne devrait pas rencontrer de caractère autre que 0-9 dans les cellules.
0