Erreur d'exécution 1004
pour l'effacement, essaie :
.Range("D" & rS(i)).MergeArea.ClearContentsCela devrait être au point.... (si pas d'autre erreur !)
J'ai testé le code ça fonctionne
Je viens également de tester le dernier fichier que tu m'as envoyé et tout semble fonctionner !! Pour les mdp : problème résolu
Vraiment un GRAND MERCI pour ton aide !!! Tu m'enlèves une belle épine du pied comme on dit
Sysqua
Je crois que tu gagnes surtout un code nettement plus réduit, d'où une situation plus claire pour la suite, je t'encouragerais volontiers à t'en inspirer pour le reste de ton code...
On n'y est pas dans les conditions adéquates pour sortir des sentiers battus (avec le risque de n'arriver à rien) et on passe son temps à parer au plus pressé...
Bien des choses que je réalise dans les forums, j'aurais eu du mal à les imaginer au boulot (à l'époque, et j'étais dans des conditions relativement favorables...)
Bonne continuation.
C'est vrai que grâce à toi j'ai beaucoup moins de lignes de code et que c'est beaucoup plus clair !
Encore merci pour ton aide !
Bonne continuation également
Bonjour MFerrand, bonjour le forum,
Je ne pensais pas revenir ici de sitôt mais comme quoi...
J'ai besoin d'ajouter un champs dans un formulaire (saisie d'une suggestion d'amélioration). Je souhaite donc ajouter ce champs dans le code suivant afin qu'un message d'erreur apparaisse si ce champ n'est pas rempli et que la saisie de ce champs soit repercutée automatiquement dans mon tableau de suivi des suggestions.
Function SaisieOK(wsS As Worksheet, Optional sug As Boolean = False) As Boolean
Dim msg() As String, lg, i%
ReDim msg(IIf(sug, 8, 9))
msg(0) = IIf(sug, "votre prénom !", "la date d'enregistrement !")
msg(1) = IIf(sug, "votre NOM !", "l'entité !")
msg(2) = IIf(sug, "votre fonction !", "le type de NC !")
msg(3) = IIf(sug, "la date !", "le processus !")
msg(4) = IIf(sug, "le type d’amélioration !", "le déclarant !")
msg(5) = IIf(sug, "le sujet !", "la date du dysfonctionnement !")
msg(6) = IIf(sug, "la raison de la suggestion !", "le client/prestataire/collaborateur !")
msg(7) = IIf(sug, "la description !", "la description !")
msg(8) = IIf(sug, "les effets attendus !", "la source !")
If sug Then
lg = Array(13, 15, 17, 19, 21, 23, 25, 31, 39)
Else
[color=#FF0000] msg(9) = "l'action !"[/color]
lg = Array(11, 13, 15, 17, 19, 21, 23, 25, 32, 34)
End If
With wsS
For i = 0 To UBound(lg)
If .Range("D" & lg(i)) = "" Then
MsgBox "Veuillez renseigner " & msg(i), vbExclamation
.Range("D" & lg(i)).Select
SaisieOK = False: Exit Function
End If
Next i
End With
SaisieOK = True
End FunctionMon idée était donc de supprimer msg(9) = "l'action !" et de le faire remonter avec les autres et de le modifier de la sorte msg(9) = IIf(sug, "les effets attendus !", "l'action !") et d'ajouter la nouvelle celulle dans lg = Array(13, 15, 17, 19, 21, 23, 25, 31, 39)
Je ne sais pas si je suis bien claire... mais ce que j'ai fait ne fonctionne pas
A savoir qu'avec l'ajout de ce champs, mes deux formulaires ont désormais le même nombre de champs (10 chacun)
Quelqu'un pourrait-il m'orienter sur la modification du code ?
Merci d'avance et bonne journée
Bonjour,
Si je suis ce que tu entends modifier, tu ajoutes un champ à contrôler et à répercuter lors de la validation en ce qui concerne la saisie des suggestions d'amélioration.
Donc tu le rajoutes dans la définition de msg(9) que tu fais remonter dans la liste au-dessus de If sug Then.
Dans la définition de lg, tableau des numéros de lignes à contrôler (celui immédiatement au-dessous de If sug Then, tu rajoutes donc le nouveau numéro de ligne à contrôler, après 39.
C'est tout il me semble pour la fonction de vérification. Les ajustements correspondant sont à répercuter dans la proc. Valider :
sous l'instruction : If sug Then sont définies les paramètres pour la saisie des suggestions, le tableau rS correspond au tableau lg vu ci-dessus, tu rajoutes donc après 39 le nouveau numéro de ligne comme pour lg.
Le second tableau kC est celui des colonnes cibles, tu rajoutes pareil la lettre de colonne à la fin (même rang) dans la chaîne entre guillemets en n'oubliant pas une espace séparateur avec la lettre précédente.
[La fonction Split transforme une chaîne en tableau d'éléments en utilisant un séparateur inclus dans la chaîne, par défaut l'espace (inutile de le mentionner dans ce cas, on le mentionne quand il est différent, si on fait un tableau d'éléments de texte pouvant contenir des espaces, on utilise évidemment un autre séparateurs). Pour mémoire, la fonction Join fait l'inverse, elle transforme en chaîne texte un tableau en incorporant un séparateur (indiqué, ou non si espace) entre chaque élément.]
Et a-priori, si je n'ai pas oublié d'élément, c'est tout ce qu'il y a à faire...
Je dirai donc !
1) Tu as parfaitement compris la construction du code et comment il s'articulait, et nul doute que tu serais venue à bout de la manipulation puisque la partie déjà faite était relativement la plus compliquée de l'ensemble à modifier.
Donc, tu pourras refaire ce genre de manoeuvre !
2) C'est aussi un test pour la construction du code, de son adaptabilité. En travaillant avec des tableaux, on doit veiller à la correspondance des éléments d'un tableau à l'autre, l'ordre dans le tableau est indifférent (tout sera traité), ce qui compte c'est que les éléments qui se correspondent soient de même rang (même indice) dans les tableaux.
Cela demande une attention lorsqu'on modifie, mais cela limite les modifications (les boucles étant définies de 0 à UBound(tablo), elles ne changent pas, UBound s'ajustera à la modification faite.
Très cordialement et bonne continuation.
Merci MFerrand !
Tu as bien compris ce que je souhaitais faire et je suis ravie d'avoir compris le code !
J'avais également modifié la procédure Valider, de la même façon que celle que tu m'as décrite mais ça ne fonctionnait quand même pas. J'ai retenté de faire les modifications et toujours le même problème : le msg(9) est surligné en jaune
Je te joins le code modifié :
Function SaisieOK(wsS As Worksheet, Optional sug As Boolean = False) As Boolean
Dim msg() As String, lg, i%
ReDim msg(IIf(sug, 8, 9))
msg(0) = IIf(sug, "votre prénom !", "la date d'enregistrement !")
msg(1) = IIf(sug, "votre NOM !", "l'entité !")
msg(2) = IIf(sug, "votre fonction !", "le type de NC !")
msg(3) = IIf(sug, "la date !", "le processus !")
msg(4) = IIf(sug, "l'entitée concernée !", "le déclarant !")
msg(5) = IIf(sug, "le type d'amélioration !", "la date du dysfonctionnement !")
msg(6) = IIf(sug, "le sujet !", "le client/prestataire/collaborateur !")
msg(7) = IIf(sug, "la raison de la suggestion!", "la description !")
msg(8) = IIf(sug, "la description !", "la source !")
msg(9) = IIf(sug, "les effets attendus !", "l'action!")
If sug Then
lg = Array(13, 15, 17, 19, 21, 23, 25, 27, 33, 41)
Else
lg = Array(11, 13, 15, 17, 19, 21, 23, 25, 32, 34)
End If
With wsSDois-je encore supprimer/modifier quelque chose ?
Tu as aussi remplacé 31 et 39 par 27 et 33 (corresp. à msg(7) et msg(8). Ajout de 41 => msg(9).
Au temps pour moi, aussi !
ReDim msg(IIf(sug, 8, 9))On n'a pas redimensionné correctement si sug !
Soit tu penses que cela peut encore varier et tu fais :
ReDim msg(IIf(sug, 9, 9))Soit tu fais carrément :
ReDim msg(9)et si ça varie et que les deux cas se différencient à nouveau tu reviendras à la formulation précédente.
msg est un tableau déclaré en tant que tableau, ce pourquoi on le dimensionne pour pouvoir affecter chaque élément.
Pas d'incidence sur les autres tableaux, constitués par affectation de tableaux à des variables de type Variant au moyen de fonctions Array ou Split. Ils sont automatiquement dimensionnés lors de l'affectation.
Désolé.
Oui, j'avais pas encore lu le message d'erreur, mais là pas de piège : on dimensionnait à 8 et on voulait affecter un élément 9 ! Cela ne collait plus.
Effectivement, j'ai modifié d'autres lignes car j'ai ajouté le nouveau champ au milieu du formulaire et non à la fin.
J'ai redimensionné avec le code ReDim msg(IIf(sug, 9, 9)) et tout fonctionne !
C'est super MERCI !! Et merci pour tes explications à chaque fois
De rien !
A+
