VBA excel prblème!
Résolu
turkiarra
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
xav3601 Messages postés 3289 Date d'inscription Statut Membre Dernière intervention -
xav3601 Messages postés 3289 Date d'inscription Statut Membre Dernière intervention -
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
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:
- VBA excel prblème!
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
8 réponses
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 :-)
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 :-)
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+
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+
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é!!!!
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é!!!!
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
apres pour la maniere de faire ca deviens plus complexe, donc si tu vois pas faudar que j'explique plus en detail :S
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
Merci beaucoup
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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+
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+
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+
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+
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?
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?
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
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
La solution que tu me donne est en effet très logique et marche correctement.
Merci de nouveau de m'avoir aider ;)