Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

condition "si alors sinon" sur vba

15 réponses
Avatar
pauline
Boujour à toutes et à tous

Je souhaitrai introduire la condition sinon après ma formule, mais je ne
sais pas comment m'y prendre.
Je voudrai que si la 1ère condition n'est pas remplie, il passe à la 2ème
condition.

for each c in range ("a1:a6000")
if c.value=txtfact then
range ("b" & c).value=txt
end if
next c
'SINON
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
With Sheets("recap")
range ("a" & num).value=txt
end with
end sub

merci pour votre aide

5 réponses

1 2
Avatar
Michel Gaboly
Bonjour Pauline,


Le réveillon a eu des effets nocifs sur le code de Sitting Hoax :

Le voici, indenté pour le rendre + lisible :

For Each c In Range("a1:a6000")
If c.Value = TxtFact Then
Num = c.Row
Range("B" & Num).Value = Txt
Exit For
'SINON
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = Txt
Sheets("recap").Range("B" & Num2).Value = Txt
Exit For
End If
Next c

Dès le premier passage de la boucle, on rencontre un "If... Then... Els e" avec un "Exit For" associé aux 2 termes de
l'alternative.

On ne passe donc qu'une fois dans la boucle, et à moins que le numéro saisi soit celui qui figure en A1, on va inscrire
les données à la ligne "Num2", correspondant à la première ligne vide. (accessoirement, on reporte 2 fois txt)

La structure raisonnable est celle-ci

For Each c In Range("a1:a6000")
If c = TxtFact Then
Num = c.Row
Exit For
End If
Next c
' Test si le numéro de facture a été trouvé
If Num <> 0 Then
Range("B" & Num).Value = Txt
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = TxtFact
Sheets("recap").Range("B" & Num2).Value = Txt
End If

La boucle sert seulement à repérer si le numéro de facture existe d éjà.

Il y a encore en élément important à prendre en compte : si tous le s numéros de factures n'ont pas été alimentés par un
UserForm avec un TextBox, le test "If c = TxtFact Then" est toujours né gatif car TxtFact est un TextBox, et ce qui en
sort est ... du texte. Par conséquent si c est numérique, TxtFact n'e st jamais égal à c ;-((


Si c est numérique, il faut modifier ainsi le test :

If c = CLng(TxtFact) Then

ce qui permet de convertir en nombre entier le contenu de TxtFact (CInt m archerait aussi avec une plage de 6000 lignes,
mais pourrait planter si la plage s'étand beaucoup, car un Integer ne p eut dépasser 32 767).

A moins que la colonne A ait été formatée en Texte, ce qui rend cor rect le test

If c = TxtFact Then

la prudence consiste à tester ainsi :

If CLng(c) = CLng(TxtFact) Then

car même si la colonne A a été alimentée par un TextBox sur un Us erForm, le simple fait de cliquer dans la barre de
formule alors qu'une cellule de la colonne A contenant un numéro de fac ture est la cellule active, a rendu numérique le
contenu de celle-ci.


Ceci dit, tout cela correspond à une mauvaise approche : il est inutile de prévoir une boucle avec plusieurs milliers de
passges, quand la fonction EQUIV() suffit à localiser l'éventuelle pr ésence du numéro de facture :

Private Sub CommandButton1_Click()
Dim Test As Boolean, Num As Long
Test = IsError(Application.Match(CLng(TxtFact), Sheets("recap").Ra nge("A:A"), 0))
If Test Then
Num = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num) = CLng(TxtFact)
Else
Num = Application.Match(CLng(TxtFact), Sheets("recap").Ran ge("A:A"), 0)
End If
Sheets("recap").Range("B" & Num) = Txt
End Sub

******** NB - Ce code est prévu pour une colonne A en numérique.


Joyeux Noël,


Bonjour et joyeux noël,

J'espère que tu tu as été gaté par le père noël!

