VBA Probleme de Boucle If [Résolu]

Signaler
Messages postés
24
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
22 novembre 2005
-
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
-
Bonjour à tous,

mon probleme est certainement tres simple et evident...
Voici, ma boucle:

If InStr(Zelleninhalt, F_T) Or InStr(Zelleninhalt, F_T2) Then
Rows(k).Delete 'Die Zeile löschen, da ein Fehler drin ist
k = k - 1 'k wieder einen zurücksetzten
End If

le probleme est ke jai environ 50 variables F_T, et lorsque je retourne a la ligne, evidemment ma boucle est cassee... Comment faire?

Merci d'avance pro de la prog!!

Caroline

13 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bah ! oui ! Utilise un tableau ! c'est évident ! comme le dit Crenaud du 76 !

Rapidement ton code devient :

Dim F_T(50) as string

F_T(1)= ","
F_T(2) = "?"
F_T(3) = "topcars"
F_T(4) = "allbank"
F_T(5) = "axa"
F_T(6) = "fs"
F_T(7) = "creditplus"
F_T(8) = "devk"

...etc...

Puis :

For k = 1 To Sheet_Quelle_Ende
Zelleninhalt = Sheets(Sheet_Quelle).Range(Sheet_Quelle_col & k).Value
'maintenant voir, si le contenu de la cellule a une faute

for t=1 to 8
If InStr(Zelleninhalt, F_T(t)) Then
Rows(k).Delete
k = k - 1 'permet de revenir sur la bonne ligne qui vient d'être remontée
End If
next t

Next k

Amicalement,
Us.
3
Merci

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

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

Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Si j'ai bien compris, tu veux tester tes 50 variables F_T?

Dans ce cas utilise un tableur et une boucle Fro ou Do..Loop.



Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)

Une question se pose sur le forum, pas en privé


NH
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
Petite précision ... "If" n'est pas une instruction de boucle !!! C'est une instruction de test !!
Messages postés
24
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
22 novembre 2005

Salut les gars, c gentil, merci de m'eduquer en voca, c'est admirable!

En fait, je ne peux pas utiliser de tableur. ma macro sert à detecter automatiquement des fautes de frappe provenant dune BDD externe et dont les données sont exportees dans une feuille excel. Pour les detecter, jai donc creer cette variable(F_T). La seule chose qui est sure, cest que les fautes sont a detectees ds la colonne C, le reste, cad les cellules precises, je ne peux les connaitre a l'avance, tout depend de l'actualisation

Voici un extrait de mon code:

Option Explicit
Public Sheet_Quelle, Sheet_Quelle_col, Sheet_Quelle_Ende
'(Quelle=source)

Sub Finde_Fehler() '(macro trouver_faute)


'***********************************************************************************
'Variables a declarer
'******************************************************************
Sheet_Quelle = "WWH" 'le nom de ma Worksheet, ou je veux trouver la derniere 'ligne
Sheet_Quelle_col = "C" la colonne de ma Worksheet, ou je veux trouver la 'derniere ligne

Call letzte_zeile_Quelle ' la derniere ligne, qui sera trouve par Public Sub 'letzte_zeile grace a lordre Call


Sheets(Sheet_Quelle).Select


Dim k, Zelleninhalt, Dim k, Zelleninhalt, F_T, F_T2, F_T3, F_T4, F_T5, F_T6, F_T7, F_T8 'F_T=Fehler_Text qui veut dire faute_texte


F_T = ","
F_T2 = "?"
F_T3 = "topcars"
F_T4 = "allbank"
F_T5 = "axa"
F_T6 = "fs"
F_T7 = "creditplus"
F_T8 = "devk"

For k = 1 To Sheet_Quelle_Ende
Zelleninhalt = Sheets(Sheet_Quelle).Range(Sheet_Quelle_col & k).Value
'maintenant voir, si le contenu de la cellule a une faute
If InStr(Zelleninhalt, F_T) Or InStr(Zelleninhalt, F_T2) Or InStr(Zelleninhalt, F_T3) Or InStr(Zelleninhalt, F_T4) Or InStr(Zelleninhalt, F_T5) Or InStr(Zelleninhalt, F_T6) Or InStr(Zelleninhalt, F_T7) Or InStr(Zelleninhalt, F_T8)Then
'la, jutilise la fonction InStr
'si il y a bien une faute, alors
Rows(k).Delete 'Die Zeile löschen, da ein Fehler drin ist
k = k - 1
End If
Next k

End Sub


Public Sub letzte_zeile_Quelle()
Sheets(Sheet_Quelle).Select
Sheet_Quelle_Ende = 0
Sheet_Quelle_Ende = ActiveSheet.Cells(Rows.Count, Sheet_Quelle_col).End(xlUp).Row

End Sub

Voila, donc je ne sais comment faire pour ne pas casse linstruction de test If?
Mais si je m'exprime mal, n'hesitez pas a me le faire savoir,

