Exploiter une chaine de caractère

Résolu
ShiZZle971 Messages postés 21 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 20 décembre 2007 - 18 janv. 2007 à 13:34
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 24 janv. 2007 à 14:54
Salut,
Je coince sur une étape de mon projet qui me donne sincèrement mal à la tête.
Je possède déjà le code de l'incrémentation alphabétique et je sais comment récupéré UNE lettre dans une chaine de caractère.
Mais je n'arrive pas, si par exemple, j'ai "415E" a retourner "415F".
Le plus gros problème ensuite selon moi est que quand j'arrive a "415Z" de passer à "416A".
Si vous pouviez m'aider, sincèrement; je vous en serait très reconnaissant.
Merci.

35 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
19 janv. 2007 à 08:54
Maintenant, regarde bien !

Je viens de te "fabricoter" un truc universel :

Private Sub Command1_Click()
  chaine = Text1.Text
  pos = Text1.SelStart
  car = Mid(Text1.Text, pos + 1, 1)
  N = 1  If car "Z" Then car Chr(Asc("a") - 1)  If car "z" Then car Chr(Asc("a") - 1)  If car "9" Then car Chr(Asc("0") - 1)
  Text1.Text = Left(Text1.Text, pos) & Chr(Asc(car) + 1) & Mid(Text1.Text, pos + 2)
  Text1.SelStart = pos
End Sub

Fonctionnement :

1) tu places ton curseur, dans ta textbox, juste avant le caractère à incrémenter (ou tu le sélectionnes)
2) tu cliques ensuite autant de fois que tu veux sur Command1... et tu vois...
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
19 janv. 2007 à 18:09
T'arrive-t-il quelquefois de lire ce que dit ton aide en ligne ?

Tu peux utiliser le Mid à la place du left, mais ainsi

au lieu de :
 Text1.Text = Left(Text1.Text, pos) & Chr(Asc(car) + 1) & Mid(Text1.Text, pos + 2)
écrure :
  Text1.Text = Mid(Text1.Text, 1, pos) & Chr(Asc(car) + 1) & Mid(Text1.Text, pos + 2)
3
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
19 janv. 2007 à 21:17
Salut,
C'est exact, excellent problème pour appliquer une fonction récursive, voilà comme je transformerais le code de jmfmarques :

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim pos As Integer = Text1.SelectionStart
    Text1.Text = IncrementerChar(Text1.Text, Text1.SelectionStart)
    Text1.SelectionStart = pos
  End Sub

  Function IncrementerChar(ByVal chaine As String, ByVal pos As Integer) As String
    If pos = 0 Then Stop
    Dim car As String, n As Integer
    car = Mid(chaine, pos + 1, 1)
    n = 1
    If car = "Z" Then
      chaine = IncrementerChar(chaine, pos - 1)
      car = Chr(Asc("A") - 1)
    ElseIf car = "z" Then
      chaine = IncrementerChar(chaine, pos - 1)
      car = Chr(Asc("a") - 1)
    ElseIf car = "9" Then
      chaine = IncrementerChar(chaine, pos - 1)
      car = Chr(Asc("0") - 1)
    End If
    Return Strings.Left(chaine, pos) & Chr(Asc(car) + 1) & Mid(chaine, pos + 2)
  End Function, ----
(Coloration syntaxique automatique par Kenji)

<hr size="2" width="100%" />Julien.
3
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
18 janv. 2007 à 15:03
Salut,
D'après tes exemples, ton texte est toujours 3 chiffres et une lettre ?
Si oui :

        Dim n As Integer, l As Integer
        n = Val(TaChaine)
        l = AscW(TaChaine(3))
        l += 1        If l >91 Then ' 65 + 26
            n += 1
            l = 65
        End If
        Return Trim(n) & Strings.Chr(l)

<hr size="2" width="100%" />Julien.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ShiZZle971 Messages postés 21 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 20 décembre 2007
18 janv. 2007 à 15:22
Salut Julien, merci pr ton aide.
Mon texte est variable, en fait ce sont des numéros de série.
Il se pourait que j'ai un numéro du genre "415E55S". Il faudrait que je mette un marqueur pour choisir qu'elle lettre je veux incrémenter.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
18 janv. 2007 à 16:08
Les lettres et les chiffres n'étant pas contigus dans la http://jimprice.com/... target='_blank'>table ascii, ce serait plus facile que tu aies soit l'un soit l'autre. Mais bon à toi de voir, c'est quand même pas très compliqué !
Pour les fonctions traitant les chaines, regarde la classe Strings (avec "s") ainsi que les fonctions de la classe String (MaChaine.Substring par exemple).
Tu peux aussi utilise MaChaine(5) qui renvoie le 5e (basé en 0) caractère de ta chaine... Les fonctions Val(string) Number(String)...
Y'a de quoi faire :p
<hr size="2" width="100%" />Julien.
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
18 janv. 2007 à 18:35
Salut,
Simple question : Julien237 donne une solution à ton problème, moi ce que je souhaiterai savoir c'est le résultat que tu cherches à avoir, comment tu veux traiter des N° de série, car en comprenant ton but rechercher, il y a peut-être, je dit bien peut-être, une solution plus appropriée, pour atteindre ton but souhaité ?
A+
Exploreur 
0
ShiZZle971 Messages postés 21 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 20 décembre 2007
18 janv. 2007 à 19:25
Salut Exploreur,
C'est à dire que je fais un logiciel d'entrée de stock, et je dois stocker des numéros des séries que je bipe avec une douchette.
Ex : Dans une livraison de 10 cartes mères, je remarque que ce sont les memes numéro à une différence près, la lettre est incrémentée. Si le premier numéro de série est "23368E", alors je dois générer automatiquement la suite des numéro, le deuxième sera "23368F", le troisième "23368G", etc... jusqu'au 10ème.
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
18 janv. 2007 à 19:52
Ben si tes numéro sont comme cela : 23368E, tu n'as qu'a faire un right(TaValeurLu,1) << ici tu récupères le E(je "pense" que tu sais faire cela), aprés tu compare ton E avec la Table de carractères pour définir ta lettre suivante.
(questions bête : Pourquoi tu ne gardes pas les sn# d'origine? Tu fais un stockage des sn# ou un référencement de pièces?Car là pour moi c'est un référencement de pièces, non?)
Ensuite si tu as des sn# comme cela : 456A54Y, moi ce que je ferai, c'est rechercher déjà la lettre que tu veux incrémenter dans "TaValeurLu", et idem ci-dessus.
C'est le déroulement que je ferai, maintenant il y a sûrement mieux comme interprétation.
A+
Exploreur
0
ShiZZle971 Messages postés 21 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 20 décembre 2007
18 janv. 2007 à 20:07
Ben en fait, mon patron m'a demandé de faire comme ça pour gagner du temps lors de l'entrée en stock.
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
18 janv. 2007 à 20:13
Oui, mais tu fais quoi : Gérer les SN#, ou faire un référencement?
A+
Exploreur
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 janv. 2007 à 20:45
Je m'en tiens quant à moi au 1er message, qui présentait le problème ainsi :

"    Mais je n'arrive pas, si par exemple, j'ai "415E" a retourner "415F".
Le plus gros problème ensuite selon moi est que quand j'arrive a "415Z" de passer à "416A"    ."

Et refuse en général de participer ensuite à un jeu de type "Poker Javanais" où les conventions sont définies au fur et à mesure de l'avancement du jeu. (car c'est la façon la plus sûre de transformer une discussion en du n'importe quoi).

Alors voilà la réponse à ta question, telle que tu l'as posée  :

Private Sub Command1_Click()
  toto = "458A"
  For i = 1 To 70
    n = n + 1    If n 26 Then n 0
    toto = "458" & Chr(Asc("A") + n)
    Me.Print toto
  Next
End Sub

J'ai bien évidemment la certitude de ce qu'il t'a été demandé tout autre chose (et je devine quoi), mais nous ne sommes pas là pour perdre du temps en raison de questions incomplètes ou mal posées !
Je te prie, si tu veux que nous fassions un effort pour t'aider, de bien vouloir commencer toi-même à faire un effort d'exposé clair, complet et précis de ton besoin.
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
18 janv. 2007 à 21:08
Ben voilà, la réponse est donnée, je m'arrête de poser des questions!!
A+
Exploreur
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
18 janv. 2007 à 21:22
Toujours aussi froid jmfmarques , t'as sans doute raison, mais la finalité de ce forum est quand même l'entraide, faut pas l'oublier... De toute façon ceux qui répondent sont là pour donner de leur temps.
<hr size="2" width="100%" />Julien.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 janv. 2007 à 21:30
Bonsoir Julien,

Bien évidemment (et je le donne, le mien, de temps, non ?)

Pour autant : celui qui pose la question doit savoir la poser convenablement et ne pas conduire à un jeu de devinettes...
S'il ne fait pas cet effort... il a le genre de réponse que j'ai donnée.

Je suis assez âgé, Julien, pour deviner quel est l'énoncé de son exercice
Une chose reste certaine : il ne pourra jamais développer un projet dont il n'a pas totalement saisi lui-même la finalité ... et, s'il l'a saisie, cette finalité, il doit savoir l'exposer clairement.... c'est le début même du développement....

Amitiés.
0
ShiZZle971 Messages postés 21 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 20 décembre 2007
18 janv. 2007 à 21:37
" Je m'en tiens quant à moi au 1er message, qui
présentait le problème ainsi :

"    Mais je n'arrive pas, si par
exemple, j'ai "415E" a retourner "<st1:metricconverter productid= "415F" w:st="on">415F</st1:metricconverter>".

Le plus gros problème ensuite selon moi est que quand j'arrive a
"415Z" de passer à "416A"    ."

Et refuse en général de participer ensuite à
un jeu de type "Poker Javanais" où les conventions sont définies au
fur et à mesure de l'avancement du jeu. (car c'est la façon la plus sûre de
transformer une discussion en du n'importe quoi).


Alors voilà la réponse à ta question,
telle que tu l'as posée  :


Private Sub Command1_Click()

  toto = "458A"

  For i = 1 To 70

    n = n + 1

    If n 26 Then n 0

    toto = "458" & Chr(Asc("A") + n)

    Me.Print toto

  Next

End Sub



J'ai bien évidemment la certitude
de ce qu'il t'a été demandé tout autre chose (et je devine quoi), mais nous ne
sommes pas là pour perdre du temps en raison de questions incomplètes ou mal
posées !

Je te prie, si tu veux que nous fassions un effort pour t'aider, de bien
vouloir commencer toi-même à faire un effort d'exposé clair, complet et précis
de ton besoin.



"




Tout d'abord merci de m'avoir aidé.
Peut etre que je me suis mal exprimé mais j'ai bien dit que c'était qu'un exemple le "415E", or mes numéros de série ne seront pas forcément tous en "415E". Et dans l'exemple que tu m'as donné, toto n'est pas une variable mais une constante.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
18 janv. 2007 à 21:42
Pourquoi dis-tu que toto est une constante ? Tu ne vois pas sa déclaration

jmfmarques > D'accord
<hr size="2" width="100%" />Julien.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 janv. 2007 à 21:56
Bon...
Tirons une croix sur tout ce qui précède, ShiZZle971

Veux-tu bien maintenant, s'il te plait, exposer clairement toutes les données de ton problème ?
Fais le de façon claire, précise et ne laissant nulle place à une quelconque interprétation.

Prends tout ton temps, mais fais-le bien...
J'ai quant à moi l'impression de ce que ton problème ressemble à celui de l'attribution de plaques numéralogiques de voitures (par exemple).
Si tel est le cas, des conventions sont forcément arrêtées . Quelles sont-elles, très exactement,  tant pour la 1ère série de chiffres que pour la 1ère lettre, et que pour la seconde série de chiffres et la seconde lettre.
Si tu sais faire cet effort d'expression, tu recevras mon aide (et elle sera bonne).
Dans le cas contraire, je me contenterai de regarder le nombre de messages s'allongeant à l'infini.
0
ShiZZle971 Messages postés 21 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 20 décembre 2007
19 janv. 2007 à 01:52
Je ne voulais pas dévoiler tout mon projet, mais bon ...
Je reprends depuis le début et je "Prends tout mon temps".

L'entreprise dans laquelle je suis stagiaire m'a demandée de lui développer un logiciel qui lui fera gagner du temps lors de la réception de produits Fournisseurs. Il faut savoir que pour chaque produits reçu, je dois stocker dans la base de donnée ses informations tels que :
- la référence de l'article
- la désignation de l'article
- la quantitée reçue
- le numéro de série (si il y a)
- le numéro de lot (si il y a)

Les références, les numéros de série et les numéros de lot, je les récupère dans une textbox appropriée grâce à une douchette code barre.
Il faut savoir que lors de réception de commande, la plupart du temps les numéros de série se suivent, ou encore une partie reste inchangée. Et ils ne souhaitent pas s'amuser a bipper chaque produits si ce n'est qu'une chose qui change.

Exemple de réception de commande :

Réf. 89413 : Carte mère Asrock
Quantité : 5
Numéro de série de la premiere carte : 9723E1416F
Numéro de série de la seconde carte :
9723E1416G
Numéro de série de la troisième carte : 9723E1416H
Numéro de série de la quatrième carte : 9723E1416I
Numéro de série de la cinquième carte : 9723E1416J

Je dois récupérer chacune de ces informations et les stocker dans la base de donnée (stocker dans une base de donnée n'est pas un probleme).

Comme vous avez pu le remarquer, il n'y a pas forcément qu'une seule lettre dans un numéro de série, il peut même ne pas y en avoir. Je pensais donc placer un marqueur comme "*" avant la lettre à incrémenter dans ma textbox pour indiquer quelle lettre incrémenter.

La question est donc : comment générer ces numéros de séries ?

PS adressé à [auteurdetail.aspx?ID=615490 jmfmarques] : J'ai passé une heure a rédiger ça donc j'ai fais de mon mieux pour vous expliquer, et je te remercie de ne pas m'avoir envoyé balader ...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
19 janv. 2007 à 07:43
Bonjour 526320 ShiZZle971, je ne suis pas le stagiaire, mais celà ne fait ruien : je vais m'efforcer de ne pas passer une heure à rédiger ce qui suit :

"Il me faut, dans une chaine de caractères composée de chiffres et de lettres et revêtant la forme ###..##A##...###A (où  les # représentent des choffres et mes A représentent des lettres) construire une nouvelle chaîne de caractères composée des mêles chiffres et des mêmes lettres sauf une seule lettre qui doit devenir la lettre immadiatement supérieure (par exemple : E ==>> F)"


Comme tu le vois, j'ai tout dit de ce qu'ol me fallait, sans dévoiler le prijet de mon entreprise, ni même parlé de douchette, de produits, etc...et celà ne m'a pas pris plus d'une minute en dépit de mes gros doigts se battant avec un clavier ytop petit pour eux !

Tu ne dis pas s'il s'agit toujours de la dernière lettre, mais je pense que oui compte tenu de ce que tu dis faire :

Alors :

Si c'est la dernière lettre de ta chaîne chaine :

Private Sub Command1_Click()
  chaine = Text1.Text
  dernière_lettre = Right(chaine, 1)
  partie_fixe = Left(chaine, Len(chaine) - 1)
  n = 1  If dernière_lettre "Z" Then n -25
  Text1.Text = partie_fixe & Chr(Asc(dernière_lettre) + n)
End Sub

Ici text1.text est ta sausie qui doit s'uncrémenter et command1 est un bouton de command pour simuler ...

Si maintenant, la lettre augmentant n'est pas forcément la dernière, dis-le et nous te modiefierons ce petit mécanisme.






 
0
Rejoignez-nous