VBA Probleme de Boucle If

Résolu
la_bavaroise Messages postés 24 Date d'inscription mercredi 14 septembre 2005 Statut Membre Dernière intervention 22 novembre 2005 - 15 sept. 2005 à 16:02
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 - 16 sept. 2005 à 13:43
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

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
15 sept. 2005 à 22:29
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
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
15 sept. 2005 à 16:12
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
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
15 sept. 2005 à 17:06
Petite précision ... "If" n'est pas une instruction de boucle !!! C'est une instruction de test !!
0
la_bavaroise Messages postés 24 Date d'inscription mercredi 14 septembre 2005 Statut Membre Dernière intervention 22 novembre 2005
15 sept. 2005 à 17:28
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
0

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

Posez votre question
cs_Celeborn Messages postés 38 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 20 septembre 2006
15 sept. 2005 à 18:15
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 !!! ;-))
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
15 sept. 2005 à 21:25
C'est surtout qu'il faudrait plutot travailler avec un tableau plutot qu'avec 50 variables !!!

Christophe
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
15 sept. 2005 à 23:07
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 ...
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
16 sept. 2005 à 01:59
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é
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
16 sept. 2005 à 02:12
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é
0
cs_Celeborn Messages postés 38 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 20 septembre 2006
16 sept. 2005 à 09:19
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 !!! ;-))
0
la_bavaroise Messages postés 24 Date d'inscription mercredi 14 septembre 2005 Statut Membre Dernière intervention 22 novembre 2005
16 sept. 2005 à 09:54
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
0
la_bavaroise Messages postés 24 Date d'inscription mercredi 14 septembre 2005 Statut Membre Dernière intervention 22 novembre 2005
16 sept. 2005 à 10:20
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
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
16 sept. 2005 à 13:43
oups,
Bé oui précipitation quand tu nous tiens ........

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
Rejoignez-nous