VBA excel prblème!

Résolu
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
Configuration: Windows XP
Firefox 3.0.5

8 réponses

  1. 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 :-)
    1. 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 ;)
  2. Contributeur
    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. 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é!!!!
  3. 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
    1. 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
      1. Contributeur
        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+
        1. Contributeur
          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+
          1. 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?
            1. 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