Je reviens sur mon petit problème (qui me met en rage depuis hier car j'ai
beau retourner le code dans tous les sens je n'arrive pas a avoir le
résultat escompté. Pourtant, je suis la logique du: Si dans ma colo nne
A1:A6000, il existe une valeur corespondante à TXT FACT donc, inscrir e sur
cette ligne la valeur de TXT, SINON, inscrire sur la dernière ligne v ide).

Quand je recopie ton code , il ignore la première condition et m'insc rit à
la dernère ligne vide dans colonne A le numéro de fact saisie dans TXTFACT
même s'il est existant.

Comment traduis t-on le SINON en VBA?

Merci pour ta réponse
Pauline

"Sitting Hoax" <http://cerbermail.com/?GSQ36o9bFb> a écrit dans le me ssage
de news:

Bonsoir, c'est déjà un peu plus clair.
excuse le retard, mais j'ai attaqué le réveillon...
Je pense que ceci devrait marcher
si le numéro de facture est présent la macro inscrit txt dans la co lonne B
en face de C
sinon, en bas de la colonne A, elle inscrit le nouveau nuéro de factu re et
en face, colonne B la valeur txt
******************
For Each c In Range("a1:a6000")
If c.Value = txtfact Then
num = c.Row
Range("B" & num).Value = txt
Exit For
'SINON
Else
num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & num2).Value = txt
Sheets("recap").Range("B" & num2).Value = txt
Exit For
End If
Next c
End Sub

*******************
Bon réveillon
Amicalement
Sitting Hoax

"pauline" a écrit dans le message de news:


Bonsoir Siiting Hoax

Merci de te pencher sur mon problème.

Effectivement, je vois que tu as bien compris ce que je voulais faire. Il
s'agit d'une appli de facturation.

Donc, j'ai dans ma colonne A de ma feuille "recap" une liste de numé ros
de fact.
J'ai un formulaire avec 2 TXT. Dans TXTFACT j'ai un numéo de factur e.
Je souhaiterais que:
1) il regarde dans la colonne A de ma feuille "recap" si le numéro d ans
TXTFACT est présent (donc, il sagit d'une facture déjà créée que
l'utilisateur a rappelé et a fait des modifs)
2) si, oui, donc, il m'envoi le contenu de TXT sur la ligne
correspondnate;(il me modifie donc ma ligne avec les nouvelles donné es)
3)si, non il me l'envoi dans la dernière ligne vide.(il s'agit d'une
npouvelle facture)

Merci de ton aide car je n'arrive pas à décrocher de ce problème et chez
moi, ils râlent car ils m'attendent pour réveillonner...et moi je ne veux
pas abandonner!

Tu réveillonnes toi aussi?

Pauline


"Sitting Hoax" <http://cerbermail.com/?GSQ36o9bFb> a écrit dans le
message de news:

Bonsoir,
il semble qu'il y ait un problème dans ta macro.
La valeur de c dans Range("b" & c).Value = txt
ne serait elle pas plutôt c.row ? ou c.row+1 ?
ce qui expliquerait que la macro saute cette instruction.
Range("b" & c.row).Value = txt

Je suppose (peut être à tort) que lorsque la valeur de la cellule C =
txtfact ,
(txtfact est elle une valeur numérique ? )
tu veux que s'inscrive à ses côtés, colonne B, la valeur txt
SINON, dans la colonne A de la feuille recap, s'inscrit la valeur txt
dans la dernière cellule vide ?
Chez moi, cette macro fait cela, je ne vois pas ce qui cloche.

For Each c In Range("a1:a6000")
If c.Value =txtfact Then
'Range("b" & c).Value = txt
Range("b" & c.Row).Value = txt
'SINON
Else
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
With Sheets("recap")
Range("a" & num).Value = txt
End With
End If
Next c
End Sub

Si tu pouvais expliquer ce que tu désires obtenir comme résultat,
on pourrait peut être corriger la macro.
Amicalement
Sitting Hoax

"pauline" a écrit dans le message de
news:

Bonsoir "sitting hoax"

J'ai essayé avec else, mais il fait les 2 actions alors qu'il devr ait
faire soit l'une soit l'autre....
Bon reveillon !

"Sitting Hoax" <http://cerbermail.com/?GSQ36o9bFb> a écrit dans le
message de news:

Bonsoir,
tu peux ajouter Else ou ElseIf
dans l'aide de VBA, c'est bien expliqué
pour ton cas :
***********
For Each c In Range("a1:a6000")
If c.Value = txtfact Then
Range("b" & c).Value = txt
'SINON
Else
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
Sheets("recap").Range("a" & num).Value = txt
End If
Next c
End Sub
************
je pense que ça ira avec ça,
bon Noël ! :-)
Amicalement
SItting Hoax


"pauline" a écrit dans le message de
news: %

Boujour à toutes et à tous

Je souhaitrai introduire la condition sinon après ma formule, ma is je
ne sais pas comment m'y prendre.
Je voudrai que si la 1ère condition n'est pas remplie, il passe à la
2ème condition.

for each c in range ("a1:a6000")
if c.value=txtfact then
range ("b" & c).value=txt
end if
next c
'SINON
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
With Sheets("recap")
range ("a" & num).value=txt
end with
end sub

merci pour votre aide




















--
Cordialement,

Michel Gaboly
www.gaboly.com







Avatar
pauline
Bonjour à vous tous, Michel, Jacquouille et Sitting,

Cela marche et je suis super contente!!!! Merci aussi pour les explications
comme cela j'ai enfin compris pourquoi cela ne fonctionnait pas.

BON NOEL
Pauline

"Michel Gaboly" a écrit dans le message de news:
#
Bonjour Pauline,


Le réveillon a eu des effets nocifs sur le code de Sitting Hoax :

Le voici, indenté pour le rendre + lisible :

For Each c In Range("a1:a6000")
If c.Value = TxtFact Then
Num = c.Row
Range("B" & Num).Value = Txt
Exit For
'SINON
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = Txt
Sheets("recap").Range("B" & Num2).Value = Txt
Exit For
End If
Next c

Dès le premier passage de la boucle, on rencontre un "If... Then... Else"
avec un "Exit For" associé aux 2 termes de
l'alternative.

On ne passe donc qu'une fois dans la boucle, et à moins que le numéro saisi
soit celui qui figure en A1, on va inscrire
les données à la ligne "Num2", correspondant à la première ligne vide.
(accessoirement, on reporte 2 fois txt)

La structure raisonnable est celle-ci

For Each c In Range("a1:a6000")
If c = TxtFact Then
Num = c.Row
Exit For
End If
Next c
' Test si le numéro de facture a été trouvé
If Num <> 0 Then
Range("B" & Num).Value = Txt
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = TxtFact
Sheets("recap").Range("B" & Num2).Value = Txt
End If

La boucle sert seulement à repérer si le numéro de facture existe déjà.

Il y a encore en élément important à prendre en compte : si tous les numéros
de factures n'ont pas été alimentés par un
UserForm avec un TextBox, le test "If c = TxtFact Then" est toujours négatif
car TxtFact est un TextBox, et ce qui en
sort est ... du texte. Par conséquent si c est numérique, TxtFact n'est
jamais égal à c ;-((


Si c est numérique, il faut modifier ainsi le test :

If c = CLng(TxtFact) Then

ce qui permet de convertir en nombre entier le contenu de TxtFact (CInt
marcherait aussi avec une plage de 6000 lignes,
mais pourrait planter si la plage s'étand beaucoup, car un Integer ne peut
dépasser 32 767).

A moins que la colonne A ait été formatée en Texte, ce qui rend correct le
test

If c = TxtFact Then

la prudence consiste à tester ainsi :

If CLng(c) = CLng(TxtFact) Then

car même si la colonne A a été alimentée par un TextBox sur un UserForm, le
simple fait de cliquer dans la barre de
formule alors qu'une cellule de la colonne A contenant un numéro de facture
est la cellule active, a rendu numérique le
contenu de celle-ci.


Ceci dit, tout cela correspond à une mauvaise approche : il est inutile de
prévoir une boucle avec plusieurs milliers de
passges, quand la fonction EQUIV() suffit à localiser l'éventuelle présence
du numéro de facture :

Private Sub CommandButton1_Click()
Dim Test As Boolean, Num As Long
Test = IsError(Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0))
If Test Then
Num = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num) = CLng(TxtFact)
Else
Num = Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0)
End If
Sheets("recap").Range("B" & Num) = Txt
End Sub

******** NB - Ce code est prévu pour une colonne A en numérique.


Joyeux Noël,


Bonjour et joyeux noël,

J'espère que tu tu as été gaté par le père noël!

Je reviens sur mon petit problème (qui me met en rage depuis hier car j'ai
beau retourner le code dans tous les sens je n'arrive pas a avoir le
résultat escompté. Pourtant, je suis la logique du: Si dans ma colonne
A1:A6000, il existe une valeur corespondante à TXT FACT donc, inscrire sur
cette ligne la valeur de TXT, SINON, inscrire sur la dernière ligne vide).

Quand je recopie ton code , il ignore la première condition et m'inscrit à
la dernère ligne vide dans colonne A le numéro de fact saisie dans TXTFACT
même s'il est existant.

Comment traduis t-on le SINON en VBA?

Merci pour ta réponse
Pauline

"Sitting Hoax" <http://cerbermail.com/?GSQ36o9bFb> a écrit dans le message
de news:

Bonsoir, c'est déjà un peu plus clair.
excuse le retard, mais j'ai attaqué le réveillon...
Je pense que ceci devrait marcher
si le numéro de facture est présent la macro inscrit txt dans la colonne B
en face de C
sinon, en bas de la colonne A, elle inscrit le nouveau nuéro de facture et
en face, colonne B la valeur txt
******************
For Each c In Range("a1:a6000")
If c.Value = txtfact Then
num = c.Row
Range("B" & num).Value = txt
Exit For
'SINON
Else
num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & num2).Value = txt
Sheets("recap").Range("B" & num2).Value = txt
Exit For
End If
Next c
End Sub

*******************
Bon réveillon
Amicalement
Sitting Hoax

"pauline" a écrit dans le message de news:


Bonsoir Siiting Hoax

Merci de te pencher sur mon problème.

Effectivement, je vois que tu as bien compris ce que je voulais faire. Il
s'agit d'une appli de facturation.

Donc, j'ai dans ma colonne A de ma feuille "recap" une liste de numéros
de fact.
J'ai un formulaire avec 2 TXT. Dans TXTFACT j'ai un numéo de facture.
Je souhaiterais que:
1) il regarde dans la colonne A de ma feuille "recap" si le numéro dans
TXTFACT est présent (donc, il sagit d'une facture déjà créée que
l'utilisateur a rappelé et a fait des modifs)
2) si, oui, donc, il m'envoi le contenu de TXT sur la ligne
correspondnate;(il me modifie donc ma ligne avec les nouvelles données)
3)si, non il me l'envoi dans la dernière ligne vide.(il s'agit d'une
npouvelle facture)

Merci de ton aide car je n'arrive pas à décrocher de ce problème et chez
moi, ils râlent car ils m'attendent pour réveillonner...et moi je ne veux
pas abandonner!

Tu réveillonnes toi aussi?

Pauline


"Sitting Hoax" <http://cerbermail.com/?GSQ36o9bFb> a écrit dans le
message de news:

Bonsoir,
il semble qu'il y ait un problème dans ta macro.
La valeur de c dans Range("b" & c).Value = txt
ne serait elle pas plutôt c.row ? ou c.row+1 ?
ce qui expliquerait que la macro saute cette instruction.
Range("b" & c.row).Value = txt

