Formulaire qui insert une ligne avant d'enregistrer les données saisies

pitchu60

XLDnaute Nouveau
Bonjour,

Je débute en VBA et j'ai tenté vainement de faire une recherche sur internet pour trouver une solution mais je vois de tout et je n'arrive pas à mettre en œuvre ce que je veux...

Ce n'est pas claire, mais je vais éclaircir la situation. J'ai monté un formulaire avec lequel on peut ajouter une ligne avec l'ensemble des données saisies dans mes textbox, combobox, checkbox et optionbutton. Avec le code actuel, mes données sont enregistrées à la dernière ligne vide de ma feuille nommé "test" :

L = Sheets("test").Range("a65536").End(xlUp).Row + 1

Ce que je souhaiterai faire, c'est d’insérer une ligne à compter de la ligne n°2 et d'enregistrer ma saisie dans cette ligne nouvellement insérer.

J'avais tenter d'utiliser Row(2).insert mais je ne sais pas trop comment l'intégrer à mon code pour que ça s'enchaine correctement.
Ceci me permettra d'avoir des plages fixes qui vont évoluer au fil des insertions de ligne. Ces plages de données pourront ainsi être pris en compte pour des futurs calculs statistiques... Hors mes données sont actuellement enregistrées à la suite et seront donc hors de mes plages de données.

Mes explications ne sont peut être pas très claire, mais je suis prêt à éclairer votre lanterne :p

Merci d'avance.
 

Pièces jointes

  • Test_formulaire2.xls
    192.5 KB · Affichages: 69

Paf

XLDnaute Barbatruc
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Bonjour


Même si je n'ai pas tout compris aux plages fixes ( qui pourraient sans doute être dynamiques ? ), une solution possible pour enregistrer en ligne 2:

Dans Private Sub CommandButton5_Click() remplacer la ligne
Code:
  L = Sheets("test").Range("a65536").End(xlUp).Row + 1
par
Code:
  Sheets("test").Rows(2).Insert Shift:=xlUp
  L = 2

A+
 

pitchu60

XLDnaute Nouveau
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Des plages dynamiques ? Ça peut fonctionner avec excel 2003 ? Car je crois que DECALER commence à partir d'excel 2007.

Merci pour le code, ça fonctionne bien.

Dans mon fichier, il va y avoir une feuil statistique qui fera appel à des plages de données, comme le nombre de dossier ou ma formule sera "=NBVAL("N_dossier")-1" et la plage s’étendrait de A1:A2. Du coup, en insérant une ligne à partir de la ligne 2 cela va agrandir la plage.

Voili voilou
 

Paf

XLDnaute Barbatruc
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Re,

Je ne sais pas à quand remonte la fonction DECALER , mais elle existe dans XL 2003.

Déclarer la plage nommée N_dossier avec pour plage de référence =DECALER(test!$A$2;;;NBVAL(test!$A:$A)-1;1)

la formule =NBVAL(N_dossier) renvoie bien 2 ( nombre de dossiers ouverts dans le classeur joint au post #1)

Le même principe pourrait être utilisé dans la feuille Liste, mais en prenant soin de mettre chaque liste dans des colonnes différentes.

A+
 

pitchu60

XLDnaute Nouveau
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Merci bien pour toutes vos astuces, cela m'aide bien. Je ne maîtrise pas trop Excel. Je vais redéfinir toutes mes plages avec la fonction DECALER. J'ai du confondre avec une autre fonction peut être...

Le novice que je suis aurait une autre question... Lorsque j'enregistre mes données à partir de mon formulaire. Les données sont sous forme de "texte". Du coup, mes formulaires qui me servent pour les statistiques rencontrent des erreurs. De plus les cellules vides renvois du "texte" et rend caduc mes formules contenant la fonction NBVIDE("plage").

Il y aurait moyen que les données renvoyées par le formulaire que ça soit un chiffre, une date, ou même une cellule vide soient sous le bon format.

Je vous remercie pour votre aide précieuse.
 

Paf

XLDnaute Barbatruc
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Re,

Pour les dates, pas vu d'anomalies après enregistrement; à moins que la date saisie ne soit pas une date.

pour le numérique:

s'il s'agit de saisir des entiers on peut utiliser la fonction Val qui convertie texte en numerique et vide en 0.
Ws.Cells(Ligne, "H") = Val(Me.Controls("TextBox4"))

pour les décimaux utiliser la fonction CDec, mais qui n'accepte pas 0. ( faire un test sur le contenu avant de l'utiliser )
Ws.Cells(Ligne, "N") = CDec(Me.Controls("TextBox6"))

