Formulaire de saisie sur feuille différente

S'agit-il de la position dans Data ?

Si c'est le cas :

    [Client].Cells(cli, 6).Resize(, 3).Value = Obj

remplacer 3 (=C) par 6 (=F) dans la proc. de validation.

C'est bien ce qui me semblait Et ça marche, sauf que quand l'on ferme le formulaire et qu'on le réouvre, les données sont décalées (la 2 premières textbox sont vides et la 3ème affiche la valeur qui devrait être dans la 1ère).

Ah oui ! Le même décalage existe dans l'autre sens !!!

Voilà comment faire, puisque les les colonnes à prélever ne sont plus contiguës.

Private Sub UserForm_Initialize()
    Dim i%, col
    cli = ActiveSheet.Range("E3") '?
    If cli > 0 Then
        col = Array("", 1, 2, 6, 7, 8)
        With [Client]
            For i = 1 To 5
                Controls("tbCli" & i).Value = .Cells(cli, col(i)).Text
            Next i
        End With
    Else
        MsgBox "Aucun client sélectionné !", vbInformation, "Modification objectifs client"
        Unload Me
    End If
End Sub

On met les numéros de colonnes à prélever en tableau (petit ajustement avec "" pour l'indice 0 de façon que les indices correspondent sans avoir à corriger). On applique le rang de la boucle au tableau pour cibler la colonne...

Cordialement.

C'est absolument parfait. Mille mercis pour ton temps et ta patience, je vais l'appliquer à mon fichier, et si j'ai des questions (mais ça devrait aller j'espère avec toutes les indications que tu m'as données) je reviens vers toi.

Encore merci!!!!

scaramp

Bonne continuation.

Salut MFerrand,

Je reviens vers toi finalement (j'avais prévenu que ça arriverai ), mes formulaires marchent très bien à une exception près. Quand pour la première valeur (augmentation CA %) je mets 0 ou j'efface la valeur précédemment mise, que je je quitte le formulaire et que j'y retourne j'ai une boîte de dialogue qui s'ouvre et me dit "Erreur d'execution '13': Incompatibilité de type". Je clique sur débogage et voilà ce qui s'affiche:

bug formulaire

As-tu une idée de la nature du problème? Je sais que ça marche sur le fichier test que j'avais fait mais sur le fichier que j'utilise ça beuge...

Merci

Bonjour,

Vérification faite (sur fichier test), cela se produit lorsque tu modifies le contenu de la TextBox que tu indiques, et que tu ne valides pas la modification, mais ferme le Userform ! Soit sur une manipulation inachevée, donc dans une situation pas vraiment licite !

Ce qui me surprend par contre c'est que le phénomène ne se produise pas pour les autres, je suis donc un peu dubitatif sur l'explication : Val ne renvoie pas d'erreur, la fonction renvoie un nombre, ou 0 si elle n'en trouve pas... il ne devrait donc pas y avoir de raison à une incompatibilité de type, surtout qu'elle ne se produit pas dans les autres cas... Il y a donc un lien avec la position de la TextBox mais là je ne vois pas où réside l'explication.

A noter la configuration précise des contrôles sur le userform test, que tu devrais avoir aussi sur ton fichier (en principe) :

5 TextBox : les 2 premiers sont verrouillés (Locked=True) et exclus de l'ordre de tabulation (TabStop=False), les 3 autres sont normaux et placés dans leur ordre logique en ce qui concerne la tabulation, mais c'est le bouton de validation qui est placé en tête de l'ordre de validation, c'est à dire que lors de l'ouverture, le focus est sur le bouton (soit si à l'ouverture tu appuies sur Entrée, cela fermera le Userform : validation aux valeurs existantes et fermeture), si tu tabules, cela fait passer le focus à la 3e TextBox, puis la 4e, puis la 5e, puis retour sur le bouton (avec sélection du contenu des TextBox qui te permet de frapper directement une autre valeur).

Ton Userform étant dépourvu de bouton de fermeture, la fermeture par la croix ne déplace pas le focus, c'est pour cela qu'une erreur se produit (mais ça n'explique pas pourquoi elle ne se produit que sur une seule TextBox).

Quoi qu'il en soit, un déplacement du focus à la fermeture, devrait régler le problème :

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    cbValid.SetFocus
End Sub

Mais tu pourrais introduire un bouton de fermeture, qui éliminera aussi cette erreur (à condition de s'en servir ! )

Cordialement.

Salut MFerrand,

J'ai essayé, ça n'a pas marché

Pour mieux étayer mon propos, voilà un fichier, réalisé à partir de ton code, qui me fait le bug dont je te parle. Essaye de mettre 0 en augmentation CA, clique sur le bouton "modifier", puis reclick sur le bouton "ouvrir form" tu verras ça va buger

10test.xlsm (29.03 Ko)

Il y a des ressemblances avec le test initial mais ce n'est plus exactement la même chose...

D'abord, il faut modifier l'ordre de tabulation, pour placer le bouton en tête, ce qui évite le déclenchement d'un AfterUpdate avec erreur à l'ouverture. Là on s'aligne sur le schéma du fichier test.

Ensuite, j'ai noté que les valeurs modifié affectées, l'étaient sous forme texte. Même chose dans le fichier test. La conversion par Excel ne s'opère donc pas comme je l'escomptais, ce qui est passé inaperçu à cause du centrage, et parce que les valeurs dans le Userform apparaissent toujours formatées.

Il est sans doute préférable d'avoir des nombres s'ils doivent faire l'objet d'utilisations autres. Cela se règlera en forçant la conversion :

        Obj(i) = CDbl(Replace(Controls("TextBox" & i).Value, "%", ""))

dans la boucle de la procédure bouton. (Même chose sera à faire dans le fihcier test...)

Mais ce qui va déclencher une erreur avec les valeurs vides ! (il n'y en avait pas dans le fichier test...)

On peut gérer ça, mais il faut arrêter une position : soit on considère que "vide" = 0 et en cas de validation de modif. on validera 0 (ce qui se passe lorsqu'on efface une valeur existante, la validation de l'effacement au niveau TextBox y réintroduit 0), soit on veut distinguer "vide" et 0, et donc toutes les validations (notamment au niveau TextBox doivent être mises sous condition que la TextBox soit <>"".

Donc choisis une orientation sur ce point, pour ajuster l'ensemble des corrections.

Cordialement.

MFerrand,

merci pour ton éclairage!! Effectivement j'ai changé l'ordre de tabulation pour qu'à l'ouverture du fichier la première textbox soit directement sélectionné, mais peut importe évidemment si ça évite le déclenchement d'un afterupdate avec erreur à l'ouverture.

Concernant les valeurs vides, pour moi pas besoin de distinguer valeur "" et 0, ça ne change rien dans mes calculs derrière

Et effectiveent, il serait préférable, si c'est possible, d'avoir des formats "nombre" plutôt que "texte", si c'est possible.

Il n'y a donc que la procédure de validation à modifier :

Private Sub Cb1_Click()
    Dim Obj(1 To 2), i%
    On Error Resume Next
    For i = 1 To 2
        Obj(i) = CDbl(Replace(Controls("TextBox" & i).Value, "%", ""))
        If Err.Number <> 0 Then Obj(i) = 0: Err.Clear
    Next i
    On Error GoTo 0
    [Mylist].Cells(cli, 4).Resize(, 2).Value = Obj
    Unload Me
End Sub

Traité en gestion d'erreur...

En espérant ne pas avoir loupé d'autres sources d'erreurs !

Cordialement.

11scaramp-test.xlsm (31.79 Ko)

Ca marche nickel!!! Sauf un truc^^

Je ne sais pas si ca te le fait, mais quand tu rentres une valeur dans augmentation CA, une fois cliqué sur le bouton "modifier", il ne divise pas par 100 (exemple Ttu rentres 5, en quittant le le formulaire tu as 500%).

Bon ! Là l'heure est trop avancée ou pas assez pour réfléchir plus !

On inividualise :

Private Sub Cb1_Click()
    Dim Obj(1 To 2), i%
    On Error Resume Next
    Obj(1) = CDbl(Replace(TextBox1.Value, "%", "")) / 100
    If Err.Number <> 0 Then Obj(1) = 0: Err.Clear
    Obj(2) = CDbl(TextBox2.Value)
    If Err.Number <> 0 Then Obj(2) = 0: Err.Clear
    On Error GoTo 0
    [Mylist].Cells(cli, 4).Resize(, 2).Value = Obj
    Unload Me
End Sub

Il y avait aussi un MsgBox (de test) que j'avais oublié de supprimer dans la proc. TextBox1.

Bonne soirée.

28scaramp-test.xlsm (31.84 Ko)

C'est nickel chrome Merci bcp!!!

A bientôt,

Scaramp

Rechercher des sujets similaires à "formulaire saisie feuille differente"