Je suppose (peut être à tort) que lorsque la valeur de la cellule C >>>>txtfact ,
(txtfact est elle une valeur numérique ? )
tu veux que s'inscrive à ses côtés, colonne B, la valeur txt
SINON, dans la colonne A de la feuille recap, s'inscrit la valeur txt
dans la dernière cellule vide ?
Chez moi, cette macro fait cela, je ne vois pas ce qui cloche.

For Each c In Range("a1:a6000")
If c.Value =txtfact Then
'Range("b" & c).Value = txt
Range("b" & c.Row).Value = txt
'SINON
Else
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
With Sheets("recap")
Range("a" & num).Value = txt
End With
End If
Next c
End Sub

Si tu pouvais expliquer ce que tu désires obtenir comme résultat,
on pourrait peut être corriger la macro.
Amicalement
Sitting Hoax

"pauline" a écrit dans le message de
news:

Bonsoir "sitting hoax"

J'ai essayé avec else, mais il fait les 2 actions alors qu'il devrait
faire soit l'une soit l'autre....
Bon reveillon !

"Sitting Hoax" <http://cerbermail.com/?GSQ36o9bFb> a écrit dans le
message de news:

Bonsoir,
tu peux ajouter Else ou ElseIf
dans l'aide de VBA, c'est bien expliqué
pour ton cas :
***********
For Each c In Range("a1:a6000")
If c.Value = txtfact Then
Range("b" & c).Value = txt
'SINON
Else
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
Sheets("recap").Range("a" & num).Value = txt
End If
Next c
End Sub
************
je pense que ça ira avec ça,
bon Noël ! :-)
Amicalement
SItting Hoax


"pauline" a écrit dans le message de
news: %

Boujour à toutes et à tous

Je souhaitrai introduire la condition sinon après ma formule, mais je
ne sais pas comment m'y prendre.
Je voudrai que si la 1ère condition n'est pas remplie, il passe à la
2ème condition.

for each c in range ("a1:a6000")
if c.value=txtfact then
range ("b" & c).value=txt
end if
next c
'SINON
num = Sheets("recap").Range("A65536").End(xlUp).Row + 1
With Sheets("recap")
range ("a" & num).value=txt
end with
end sub

merci pour votre aide




















--
Cordialement,

Michel Gaboly
www.gaboly.com







Avatar
Michel Gaboly
De rien, c'était avec plaisir ;-))

Bonjour à vous tous, Michel, Jacquouille et Sitting,

Cela marche et je suis super contente!!!! Merci aussi pour les explicat ions
comme cela j'ai enfin compris pourquoi cela ne fonctionnait pas.

BON NOEL
Pauline

"Michel Gaboly" a écrit dans le message de news:
#
Bonjour Pauline,


Le réveillon a eu des effets nocifs sur le code de Sitting Hoax :

Le voici, indenté pour le rendre + lisible :

For Each c In Range("a1:a6000")
If c.Value = TxtFact Then
Num = c.Row
Range("B" & Num).Value = Txt
Exit For
'SINON
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = Txt
Sheets("recap").Range("B" & Num2).Value = Txt
Exit For
End If
Next c

Dès le premier passage de la boucle, on rencontre un "If... Then... E lse"
avec un "Exit For" associé aux 2 termes de
l'alternative.

On ne passe donc qu'une fois dans la boucle, et à moins que le numé ro saisi
soit celui qui figure en A1, on va inscrire
les données à la ligne "Num2", correspondant à la première lign e vide.
(accessoirement, on reporte 2 fois txt)

La structure raisonnable est celle-ci

For Each c In Range("a1:a6000")
If c = TxtFact Then
Num = c.Row
Exit For
End If
Next c
' Test si le numéro de facture a été trouvé
If Num <> 0 Then
Range("B" & Num).Value = Txt
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = TxtFact
Sheets("recap").Range("B" & Num2).Value = Txt
End If

La boucle sert seulement à repérer si le numéro de facture existe déjà.

Il y a encore en élément important à prendre en compte : si tous les numéros
de factures n'ont pas été alimentés par un
UserForm avec un TextBox, le test "If c = TxtFact Then" est toujours négatif
car TxtFact est un TextBox, et ce qui en
sort est ... du texte. Par conséquent si c est numérique, TxtFact n 'est
jamais égal à c ;-((


Si c est numérique, il faut modifier ainsi le test :

If c = CLng(TxtFact) Then

ce qui permet de convertir en nombre entier le contenu de TxtFact (CInt
marcherait aussi avec une plage de 6000 lignes,
mais pourrait planter si la plage s'étand beaucoup, car un Integer ne peut
dépasser 32 767).

A moins que la colonne A ait été formatée en Texte, ce qui rend c orrect le
test

If c = TxtFact Then

la prudence consiste à tester ainsi :

If CLng(c) = CLng(TxtFact) Then

car même si la colonne A a été alimentée par un TextBox sur un UserForm, le
simple fait de cliquer dans la barre de
formule alors qu'une cellule de la colonne A contenant un numéro de f acture
est la cellule active, a rendu numérique le
contenu de celle-ci.


Ceci dit, tout cela correspond à une mauvaise approche : il est inuti le de
prévoir une boucle avec plusieurs milliers de
passges, quand la fonction EQUIV() suffit à localiser l'éventuelle présence
du numéro de facture :

Private Sub CommandButton1_Click()
Dim Test As Boolean, Num As Long
Test = IsError(Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0))
If Test Then
Num = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num) = CLng(TxtFact)
Else
Num = Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0)
End If
Sheets("recap").Range("B" & Num) = Txt
End Sub

******** NB - Ce code est prévu pour une colonne A en numérique.


Joyeux Noël,



Bonjour et joyeux noël,

J'espère que tu tu as été gaté par le père noël!

Je reviens sur mon petit problème (qui me met en rage depuis hier car j'ai
beau retourner le code dans tous les sens je n'arrive pas a avoir le
résultat escompté. Pourtant, je suis la logique du: Si dans ma colo nne
A1:A6000, il existe une valeur corespondante à TXT FACT donc, inscrir e sur
cette ligne la valeur de TXT, SINON, inscrire sur la dernière ligne v ide).

Quand je recopie ton code , il ignore la première condition et m'insc rit à
la dernère ligne vide dans colonne A le numéro de fact saisie dans TXTFACT
même s'il est existant.

Comment traduis t-on le SINON en VBA?

Merci pour ta réponse
Pauline





--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Sitting Hoax
Merci Michel et Jacqouille d'avoir assuré la transition.
J'aurais été bien incapable de donner autant de précisions,
surtout après ce dur week end...;-)))
Je suis content que Pauline ait enfin une bonne solution.
Bon bout d'an comme on dit par chez nous:-))
Amicalement
Sitting Hoax (prêt à recommencer samedi quand même )


"Michel Gaboly" a écrit dans le message de news:

De rien, c'était avec plaisir ;-))

Bonjour à vous tous, Michel, Jacquouille et Sitting,

Cela marche et je suis super contente!!!! Merci aussi pour les
explications
comme cela j'ai enfin compris pourquoi cela ne fonctionnait pas.

BON NOEL
Pauline

"Michel Gaboly" a écrit dans le message de
news:
#
Bonjour Pauline,


Le réveillon a eu des effets nocifs sur le code de Sitting Hoax :

Le voici, indenté pour le rendre + lisible :

For Each c In Range("a1:a6000")
If c.Value = TxtFact Then
Num = c.Row
Range("B" & Num).Value = Txt
Exit For
'SINON
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = Txt
Sheets("recap").Range("B" & Num2).Value = Txt
Exit For
End If
Next c

Dès le premier passage de la boucle, on rencontre un "If... Then... Else"
avec un "Exit For" associé aux 2 termes de
l'alternative.

On ne passe donc qu'une fois dans la boucle, et à moins que le numéro
saisi
soit celui qui figure en A1, on va inscrire
les données à la ligne "Num2", correspondant à la première ligne vide.
(accessoirement, on reporte 2 fois txt)

La structure raisonnable est celle-ci

For Each c In Range("a1:a6000")
If c = TxtFact Then
Num = c.Row
Exit For
End If
Next c
' Test si le numéro de facture a été trouvé
If Num <> 0 Then
Range("B" & Num).Value = Txt
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = TxtFact
Sheets("recap").Range("B" & Num2).Value = Txt
End If

La boucle sert seulement à repérer si le numéro de facture existe déjà.

Il y a encore en élément important à prendre en compte : si tous les
numéros
de factures n'ont pas été alimentés par un
UserForm avec un TextBox, le test "If c = TxtFact Then" est toujours
négatif
car TxtFact est un TextBox, et ce qui en
sort est ... du texte. Par conséquent si c est numérique, TxtFact n'est
jamais égal à c ;-((


Si c est numérique, il faut modifier ainsi le test :

If c = CLng(TxtFact) Then

ce qui permet de convertir en nombre entier le contenu de TxtFact (CInt
marcherait aussi avec une plage de 6000 lignes,
mais pourrait planter si la plage s'étand beaucoup, car un Integer ne peut
dépasser 32 767).

A moins que la colonne A ait été formatée en Texte, ce qui rend correct le
test

If c = TxtFact Then

la prudence consiste à tester ainsi :

If CLng(c) = CLng(TxtFact) Then

car même si la colonne A a été alimentée par un TextBox sur un UserForm,
le
simple fait de cliquer dans la barre de
formule alors qu'une cellule de la colonne A contenant un numéro de
facture
est la cellule active, a rendu numérique le
contenu de celle-ci.


Ceci dit, tout cela correspond à une mauvaise approche : il est inutile de
prévoir une boucle avec plusieurs milliers de
passges, quand la fonction EQUIV() suffit à localiser l'éventuelle
présence
du numéro de facture :

Private Sub CommandButton1_Click()
Dim Test As Boolean, Num As Long
Test = IsError(Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0))
If Test Then
Num = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num) = CLng(TxtFact)
Else
Num = Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0)
End If
Sheets("recap").Range("B" & Num) = Txt
End Sub

******** NB - Ce code est prévu pour une colonne A en numérique.


Joyeux Noël,



Bonjour et joyeux noël,

J'espère que tu tu as été gaté par le père noël!

Je reviens sur mon petit problème (qui me met en rage depuis hier car j'ai
beau retourner le code dans tous les sens je n'arrive pas a avoir le
résultat escompté. Pourtant, je suis la logique du: Si dans ma colonne
A1:A6000, il existe une valeur corespondante à TXT FACT donc, inscrire sur
cette ligne la valeur de TXT, SINON, inscrire sur la dernière ligne vide).

Quand je recopie ton code , il ignore la première condition et m'inscrit à
la dernère ligne vide dans colonne A le numéro de fact saisie dans TXTFACT
même s'il est existant.

Comment traduis t-on le SINON en VBA?

Merci pour ta réponse
Pauline





--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Michel Gaboly
;-)))

Bon réveillon, donc

Merci Michel et Jacqouille d'avoir assuré la transition.
J'aurais été bien incapable de donner autant de précisions,
surtout après ce dur week end...;-)))
Je suis content que Pauline ait enfin une bonne solution.
Bon bout d'an comme on dit par chez nous:-))
Amicalement
Sitting Hoax (prêt à recommencer samedi quand même )


"Michel Gaboly" a écrit dans le message de news:

De rien, c'était avec plaisir ;-))


Bonjour à vous tous, Michel, Jacquouille et Sitting,

Cela marche et je suis super contente!!!! Merci aussi pour les
explications
comme cela j'ai enfin compris pourquoi cela ne fonctionnait pas.

BON NOEL
Pauline

"Michel Gaboly" a écrit dans le message de
news:
#
Bonjour Pauline,


Le réveillon a eu des effets nocifs sur le code de Sitting Hoax :

