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

vinceCS Messages postés 1 Statut Membre -  
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   -
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
Maxime
 
Deux détails...

- ne gère pas le terminateur ;
- ne gère pas les anomalies (impair)
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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
Maxime
 
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 11033 Statut Membre 2 433
 
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
Maxime
 
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 714 Statut Membre 248
 
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 11033 Statut Membre 2 433
 
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
Maxime
 
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
Maxime
 
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