Insérer des ; dans une liste de caractère
vinceCS
Messages postés
1
Statut
Membre
-
eriiic Messages postés 24581 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24581 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)
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)
4 réponses
-
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-
-
-
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, -
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 -
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.
-
-
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 -
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 -
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 ?