Aller, merci d'avance,

Ciao,
la bavaroise
Messages postés
38
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
20 septembre 2006

Bonjour,

Je pense avoir compris ta question.
If InStr(Zelleninhalt, F_T) Or InStr(Zelleninhalt, F_T2) Or InStr(Zelleninhalt, F_T3) _
Or InStr(Zelleninhalt, F_T4) Or InStr(Zelleninhalt, F_T5) Or InStr(Zelleninhalt, F_T6) _
Or InStr(Zelleninhalt, F_T7) Or InStr(Zelleninhalt, F_T8)Then

Le secret est dans le caractére " _ " ! :-)

Mais j'ai tout de même peur que de répéter 50 fois ce test dans le même " If " générera une phrase trop longue pour VBA
Pourquoi ne pas réaliser ce test de cette façon ?

Test = InStr(Zelleninhalt, F_T1)
Test = Test + InStr(Zelleninhalt, F_T2)
Test = Test + InStr(Zelleninhalt, F_T3)
.....
If Test then
....

Virtuellement vôtre !!! ;-))
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
C'est surtout qu'il faudrait plutot travailler avec un tableau plutot qu'avec 50 variables !!!

Christophe
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
Sauf qu'à mon avis, il faudrait rajouter un "Exit For" après le k = k -1 (inutile de continuer les tests si une valeur à répondu à notre attente)

Et je pense qu'on peut se passer de la boucle for de 1 à 8 ... En fait, il y a même plus de tableau pour le coup ...
Je ferais cela :
F_T = ", ? topcars allbank axa fs creditplusdevk"
...etc...

Puis :

For k = 1 To Sheet_Quelle_Ende
Zelleninhalt = Sheets(Sheet_Quelle).Range(Sheet_Quelle_col & k).Value
If InStr(Zelleninhalt, F_T) Then
Rows(k).Delete
k = k - 1
End If
Next k

Au cas ou les différentes val recherché pourrait contenir un espace, il faudrat modifier légèrement la construction de la var F_T en utilsant par exemple un vbNullChar plutot que l'espace ...

F_T = "," & vbNullChar & "?" & vbNullChar & "topcars" & vbNullChar & "allbank" & vbNullChar & "axa" & vbNullChar & "fs" & vbNullChar & "creditplusdevk"

Comme ca, ca blinde le truc on est peinard ...
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Salut,
On reprend tout du début, ton prob vient du fait que tu effaces ta ligne en partant du début.
Donc je te conseille deFaire le contraire
For k = Sheet_Quelle_Ende to 1 step -1
.........
.........
.........
Donc tu gardes ton code du début et tu testes cette modif

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Re,
Désolé pour la répet.
Si tu as beaucoup de fautes à tester je te conseille le select case en lieu et place de ton If .......

Select case Zelleninhalt
Case Is = ",", "?", "topcars", "allbank" ....etc....
Rows(k).Delete
Case Else
End Select
Tu peux même le faire sur plusieurs lignes ....

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
38
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
20 septembre 2006

Bonjour,

218510 valtrase le problème ne peut être résolu par le select case puisque ce n'est pas une chaine entière qui est recherchée mais une sous-chaîne, et de vider la colonne depuis le début ou la fin n'est pas vraiment un soucis.

=143123 crenaud76 pourquoi arrêter de tester la colonne alors qu'il peut rester des erreurs dedans ?, et nous cherchons si la cellule contient une des erreurs, et non toutes les erreurs, ce que fait ton second code, la meilleure des solutions me semble être a première idée, développée par 488557 us_30 .

Mais je désirerais attirer l'attention de =578964 la_bavaroise sur cette façon de gérer les comparaisons de chaîne de caractère, sans tenir compte de la casse, je pense que le mieux à faire est de penser à passer les chaînes prises dans les cellules dans une casse, par exemple, tout en minuscule, et de remplir le tableau avec des chaînes, elles aussi, en minuscule.
L'instruction "StrComp" n'étant pas utilisable puisque nous recherchons une sous chaîne.

Virtuellement vôtre !!! ;-))
Messages postés
24
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
22 novembre 2005

ouahhh!
Je vois que j'ai lancé le débat! c cool,

Bon je teste la réponse de us_30, je vous tiens au courant et merci d'avance

A tt a lheure

la_bavaroise
Messages postés
24
Date d'inscription
mercredi 14 septembre 2005
Statut
Membre
Dernière intervention
22 novembre 2005

Bon les gars,


Ca marche Cap'taine! us_30 avait raison: merci a toi, et merci a ts les autres qui ont participe a la discussion

Bonne continuation a tous
et on boira a votre sante pour la fete de la biere ce we!!

Bises
la_bavaroise
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
oups,
Bé oui précipitation quand tu nous tiens ........

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé