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

Messages postés
27
Date d'inscription
vendredi 30 avril 2010
Statut
Membre
Dernière intervention
1 juin 2011
- - Dernière réponse : 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.
Afficher la suite 

11 réponses

Meilleure réponse
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 206 internautes nous ont dit merci ce mois-ci

Commenter la réponse de houtas
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
0
Merci
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
Commenter la réponse de houtas
Messages postés
14598
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 décembre 2019
137
0
Merci
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
Commenter la réponse de NHenry
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
0
Merci
bien vu le split sur le cractère recherché simplifie la tâche
Commenter la réponse de houtas
Messages postés
27
Date d'inscription
vendredi 30 avril 2010
Statut
Membre
Dernière intervention
1 juin 2011
0
Merci
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 ?!
Commenter la réponse de HiiiCoach
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
0
Merci
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 
Commenter la réponse de houtas
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
0
Merci
dim i as integer 
i=1 
while isempty(cells(i,1))=false 
i=i+1 
Wend 
Commenter la réponse de houtas
Messages postés
27
Date d'inscription
vendredi 30 avril 2010
Statut
Membre
Dernière intervention
1 juin 2011
0
Merci
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...
Commenter la réponse de HiiiCoach
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
0
Merci
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.
Commenter la réponse de houtas
Messages postés
27
Date d'inscription
vendredi 30 avril 2010
Statut
Membre
Dernière intervention
1 juin 2011
0
Merci
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...
Commenter la réponse de HiiiCoach
Messages postés
116
Date d'inscription
jeudi 14 décembre 2006
Statut
Membre
Dernière intervention
29 août 2013
0
Merci
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....
Commenter la réponse de houtas