voir l'aide sur les fonctions de conversion

A+
 

pitchu60

XLDnaute Nouveau
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Pour ce qui est des dates, je fait des moyennes des dates des colonnes Date_commissions et Date_saisine et j'obtiens comme résultat #DIV/0! vu que les données reportées par mon formulaire sont du texte

J'ai aussi essayé de définir des plage dynamique avec la fonction DECALER que tu as formulé Paf et ça ne fonctionne pas trop bien.
J'ai pris deux capture d'écran pour montrer mon soucis avec la fonction NBVAL.

Quand à la fonction NB.VIDE, étant donné que même le vide est considéré comme du texte en passant par le formulaire. Cette fonction ne fonctionne plus du tout.

Merci pour vous être penché sur mon soucis... Je vais devenir chèvre :p
 

Pièces jointes

  • Essai_formule1.jpg
    Essai_formule1.jpg
    33.7 KB · Affichages: 42
  • Essai_formule2.jpg
    Essai_formule2.jpg
    28.3 KB · Affichages: 36
Dernière modification par un modérateur:

Paf

XLDnaute Barbatruc
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

re bonjour,

concernant le soucis de moyenne de date, j'avoue ne pas comprendre ce que vous chercher à calculer ainsi. Faites un essai de moyenne sur 2 dates correctes et sur deux dates au format texte vous obtiendrez le même résultat : #DIV/0! qui n'est donc pas lié seulement au format des données mais aussi à la nature des données.

Mais, pour 'forcer' les dates texte en vraies dates, utiliser la fonction de conversion CDate:

Code:
Ws.Cells(Ligne, "E") = CDate(TextBox3)
au lieu de
Code:
 Ws.Cells(Ligne, "E") = Me.Controls("TextBox3")

Pour les plages dynamiques, le soucis provient (sans rentrer dans les détails ) des éventuelles cellules vides intermédiaires en colonne A, qui fausse la fonction Decaler et donc par la suite NbVal(N_Dossier) et Nb.Vide(N_Dossier) donnent des résultats erronés, mais non liés au formulaire qui transformerait les vides en texte.

une solution (?)

s'il ne vous faut que le nombre de dossiers renseignés en colonne A vous pouvez utiliser:
=NBVAL(test!$A:$A)-1

et s'il vous faut également le nombre de dossiers non renseignés en colonne A, a priori la colonne B (Nom) sera toujours renseignée, alors on peut calculer le nombre de nom puis soustraire le nombre de dossiers renseignés:
= (NBVAL(test!$B:$B)-1) - (NBVAL(test!$A:$A)-1)

soit =NBVAL(test!$B:$B)- NBVAL(test!$A:$A)

Bon courage, c'est en forgeant .....

A+
 

pitchu60

XLDnaute Nouveau
Re : Formulaire qui insert une ligne avant d'enregistrer les données saisies

Je vous remercie de l'aide apportée, de mon coté la moyenne des dates fonctionne de nouveau grâce à CDate()
Mes valeurs numériques sont bien affichées numériquement :) grâce à Val()

Bon il me reste du boulot car les optionbutton m'ont permis de bien réduire mon tableau et certaines formules statistiques sont à refaire.

Moi qui pataugeais dans la semoule, j'ai vachement bien avancé !

Merci, le forum m'a bien aidé, topic et recherches comprise ^^
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 900
Membres
101 834
dernier inscrit
Jeremy06510