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 :-)
    2
    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 ;)
      0
  2. Mais de rien content d'avoir pu etre utile :-)
    0
    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?
      0
      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
        0
    2. 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+
      0
      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+
        0
        1. 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
          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é!!!!
            0
        2. 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
          1. 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