Le voici, indenté pour le rendre + lisible :

For Each c In Range("a1:a6000")
If c.Value = TxtFact Then
Num = c.Row
Range("B" & Num).Value = Txt
Exit For
'SINON
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = Txt
Sheets("recap").Range("B" & Num2).Value = Txt
Exit For
End If
Next c

Dès le premier passage de la boucle, on rencontre un "If... Then... E lse"
avec un "Exit For" associé aux 2 termes de
l'alternative.

On ne passe donc qu'une fois dans la boucle, et à moins que le numé ro
saisi
soit celui qui figure en A1, on va inscrire
les données à la ligne "Num2", correspondant à la première lign e vide.
(accessoirement, on reporte 2 fois txt)

La structure raisonnable est celle-ci

For Each c In Range("a1:a6000")
If c = TxtFact Then
Num = c.Row
Exit For
End If
Next c
' Test si le numéro de facture a été trouvé
If Num <> 0 Then
Range("B" & Num).Value = Txt
Else
Num2 = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num2).Value = TxtFact
Sheets("recap").Range("B" & Num2).Value = Txt
End If

La boucle sert seulement à repérer si le numéro de facture existe déjà.

Il y a encore en élément important à prendre en compte : si tous les
numéros
de factures n'ont pas été alimentés par un
UserForm avec un TextBox, le test "If c = TxtFact Then" est toujours
négatif
car TxtFact est un TextBox, et ce qui en
sort est ... du texte. Par conséquent si c est numérique, TxtFact n 'est
jamais égal à c ;-((


Si c est numérique, il faut modifier ainsi le test :

If c = CLng(TxtFact) Then

ce qui permet de convertir en nombre entier le contenu de TxtFact (CInt
marcherait aussi avec une plage de 6000 lignes,
mais pourrait planter si la plage s'étand beaucoup, car un Integer ne peut
dépasser 32 767).

A moins que la colonne A ait été formatée en Texte, ce qui rend c orrect le
test

If c = TxtFact Then

la prudence consiste à tester ainsi :

If CLng(c) = CLng(TxtFact) Then

car même si la colonne A a été alimentée par un TextBox sur un UserForm,
le
simple fait de cliquer dans la barre de
formule alors qu'une cellule de la colonne A contenant un numéro de
facture
est la cellule active, a rendu numérique le
contenu de celle-ci.


Ceci dit, tout cela correspond à une mauvaise approche : il est inuti le de
prévoir une boucle avec plusieurs milliers de
passges, quand la fonction EQUIV() suffit à localiser l'éventuelle
présence
du numéro de facture :

Private Sub CommandButton1_Click()
Dim Test As Boolean, Num As Long
Test = IsError(Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0))
If Test Then
Num = Sheets("recap").Range("A65536").End(xlUp)(2).Row
Sheets("recap").Range("A" & Num) = CLng(TxtFact)
Else
Num = Application.Match(CLng(TxtFact),
Sheets("recap").Range("A:A"), 0)
End If
Sheets("recap").Range("B" & Num) = Txt
End Sub

******** NB - Ce code est prévu pour une colonne A en numérique.


Joyeux Noël,




Bonjour et joyeux noël,

J'espère que tu tu as été gaté par le père noël!

Je reviens sur mon petit problème (qui me met en rage depuis hier ca r j'ai
beau retourner le code dans tous les sens je n'arrive pas a avoir le
résultat escompté. Pourtant, je suis la logique du: Si dans ma col onne
A1:A6000, il existe une valeur corespondante à TXT FACT donc, inscri re sur
cette ligne la valeur de TXT, SINON, inscrire sur la dernière ligne vide).

Quand je recopie ton code , il ignore la première condition et m'ins crit à
la dernère ligne vide dans colonne A le numéro de fact saisie dans TXTFACT
même s'il est existant.

Comment traduis t-on le SINON en VBA?

Merci pour ta réponse
Pauline









--
Cordialement,

Michel Gaboly
www.gaboly.com



1 2