tri sur une chaine de caractère dans excel

tri sur une chaine de caractère dans excel - VB/VBA/VBS - Programmation

Marsh Posté le 30-06-2008 à 11:22:06    

bonjour à tous,
 
j'ai un fichier excel qui reference des clients et il faut que je leur créé des codes clients a partir de leur raison sociale ( que j'ai dans le fichier excel à la colonne J) ...
 
 
le code client est à faire a partir des 5 premiers caracteres de la raison sociale, donc un simple =GAUCHE(J2;5) pourrait suffire sauf que certaines raisons sociales contiennent des caractères spéciaux ( genre espace, / , * ) et en fait je ne voudrais que les 5 premières lettres ou chiffres mais je ne sais pas comment trier ca ...
 
J'ai essayé avec une fonction cells.find mais j'ai une erreur avec le if que je n'arrive pas à syntaxer correctement avec ...
 
 
bref pour le moment j'ai ca, c est partiel, le tri n'est effectué que sur le caractère /, et de plus comme j'ai commencé le vba y a environ 20 minutes, c est un peu l'anarchie la :
 

Code :
  1. Sub Macro1()
  2.     Dim i As Integer
  3.     For i = 2 To 3000
  4.    
  5.     Cells(AJ, i).Select
  6.     if (Cells.Find(What:="/", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
  7.         xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
  8.         .Activate )
  9.         Then Goto ok
  10. ok:
  11.     ActiveCell.FormulaR1C1 = "=LEFT(RC[-26],5)" 
  12.    
  13.    
  14. End Sub


 
Qui peut m'aider ?  
Merci :jap:

Reply

Marsh Posté le 30-06-2008 à 11:22:06   

Reply

Marsh Posté le 30-06-2008 à 12:59:06    

Salut, attention au probleme de doublons possibles, utiliser plutôt le N° Siret ?

Reply

Marsh Posté le 30-06-2008 à 13:28:00    

Oui ca c est un autre probleme encore, et le numéro de siret je ne l utilise pas dans la mesure ou il n est pas dispo dans le fichier car en fait il s agit d un fichier de propects et relations diverses qui sont pour certains d entre eux seulement rattachés à une société cliente du coup tous ne pourront pas avoir de siret ...
 
je débarque dans la boite pour un stage avec pour mission d'uniformiser un peu leur base de données de clients/relations/connaissances mais la pour le moment c'est un sacré bazar pour rester poli, ils ont de tout, du fichier excel à la base de donnée hyperfile en passant par access ...
 
 
En fait la le but est de créer des codes clients sur 5 caractères, puis d importer ca dans les "vraies" bases de données déjà existantes apres avoir vérifié bien sur les doublons et/ou sociétés qui ont 2 codes clients distincts ...

Reply

Marsh Posté le 30-06-2008 à 13:33:55    

En fait voila ce qu'il me faudrait en langage plutot humain :
 
Si les 5 premiers caractères de RaisonSociale contiennent " " ou "/" ou "*"
alors prendre les 5 premières lettres ou chiffres
sinon prendre les 5 premiers caractères.
 
 
Si il y a moins de 5 caractères c est pas génant dans la mesure ou 5 est le chiffre max du nombre de caractère de mon code client et que meme si y en a 3 ou 4 c est pas génant ..
 
 
 
mais je n'arrive pas a trouver la fonction dans excel ou en vba pour faire un tri avec uniquement l'alphanumérique ...

Reply

Marsh Posté le 30-06-2008 à 13:43:48    

Bonjour
 
Voici une fonction  
 

Function dudule(tmp)
For b = 1 To Len(tmp)
    Select Case Mid(tmp, b)
        Case "0" To "9", "a" To "z", "A-Z"
            tmp1 = b
            Exit For
    End Select
Next
dudule = Mid(tmp, tmp1, 5)
End Function

Reply

Marsh Posté le 30-06-2008 à 13:45:12    

ah merci je vais voir ce que je peux faire avec ca :D

Reply

Marsh Posté le 30-06-2008 à 14:11:20    

Cette fonction marche pour la première société mais me sort #VALEUR! pour toutes les suivantes, même celles qui ont une raison sociale de même format ?

Reply

Marsh Posté le 30-06-2008 à 14:40:07    

Ok j'ai oublié une ligne
 
Function dudule(tmp)  
application.volatile  
....
 
Si tu as encore des problèmes donne moi des exemples

Reply

Marsh Posté le 30-06-2008 à 14:49:21    

En colonne J j'ai la raison sociale, en colonne AJ j ai le code client que je dois indiquer ...
 
Donc j'ai copié la fonction dans la partie module 1 de la fenetre microsoft visual basic et je mets en guise de valeur quand je veux remplir AJ2 :  
=dudule(J2)
 
puis je tire vers le bas ... et ca ne remplit que les 4 premières dont la raison sociale est 8TEC ...
par contre si pour la société suivante ERDECOR je mets 8TEC alors ca remplit automatiquement la colonne AJ en 8TEC aussi ....
J'ai essayé en ERDE au cas ou il s'agirait du nombre de caractères qui pose probleme mais ca ne change rien ...
 
 
De plus j'ai testé également avec True apres application.volatile dans la mesure ou j'ai vu ca aussi sur google .... mais ca ne résout pas le probleme ...

Reply

Marsh Posté le 30-06-2008 à 15:19:58    

Dans le même style que pyrof :

Code :
  1. Function dudule(tmp)
  2. Application.Volatile
  3. tmp_new = ""
  4. For i = 1 To Len(tmp)
  5.     Select Case Mid(tmp, i, 1)
  6.         Case "0" To "9", "a" To "z", "A-Z"
  7.             tmp_new = tmp_new & Mid(tmp, i, 1)
  8.     End Select
  9.     If Len(tmp_new) = 5 Then
  10.         Exit For
  11.     End If
  12. Next
  13. dudule = tmp_new
  14. End Function


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 30-06-2008 à 15:19:58   

Reply

Marsh Posté le 30-06-2008 à 15:27:57    

C'est aujourd'hui lundi et je ne dois être bien réveillé,
 en voyant la macro de babass je m'apperçois qu'il manque un argument a mid:
 
    Select Case Mid(tmp, b, 1)
 

Reply

Marsh Posté le 30-06-2008 à 15:29:14    

babasss a écrit :

Dans le même style que pyrof :

Code :
  1. Function dudule(tmp)
  2. Application.Volatile
  3. tmp_new = ""
  4. For i = 1 To Len(tmp)
  5.     Select Case Mid(tmp, i, 1)
  6.         Case "0" To "9", "a" To "z", "A-Z"
  7.             tmp_new = tmp_new & Mid(tmp, i, 1)
  8.     End Select
  9.     If Len(tmp_new) = 5 Then
  10.         Exit For
  11.     End If
  12. Next
  13. dudule = tmp_new
  14. End Function



celle la ne me sors que le premier caractères de la première société et plus rien ensuite :'(


Message édité par GTTeamKiller le 30-06-2008 à 15:30:18
Reply

Marsh Posté le 30-06-2008 à 15:32:59    

pyrof a écrit :

C'est aujourd'hui lundi et je ne dois être bien réveillé,
 en voyant la macro de babass je m'apperçois qu'il manque un argument a mid:
 
    Select Case Mid(tmp, b, 1)
 


 
on renvient au comportement initial, a savoir ca marche pour la premiere société, puis j ai #VALEUR! pour les autres ...
 
 
actuellement j'ai ca du coup la :

Code :
  1. Function dudule(tmp)
  2. Application.Volatile True
  3. For b = 1 To Len(tmp)
  4.     Select Case Mid(tmp, b, 1)
  5.         Case "0" To "9", "a" To "z", "A-Z"
  6.             tmp1 = b
  7.             Exit For
  8.     End Select
  9. Next
  10. dudule = Mid(tmp, tmp1, 5)
  11. End Function

Reply

Marsh Posté le 30-06-2008 à 15:33:20    

Arghh, je me suis laissée avoir par la formulation de pyrof, il faut mettre "A" to "Z" et non "A-Z"


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 30-06-2008 à 15:38:29    

babasss a écrit :

Arghh, je me suis laissée avoir par la formulation de pyrof, il faut mettre "A" to "Z" et non "A-Z"


Ah yes ca marche, merci :D  
 
 
Merci a vous deux  :D  
 
 
maintenant j'ai plus qu'a m'attaquer aux doublons mais ca va devoir être vérifié à la main la de toutes facons parce qu'ils veulent décider au cas par cas ce qu'ils vont mettre en cas de doublons, 2500 entrées :sweat:

Reply

Marsh Posté le 30-06-2008 à 15:44:12    

Ou alors il me faudrait une fonction ou macro qui trouve code client qui a au moins 2 raisons sociales distinctes ...
 
je sais le faire en SQL ca :sweat:

Reply

Marsh Posté le 30-06-2008 à 19:03:54    

re,l'occasion peut-être d'essayer cet utilitaire pour les doublons sous Excel http://www.mdf-xlpages.com/modules [...] d=2&lid=11

Reply

Marsh Posté le 01-07-2008 à 08:28:09    

je teste cet utilitaire, merci :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed