[vb(a)] je veux faire fonction qui separe une chaine de char en deux

je veux faire fonction qui separe une chaine de char en deux [vb(a)] - VB/VBA/VBS - Programmation

Marsh Posté le 25-04-2003 à 11:34:06    

Public Function SeparationChaineEnDeux(ChainePricipale As String, TaillePremiereChaine As Integer, TailleDeuxiemeChaine As Integer) As String
        Dim Count As Long
        Dim LongueurChaineAdresse As Integer
        Count = 1
        ReDim SeparationChaineEnDeux(1) 'le résultat sera un tableau de deux éléments (numerotés 0  et 1)
        If Len(ChainePricipale) + 1 > TaillePremiereChaine + TailleDeuxiemeChaine Then
            LongueurChaineAdresse = TaillePremiereChaine + TailleDeuxiemeChaine
        Else
            LongueurChaineAdresse = Len(ChainePricipale) + 1
        End If
        Do While Mid(ChainePricipale, Count, 1) <> Chr(13) And Count < LongueurChaineAdresse And Count < TaillePremiereChaine
            'Je compte les char jusqu'au retour chariot ou la fin de la chaine
            'ou TaillePremiereChaine
            Count = Count + 1
        Loop
        'Je mets le tronçon jusqu'à Count dans
        Me.Adresse_de_facturation = Left(Me.Adresse, Count)
        'mettre dans deuxvaleurs de renvoie...
        If Count + 1 <= LongueurChaineAdresse Then
            If Mid(Me.Adresse, Count, 1) = Chr(13) Then
                'je recopie la chaine à partir de Count mais sans le retour chariot
                SeparationChaineEnDeux(0) = Mid(Me.Adresse, Count + 2, LongueurChaineAdresse - (Count + 2))
            Else
                'il n'y a pas de retour chariot
                SeparationChaineEnDeux(1) = Mid(Me.Adresse, Count + 1, LongueurChaineAdresse - (Count + 1))
            End If
        End If
End Function


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 11:34:06   

Reply

Marsh Posté le 25-04-2003 à 13:25:25    

euh skoi la question? :??:
 
comment tu prévois de renvoyer 2 chaînes? :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-04-2003 à 13:44:23    

ben ouais ma question est comment je renvoie les deux chaines ... un tableau mais comment je fais un tableau ???
Bon j'ai vu qu'il y avais certaines erreurs dans les variables mais bon ... c'est pas le plus important.


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 13:49:49    

ben ya plus simple: tu passes deux variables string par référence et tu récupères leur contenu après appel:
 

Code :
  1. Public Sub SplitString(ByRef strSource, ByVal lStrSize1 As Long, ByVal lStrSize2 As Long, ByRef strDest1 As String, ByRef strDest2 As String)
  2.     strDest1 = Mid$(strSource, 1, lStrSize1)
  3.     strDest2 = Mid$(strSource, lStrSize1 + 1, lStrSize2)
  4. End Sub


 
voilà, ça fait 4 lignes et ça plante pas, même si la chaîne est vide ;)
 
edit: j'ajoute que si tu spécifies pas ByVal ou ByRef, c'est ByRef qui est pris par défaut (en .NET ce sera ByVal).


Message édité par drasche le 25-04-2003 à 13:51:11

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-04-2003 à 14:32:24    

oki ca marche peut etre mais ...
ce que je veux faire c'est:

  • j'ai un champ texte
  • j'en recupere la premere ligne ou les n premiers caracteres.
  • je mets ces caracteres dans un autre champ texte
  • je mets le reste dans un troisieme champ texte


j'ai essayé ta methode en faisant :

Code :
  1. Public Sub SeparationChaineEnDeux(ByRef ChainePricipale As String, ByVal TaillePremiereChaine As Integer, ByVal TailleDeuxiemeChaine As Integer, ByRef PremiereChaine As String, ByRef SecondeChaine As String)


 
puis :  
 

Code :
  1. PremiereChaine = Left(ChainePricipale, Count)
  2. SecondeChaine = Mid(ChainePricipale, Count + 1, LongueurChaineAdresse - (Count + 1))


 
pour info : quand je fais l'appel de la fonction je fais :
 

Code :
  1. SeparationChaineEnDeux(Me.Adresse, 100, 50,Me.Adresse_de_facturation,Me.Adresse_2_de_Facturation)


 
et là il me dit "Attendu '=' "
 
comprend po


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 15:07:54    

J'ai trouvé... il suffit de faire Call pour appeler la fonction ...
Et le types ne sont pas string mais textbox...
Voila mici a toi


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 15:16:32    

bon un truc pour alléger un peu ton code: utilise les chiffres comme.  Ca sera beaucoup plus lisible ;)
 
Ensuite, tu peux laisser tomber les Me: ils référencent l'objet dans lequel tu te trouves, et à moins qu'il existe des variables portant le même nom que tes champs ailleurs, leur mention est inutile.
 
Il y a une faute d'ortho sur "pricipale" qui doit être "principale"
 
Tu as omis de préciser d'où vient Count :??:
 
sur quelle ligne l'erreur arrive-t-elle?  Sur l'appel de fonction lui même?  Si c'est le cas, vérifie bien tes paramètres, on sait jamais ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-04-2003 à 15:50:03    

Maintenant ca marche mais deux questions pour toi :

  • j'utilise les chiffres comme quoi ?
  • Je veux maintenant que les deux tailles correspondent a des champ dans ma base ...

J'utilise  

Code :
  1. TailleChampAdresseFacturation = Me.Recordset.Fields(Me.Adresse_de_facturation.ControlSource).Size
  2.         TailleChampAdresseFacturation2 = Me.Recordset.Fields(Me.Adresse_2_de_Facturation.ControlSource).Size


Mais si l'un des deux champs contien la valeur NULL ca merde ... tu ne saurais pas comment faire...
Merci


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 16:42:04    

tiens je n'ai pas de propriété Size chez moi.  Tu bosserais pas en Access et/ou avec DAO par hasard?  (histoire que je m'y retrouve)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-04-2003 à 17:19:53    

En acces oui ...  :jap:  
Enfin maintenant tout marche ... si tu veux je peux meme poster le code ...
@ toi de voir ... :-) :hello:


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 17:19:53   

Reply

Marsh Posté le 25-04-2003 à 17:20:30    

oui parce que j'ai rien en DAO ici et je suis curieux :)
 
:hello:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-04-2003 à 17:24:11    

Voici ma fonction telle quelle est actuellement :  

Code :
  1. Public Sub SeparationChaineEnDeux(ByRef TextBoxPrincipale As TextBox, ByVal TaillePremiereChaine As Integer, ByVal TailleDeuxiemeChaine As Integer, ByRef PremiereTextBox As TextBox, ByRef SecondeTextBox As TextBox)
  2.         Dim Count As Long
  3.         Dim LongueurChainePrincipale As Integer
  4.         PremiereTextBox = Null
  5.         SecondeTextBox = Null
  6.         Count = 1
  7.         If Len(TextBoxPrincipale) + 1 > TaillePremiereChaine + TailleDeuxiemeChaine Then
  8.             LongueurChainePrincipale = TaillePremiereChaine + TailleDeuxiemeChaine
  9.         Else
  10.             LongueurChainePrincipale = Len(TextBoxPrincipale) + 1
  11.         End If
  12.         Do While Mid(TextBoxPrincipale, Count, 1) <> Chr(13) And Count < LongueurChainePrincipale And Count < TaillePremiereChaine
  13.             'Je compte les char jusqu'au retour chariot ou la fin de la chaine
  14.             'ou TaillePremiereChaine
  15.             Count = Count + 1
  16.         Loop
  17.         If Count + 1 <= LongueurChainePrincipale Then
  18.             If Mid(TextBoxPrincipale, Count, 1) = Chr(13) Then
  19.                 'je mets le premier tronçon dans le premier textBox
  20.                 PremiereTextBox = Left(TextBoxPrincipale, Count - 1)
  21.                  'je recopie la chaine à partir de Count mais sans le retour chariot
  22.                  'TabTemp(1) = Mid(ChainePricipale, Count + 2, LongueurChaineAdresse - (Count + 2))
  23.                  SecondeTextBox = Mid(TextBoxPrincipale, Count + 2, LongueurChainePrincipale - (Count + 2))
  24.             Else
  25.                 'je mets le premier tronçon dans le premier textBox
  26.                 PremiereTextBox = Left(TextBoxPrincipale, Count)
  27.                 'il n'y a pas de retour chariot
  28.                 'TabTemp(1) = Mid(ChainePricipale, Count + 1, LongueurChaineAdresse - (Count + 1))
  29.                 SecondeTextBox = Mid(TextBoxPrincipale, Count + 1, LongueurChainePrincipale - (Count + 1))
  30.             End If
  31.         Else
  32.             'on n'ecrit rien dans la ligne adresse 2
  33.             PremiereTextBox = Left(TextBoxPrincipale, Count)
  34.         End If
  35. End Sub


 
Et Voila ce qui me permet de l'appeler :  
 

Code :
  1. Private Sub RecopierAdresse_txtBtn_Click()
  2.         Dim TailleChampAdresseFacturation As Integer 'valeur de la base de donnée
  3.         Dim TailleChampAdresseFacturation2 As Integer 'valeur de la base de donnée
  4.         Dim TabResultTraitementAdresse() As String
  5.         TailleChampAdresseFacturation = Me.Recordset.Fields(Me.Adresse_de_facturation.ControlSource).Size
  6.         TailleChampAdresseFacturation2 = Me.Recordset.Fields(Me.Adresse_2_de_Facturation.ControlSource).Size
  7.        
  8.         Me.Raison_sociale_de_facturation = Me.Raison_sociale
  9.         Me.Contact_de_Facturation = Me.Contact
  10.         Me.Code_Postal_de_facturation = Me.Code_postal
  11.         Me.Ville_de_facturation = Me.Ville
  12.         Call SeparationChaineEnDeux(Me.Adresse, TailleChampAdresseFacturation, TailleChampAdresseFacturation2, Me.Adresse_de_facturation, Me.Adresse_2_de_Facturation)
  13. End Sub


 
Voila  :sol:


---------------
Emouchet, chevalier pendion, vous souhaite une agréable journée.
Reply

Marsh Posté le 25-04-2003 à 17:32:02    

je sais que je l'ai déjà dit, mais je te conseille vraiment de raccourcir le nom de tes variables, car avec l'habitude, tu verras qu'il est beaucoup plus efficace de coder, et tes pages de code seront moins chargées, donc plus lisibles ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 27-04-2003 à 03:39:56    

C'est pourtant pas compliqué de faire ça proprement...
C'est en VBS. Pour passer dans VB, faut quand même rajouter les types.
 

Code :
  1. dim str
  2. dim pos
  3. dim res
  4. str = ""
  5. pos = 0
  6. do while str = ""
  7. str = inputbox("Chaîne ?" )
  8. loop
  9. do while pos = 0
  10. on error resume next
  11. pos = cint(inputbox("Couper à l'index ?" ))
  12. if err <> 0 then
  13.  pos = 0
  14. elseif pos > len(str) then
  15.  pos = 0
  16. end if
  17. on error goto 0
  18. loop
  19. res = couperChaine(str, pos)
  20. msgbox(res(1))
  21. msgbox(res(2))
  22. function couperChaine(chaine, index)
  23. dim workTab(2)
  24. workTab(1) = mid(str, 1, pos)
  25. workTab(2) = mid(str, pos + 1)
  26. couperChaine = workTab
  27. end function


Message édité par MagicBuzz le 27-04-2003 à 03:41:16
Reply

Sujets relatifs:

Leave a Replay

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