VBA excel prblème!

Résolu/Fermé
turkiarra Messages postés 7 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 9 février 2009 - 19 janv. 2009 à 15:50
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 - 20 janv. 2009 à 16:18
Bonjour,
Je met en place un utilitaire de gestion de contrat sur VBA Excel dans lequel j'ai un tableau que je rempli à l'aide d'userform. Je rentre les données concernant des affaires avec leurs N°,Clients, lieu, travaux...
Cela marche très bien!

Puis dans un second temps je veux pouvoir modifier n'importe quelles affaires. Pour cela je lance un inputbox demandant de rentrer le N° de l'affaire pour pouvoir retrouver l'affaire dans mon tableau. Une fois l'affaire trouvée je veux pouvoir de nouveau afficher l'UserForm du départ mais avec les TextBox remplis par les données déjà rentrées dans le tableau pour l'affaire correspondant. Et c'est là que n'y arrive pas. J'ai essayé de faire quelque chose mais ça ne marche pas!
c'est pour cela que j'ai besoin de votre aide! merci d'avance!
Je vous met ci joint le code de l'inputbox ainsi que le code de l'userform

Voici le code de l'inputbox:

Sub entrerNumero()
réponse = InputBox(" Donnez le numero de l'affaire à modifier ", "Saisie du numero de l'affaire")

Sheets("tableau affaire").Select
For i = 7 To 1000

If réponse = "" Then
MsgBox ("Vous devez entrer un numero")
End If

If Cells(i, 2) = réponse Then
Cells(i, 2).Select
nombre = ActiveCell.Row

Chargé_affaire1 = Cells(nombre, 1)
N°1 = Cells(nombre, 2)
MO1 = Cells(nombre, 3)
Travaux1 = Cells(nombre, 5)
Lieu1 = Cells(nombre, 6)

Ajoutaffaire.Show

N° = N°1
MO = MO1
Travaux = Travaux1
Lieu = Lieu1

Else
MsgBox ("Le code que vous avez saisie n'existe pas. Veuillez saisir un code affaire existant.")
Exit For
End If
Next i


End Sub


Voici le code de l'userform:

Private Sub OK_Click()
Sheets("tableau affaire").Select
ligneajout = Range("A1").End(xlDown).Row + 1

Range("A" & ligneajout) = Chargé_affaire
Range("B" & ligneajout) = N°
Range("C" & ligneajout) = MO
Range("E" & ligneajout) = Travaux
Range("F" & ligneajout) = Lieu

'affecte le texte "scp" à la cellule du tableau si la case à option correspondante est activée
'affecte le texte "sbe" à la cellule du tableau dans le cas contraire
If scp = True Then
Range("D" & ligneajout) = "scp"
Else
Range("D" & ligneajout) = "sbe"
End If
'trie les données du tableau
Range("B7:B1000").Select
Selection.Sort Key1:=Range("B7"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A1").Select
Ajoutaffaire.Hide
Unload Ajoutaffaire
End Sub
A voir également:

8 réponses

xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
20 janv. 2009 à 14:36
Je pense que le problème viens de ta boucle for, je m'explique:

En gros si la premiere case que tu test ne contient pas "reponse" tu passe dans le else, affiche le message d'erreur et sors de la boucle for, donc tu ne test que la premiere case!
Donc j'aurai mis un exit for a la fin de ton if.
et tu peux ajouter une variable bool pour voir si il a ete trouve ou pas, ca donnerai ca:

exist = false

For i = 7 To 1000
If Cells(i, 2) = réponse Then
Cells(i, 2).Select
nombre = ActiveCell.Row
Chargé_affaire1 = Cells(nombre, 1)
N°1 = Cells(nombre, 2)
MO1 = Cells(nombre, 3)
Moe1 = Cells(nombre, 4)
Travaux1 = Cells(nombre, 5)
Lieu1 = Cells(nombre, 6)
Modifieraffaire.Chargé_affaire = Chargé_affaire1
Modifieraffaire.AncienN° = N°1
Modifieraffaire.N° = N°1
Modifieraffaire.MO = MO1
Modifieraffaire.Moe = Moe1
Modifieraffaire.Travaux = Travaux1
Modifieraffaire.Lieu = Lieu1
Modifieraffaire.Show
exist = true
exit for
End If
Next i

if exist = false then
msgbox("affaire inexistante")


Voila, sinon eventuellement il faudrait peut etre utiliser la syntaxe suivante pr recuperer le contenue d'une case:
cells(nombre,5).value

mais je n'en suis pas sur.

voila j'espere t'avoir aider :-)
2
turkiarra Messages postés 7 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 9 février 2009
20 janv. 2009 à 15:02
Merci beaucoup xav3601!! En effet c'était ça le problème, j'avais pas remarquer que je testais juste la première case!!
La solution que tu me donne est en effet très logique et marche correctement.

Merci de nouveau de m'avoir aider ;)
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 644
19 janv. 2009 à 17:47
Bonjour à tous,

Il me semble que dans ton code, il manque la référence à l'Userform.
Si comme je le comprends, Chargé_affaire, N°, MO, Travaux et Lieu sont des textbox de L'userform qui s'appelle Ajoutaffaire alors pour affecter ces variables avant d'afficher l'Userform il faut écrire :


