Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
951 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°371652
emouchet
Posté le 25-04-2003 à 11:34:06  profilanswer
 

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.
mood
Publicité
Posté le 25-04-2003 à 11:34:06  profilanswer
 

n°371739
drasche
Posté le 25-04-2003 à 13:25:25  profilanswer
 

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)
n°371779
emouchet
Posté le 25-04-2003 à 13:44:23  profilanswer
 

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.
n°371784
drasche
Posté le 25-04-2003 à 13:49:49  profilanswer
 

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)
n°371840
emouchet
Posté le 25-04-2003 à 14:32:24  profilanswer
 

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.
n°371942
emouchet
Posté le 25-04-2003 à 15:07:54  profilanswer
 

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.
n°371966
drasche
Posté le 25-04-2003 à 15:16:32  profilanswer
 

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)
n°372042
emouchet
Posté le 25-04-2003 à 15:50:03  profilanswer
 

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.
n°372100
drasche
Posté le 25-04-2003 à 16:42:04  profilanswer
 

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)
n°372158
emouchet
Posté le 25-04-2003 à 17:19:53  profilanswer
 

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.
mood
Publicité
Posté le 25-04-2003 à 17:19:53  profilanswer
 

n°372160
drasche
Posté le 25-04-2003 à 17:20:30  profilanswer
 

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)
n°372163
emouchet
Posté le 25-04-2003 à 17:24:11  profilanswer
 

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.
n°372174
drasche
Posté le 25-04-2003 à 17:32:02  profilanswer
 

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)
n°373039
MagicBuzz
Posté le 27-04-2003 à 03:39:56  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[XML + DOM] fonction writetofile() ne marche pas[PHP] Récupération d'une partie d'une chaîne de caractères
fonction mail() probleme avec la gestion des emails non envoyéRecherche dans une chaine
[PHP] recherche de motifs dans une chaîne, regexBesoin d'aide sur la fonction "formulaire"
[asp / vbs] Appeler une fonction...[C] Allocation dynamique et fonction.
[JS / VBS ? ] Fonction pour executer un programme ?chaine de longeur fixe [facile mais jy arrrive po]
Plus de sujets relatifs à : [vb(a)] je veux faire fonction qui separe une chaine de char en deux


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR