[Déplacé .Net --> VBA] VBA Excel: Rechercher un caractère dans une chaîne en par

Résolu
HiiiCoach Messages postés 27 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 1 juin 2011 - 30 avril 2010 à 16:19
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013 - 3 mai 2010 à 15:52
Bonjour à tous,

Merci d'avance pour l'aide que vous m'apporterez.

Je code en VB sous excel 2000, mon but serait de controler un jeu de données excel (localisé à chaque fois dans la colonne A).

Celui-ci se présente de la façon suivante:

---------A-----------

1 uhiferfui|feff|rfrfgrf|bvrgvtrg|
2 uhrr|vrtvrgv|gtgtg|gtgt|
3 1233|jrfrf|frf|gtrrg|


En fait, un | représente un champ, j'ai créé une userform qui demande à l'utilisateur combien de champ doivent normalement figurer dans une ligne, en sachant que le nombre de champ par ligne est à chaque fois le même. Dans l'exemple, il y a 4 | donc 4 champs par ligne.

En fait je voudrai parcourir chaque ligne, et initialiser un compteur qui compte le nombre de |. A la fin de chaque ligne le compteur est remis à 0 et si le nombre de | est erroné, un fichier .txt est créé avec le numero de la ligne defectueuse.

A savoir que le nombre de ligne n'est pas connu à l'ouverture du fichier, la boucle doit donc parcourir chaque ligne jusqu'à "".

Pouvez vous m'indiquer comment faire ?

Cordialement.

11 réponses

houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
30 avril 2010 à 18:05
Comme c'est le weekend, et je vais décoller du PC voila ta fonction l'utilisation de MID est plus simple que la méthode avec left et right
Sub parcourir()
Dim i, j, nbcar As Integer
Dim caract As String
i = 1
'parcourir la colonne tant que la cellue n'est pas vide
While IsEmpty(Cells(i, 1)) = False
nbcar = Len(Cells(i, 1))
For j = 1 To nbcar
caract = Mid(Cells(i, 1), j, 1)
Debug.Print caract
Next
i = i + 1
Wend
End Sub
3
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
30 avril 2010 à 16:45
On va décomposer le problème:
pour parcourir les lignes tant que c'est pas vide
dim i as integer
i=1
while isempty(cells(i,1)=false
i=i+1
Wend
étant donné que la chaine de caractère peut contenir plusieurs fois le même caractère j'utiliserais pas la fonction find
je te propose de trouver le nombre de caractère de la cellule avec la fonction nbcar:
l'utilisation de la formule right(left(cells(i,1),nbcar) te permettera de tester le 1er carctère de la chaine, ensuite tu fait nbcar-1 tant que nbcar>1 pour parcourir toute la chaine sauf quand nbcar=1 ou tu fera un simple right(cells(i,1),1) pour trouver le dernier caractère et tester sa valeur
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
30 avril 2010 à 16:45
Bonjour,

Une solution simple :

Dim ltStr() as String

ltStr=Split(MaValeur,"|")
if ubound(ltStr)+1<>4 then
    'Pas bon
Else
    'OK
End If


Mon site
0
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
30 avril 2010 à 16:54
bien vu le split sur le cractère recherché simplifie la tâche
0

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

Posez votre question
HiiiCoach Messages postés 27 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 1 juin 2011
30 avril 2010 à 17:08
Merci pour les réponses, j'ai copié collé ton code Nhenry, mais à chaque fois ça me renvoit "Pas bon"...

Il faut que je crée une boucle autour de ce code pour parcourir chaque ligne de ma colonne jusqu'à ce qu'il y en ait une vide ?!
0
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
30 avril 2010 à 17:37
c ca le code pour parcourir jusqu'a la cellule vide

dim i as integer 
i=1 
while isempty(cells(i,1)=false 
i=i+1 
Wend 
0
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
30 avril 2010 à 17:46
dim i as integer 
i=1 
while isempty(cells(i,1))=false 
i=i+1 
Wend 
0
HiiiCoach Messages postés 27 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 1 juin 2011
3 mai 2010 à 14:48
Merci pour vos réponses, ça marche ;)

Maintenant, toujours sur la même base, je souhaiterai pouvoir effectuer divers contrôles sur ces champs mais je ne vois pas comment m'y prendre:

- Un document de réfèrence (au format word) spécifie les champs qui sont obligatoires ou non... Je voudrais que l'utilisateur puisse vérifier qu'aucun champ obligatoire ne manque... J'avoue que je suis un peu perdu là dessus.


- Ce document spécifier également les formats attendus (numérique, caractère): Je dois contrôler par exemple que tel champ qui est attendu comme contenant un numérique, contient bien un numérique, et pas une chaîne de caractères, ou une date...

Si quelqu'un a une idée...
0
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
3 mai 2010 à 14:59
merci de sélectionner la réponse grâce à laquelle tu a résolu ton problème et de cliquer sur réponse accepté.
Ensuite si tu bloque sur un autre pb crée un sujet spécifique et détaille ou tu bloque.
0
HiiiCoach Messages postés 27 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 1 juin 2011
3 mai 2010 à 15:18
Toutes les réponses m'ont apporté des pistes en fait mais bon...

Concernant mon problème, il est toujours lié à ce sujet, simplement, je progresse par étapes...
0
houtas Messages postés 116 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 29 août 2013
3 mai 2010 à 15:52
pour tester le format d'une cellule
If IsNumeric(Range("C8").Value) Then
MsgBox ("OK")
End If
If IsDate(Range("C7").Value) Then
MsgBox ("OK")
End If

Concernant les champs obligatoires si c'est sur excel
tu peux créer une proc pour vérifier que les cellule ne sont pas vides
if isempty(range("A2")) = true then....
0
Rejoignez-nous