Ajoutaffaire.N° = N°1
Ajoutaffaire.MO = MO1
Ajoutaffaire.Travaux = Travaux1
Ajoutaffaire.Lieu = Lieu1

et ensuite seulement

Ajoutaffaire.Show

Dis moi si j'ai bien compris.

A+
1
turkiarra Messages postés 7 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 9 février 2009
20 janv. 2009 à 10:51
Merci beaucoup pilas31!! En effet tu as bien compris ce que je voulais faire. Il me manquait bien la référence à l'userform et Ajoutaffaire.Show était placé trop tôt! Ce problème est donc résolu maintenant.

En ce qui concerne les 2 autres problèmes que tu a remarqués j'ai résulu le 2ème. En effet j'ai construit un 2ème userform qui ressemble au premier mais dans son programme je n'utilise plus la fonction "End(xlDown).Row+1)" amis une fonction qui permet de corriger la ligne a modifier.
Par contre j'ai toujours une mauvaise gestion d'erreur peut etre du aux mauvaises boucles que j'ai programmées.

De nouveau un grand merci pilas31 parce que tu ma bien débloqué!!!!
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
19 janv. 2009 à 16:02
alors moi ce que je ferais c'est que dans la partie initialisation de ton formulaire je mettrais une condition avec une variable, si l'ouverture correspond a une affaire existante il va chercher les donnees dans le tableau, sinon il s'initialise avec les champs vide!
apres pour la maniere de faire ca deviens plus complexe, donc si tu vois pas faudar que j'explique plus en detail :S
0
turkiarra Messages postés 7 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 9 février 2009
19 janv. 2009 à 16:17
Je comprends ce que tu veux dire xav3601, mais je ne vois pas du tout comment il faudrait s'y prendre! Donc si tu peux m'expliquer d'avantage s'il te plait!
Merci beaucoup
0

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

Posez votre question
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 644
19 janv. 2009 à 18:06
Re Bonjour,

A la réflexion il y a d'autres problèmes :

1/ La boucle n'est pas correcte car elle sort intempestivement à cause du dernier else.
2/ Si l'userform reprends la main en modification, il ajoute la ligne modifiée à la fin au lieu de la corriger.

Je vais laisser xav3601 t'aider d'avantage comme il l'a proposé, je reviendrai dans la discussion si il n'a pas le temps de t'aider.

Bonne continuation

A+
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
19 janv. 2009 à 18:46
Bonjour,
Pour lire et écrire dans une série de textBox, cette solution pourra peut-être t'aider, je l'emploi pour les saises client entre autre.

A+
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
20 janv. 2009 à 11:08
Bonjour,
je viens juste de relire tout ce qui a été dis, pourrais tu faire un point sur ce qu'il te manque a présent?
0
turkiarra Messages postés 7 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 9 février 2009
20 janv. 2009 à 11:40
Bonjour xav3601,
En faite mon problème est essentiellement résolue, c'est juste ma gestion d'erreur qui ne fonctionne pas correctement (les msgbox). Ils sont soit mal placés, soit incomplètes. Je sais pas je n'arrive pas à trouver pourquoi et ou sa cloche!

Je te montre comment sont a présent mes codes:

- Code de l'inputbox:

Sub entrerNumero()

réponse = InputBox(" Donnez le numero de l'affaire à modifier ", "Saisie du numero de l'affaire")

If réponse = "" Then
MsgBox ("Vous devez entrer un numero")
End If

Sheets("tableau affaire").Select
For i = 7 To 1000


If Cells(i, 2) = réponse Then
Cells(i, 2).Select
nombre = ActiveCell.Row

Chargé_affaire1 = Cells(nombre, 1)
N°1 = Cells(nombre, 2)
MO1 = Cells(nombre, 3)
Moe1 = Cells(nombre, 4)
Travaux1 = Cells(nombre, 5)
Lieu1 = Cells(nombre, 6)

Modifieraffaire.Chargé_affaire = Chargé_affaire1
Modifieraffaire.AncienN° = N°1
Modifieraffaire.N° = N°1
Modifieraffaire.MO = MO1
Modifieraffaire.Moe = Moe1
Modifieraffaire.Travaux = Travaux1
Modifieraffaire.Lieu = Lieu1

Modifieraffaire.Show

Else
MsgBox ("Le code que vous avez saisie n'existe pas. Veuillez saisir un code affaire existant.")
Exit For
End If
Next i


End Sub

- code de l'userform:


Private Sub OK_Click()
Sheets("tableau affaire").Select
For i = 7 To 1000


If Cells(i, 2) = AncienN° Then
Cells(i, 2).Select

Range("A" & i) = Chargé_affaire
Range("B" & i) = N°
Range("C" & i) = MO
Range("D" & i) = Moe
Range("E" & i) = Travaux
Range("F" & i) = Lieu

Exit For
End If
Next i

'trie les données du tableau
Range("B7:B1000").Select
Selection.Sort Key1:=Range("B7"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A1").Select
Modifieraffaire.Hide
Unload Ajoutaffaire
End Sub
0
xav3601 Messages postés 3288 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 2 mars 2016 311
20 janv. 2009 à 16:18
Mais de rien content d'avoir pu etre utile :-)
0