Insertion de lignes dans un tableau en tenant compte des semaines
Bonjour,
Dans le fichier attaché, je souhaiterai créer un bouton permettant à différents utilisateurs d'insérer des lignes automatiquement.
Je souhaiterai par ce clic, qu'un tableau puisse s'ouvrir pour remplir l'ensemble ou une partie des champs qui sont "A REMPLIR PAR LE DEMANDEUR"
Il faudrait également que la ligne puisse se placer chronologiquement suivant la semaine (regroupement des S)
De plus, les colonnes A, CA36 et CO38 ont quelques formules et formules conditionnelles que je souhaiterai protéger.
Est-il possible de faire cela ?
Pour info, j'ai des connaissance limité sur Excel et aucun en VBA
En vous remerciant
Laurent
Bonjour,
Merci d'éviter de faire doublons de fil --> https://forum.excel-pratique.com/s/goto/1170034 sans quoi on ne s'y retrouve plus
78Chris vous a répondu et attend une réponse
Quel fil gardez-vous ?
Je verrouillerai celui que vous ne voulez pas utiliser
Crdlt
Bonjour,
Effectivement, désolé.
Pouvez-vous verrouiller l'autre sujet, svp ?
En vous remerciant
Bonjour,
Pouvez-vous verrouiller l'autre sujet, svp ?
Ok Fait
Pour votre fichier,
Je souhaiterai par ce clic, qu'un tableau puisse s'ouvrir pour remplir l'ensemble ou une partie des champs qui sont "A REMPLIR PAR LE DEMANDEUR"
Que voulez-vous dire par "un tableau puisse s'ouvrir" ?
Dans votre feuille :
- il y a deux tableaux. Pourquoi mettez-vous tout sur une seule feuille ?
- Vous fusionnez des colonnes et des lignes ...les fusions (on le répète souvent) sont à éviter surtout avec l'utilisation de VBA.
Crdlt
Bonjour,
J'ai diviser les 2 tableaux et retiré en majorité la fusion des cellules.
Je joins à nouveau le tableau modifié
Ce que je souhaiterai c'est d'avoir un bouton qui ouvre une fenêtre avec différents champs à remplir par les demandeurs.
Une fois ces champs rempli, un bouton "créer nouvelle ligne" afin d'incrémenter une nouvelle ligne qui se placerait chronologiquement par rapport au semaine "S..."
Merci
Cordialement
Bonjour
Ok pour votre fichier. Mais il ne contient pas la vue que vous montrez... Normal ?
Ce que je souhaiterai c'est d'avoir un bouton qui ouvre une fenêtre avec différents champs à remplir par les demandeurs.
Dans cette userform (à creer ?) on ne voit que deux rubriques. Normal ? ou d'autres champs sont à ajouter ?
Une fois ces champs rempli, un bouton "créer nouvelle ligne" afin d'incrémenter une nouvelle ligne qui se placerait chronologiquement par rapport au semaine "S..."
Le bouton peut ajouter la ligne à la fin de votre tableau. Ensuite, il suffit de trier suivant votre colonne B "sem"
Votre avis ?
Bonjour,
Je viens d'apprendre quelques chose "Userform" (formulaire de saisie)
Ne sachant pas comment cela s'appelait, j'avais été faire une impression d'écran d'un autre fichier
Je vais essayer d'en faire un et reviendrai pour vous le présenter et peut-être que les questions suivront.
Merci
Cordialement
Bonjour,
Je reviens sur le sujet après avoir intégré un Userform.
Par contre, j'ai intégrer une ligne en VBA et cela fait planter mon fichier
'Recherche de la 1ère ligne vide
l = 4
While Not IsEmpty(Cells(l, 2))
l = (1 + 1)
WendPouvez-vous m'aider sur ce point, svp ?
Merci
Bonjour
Lorsque vous postez un code, pensez à utiliser l'icone </> disponible dans la barre de menu et collez le code dans la feneêtre. C'est plus lisible.
J'ai corrigé dans votre post
Par contre, j'ai intégrer une ligne en VBA et cela fait planter mon fichier
Oui normal.
D'après ce que je lis dans votre code, on peut considérer que la colonne B doit toujours contenir une information. Correct ?
Autre question : pourquoi masquez-vous l'usf une fois les infos entrées dans votre feuille ? Le mieux est de fermer l'USF ou alors de les infos et de la laisser visible à l'écran pour ajouter d'autres lignes
Dès votre réponse je vous poste les modifications
Crdlt
Bonjour,
Je masque l'usf car majoritairement les personnes ont une seule ligne à rentrer.
Je pourrai très bien le laisser et demander à cliquer sur fermer, mais il faut savoir que ce fichier sera en lecture partagé.
Dans le cas d'une utilisation simultanée, je ne sais pas si cela posera problème si une personne oublie de le fermer
Ce que je souhaitais obtenir et qu'en partant de la ligne 7, lorsqu'il a une information dans la colonne B, il doit voir s'il y a également une information sur la ligne suivante et ainsi de suite jusqu'à pouvoir intégrer les informations souhaitées.
Merci Dan,
Cordialement
Je pourrai très bien le laisser et demander à cliquer sur fermer, mais il faut savoir que ce fichier sera en lecture partagé.
Dans le cas d'une utilisation simultanée, je ne sais pas si cela posera problème si une personne oublie de le fermer
Cela ne sert pas de masquer une USF sauf si vous utilisez plusieurs USF. Ce qui n'est pas le cas. Le mieux est de la fermer. Le click sur votre bouton réouvrira l'USF.
La question est de savoir si un même utilisateur qui ouvre le fichier pour remplir peut remplir plusieurs lignes ou pas ?
Si oui, il faut laisser l'USF ouverte après le click sur le bouton Ajouter
Si non, on ferme l'USF après click sur le bouton Ajouter
Ce que je souhaitais obtenir et qu'en partant de la ligne 7, lorsqu'il a une information dans la colonne B, il doit voir s'il y a également une information sur la ligne suivante et ainsi de suite jusqu'à pouvoir intégrer les informations souhaitées.
Heu je n'ai pas compris le pourquoi de la ligne 7 ?
Vous écrivez qu'il doit y avoir une info sur la ligne suivante, mais dans quelle colonne ?
Edit : dans votre Userform, vous avez utilisé des accents pour nommer vos textbox. Evitez absolument les accents, les caractères spéciaux tels que N°, cela peut vous causer des soucis avec VBA.
Enlevez les accents et remplacez N° par Num par exemple
Houps, c'est pas la ligne 7 mais la 4 et toujours dans la colonne B
J'ai retiré la fermeture automatique de l'USF lorsque l'on insère des lignes
Merci
Ok mais vous ne répondez pas à mes questions et je n'ai toujours pas compris le pourquoi de la ligne suivante...
Bon remplacez tous les codes de votre USF par ceci
Option Explicit
Private Sub CommandButton1_Click()
Dim dlg As Integer
With Feuil1 'code name de onglet previsio
'Recherche de la 1ère ligne vide
dlg = .Range("B" & Rows.Count).End(xlUp).Row
If dlg = 2 Then dlg = 3 'si derniere ligne =2 on met la variable a valeur 3
'Saisir les informations
.Cells(dlg + 1, 2) = BoxSemaine.Text
.Cells(dlg + 1, 3) = BoxDem.Text
.Cells(dlg + 1, 4) = BoxN°Moule.Text
.Cells(dlg + 1, 5) = BoxN°Essai.Text
.Cells(dlg + 1, 6) = BoxPièces.Text
.Cells(dlg + 1, 7) = BoxTypeEssai.Text
.Cells(dlg + 1, 8) = BoxProjet.Text
.Cells(dlg + 1, 9) = BoxDemandeur.Text
.Cells(dlg + 1, 10) = BoxNbreEmpreinte.Text
.Cells(dlg + 1, 11) = BoxNbrePDC.Text
.Cells(dlg + 1, 12) = BoxNbrePDDC.Text
.Cells(dlg + 1, 13) = BoxNbreAspect.Text
.Cells(dlg + 1, 14) = BoxDateArrivéePrévisionnel.Text
.Cells(dlg + 1, 15) = BoxDélaiSouhaité.Text
'Ajout formules en Colonne A et T
'.Cells(dlg + 1, 1).AutoFill Destination:=Range("A4:A" & dlg + 1), Type:=xlFillDefault
'.Cells(dlg + 1, 20).AutoFill Destination:=Range("T4:T" & dlg + 1), Type:=xlFillDefault
End With
'Remise à zéro de la Userform
Dim c As Control
For Each c In Me.Controls 'on boucle sur chacun des objets sur l'USF
If c.Name Like "Box*" Then c.Value = vbNullString 'si nom de l'objet commence par "Box..." on vide l'objet (ici Box correspond a une textbox)
Next c
'Unload Me 'pour ferme l'USF automatiquement
End Sub
Private Sub CommandButton2_Click()'annuler
Unload Me
End SubA voir si intérêt pour vous éviter de mettre des formules en colonne A et T.
- supprimer toutes les lignes sauf la ligne 4 qui contient une formule en colonne A et T
- Activez les deux lignes en dessous de la mention --> 'Ajout formules en Colonne A et T. Ces deux instructions recopieront la formule en A4 et T4 sur la ligne ajoutée.
- L'USF reste ouverte après avoir cliqué sur le bouton Ajouter. Si vous ne voulez pas, faites ceci dans le code :
--> 1. Désactivez les 4 lignes en dessous de la mention 'Remise à zéro
--> 2. Activez la ligne Unload Me
Faites un test et dites-moi
J'ai suivi ce tutoriel très proche de mon besoin : https://www.youtube.com/watch?v=v58wcXg6dGI
Cela répondra peut-être à votre question (19 minutes).
En regardant ce tuto, je comprenais parfaitement pourquoi je devais faire cela, c'est très explicite.
Vous connaissez parfaitement votre sujet mais moi je suis novice en VBA, mise à part faire un copier/coller de votre code et le tester, je peux pas faire grand chose d'autre et malheureusement je ne sais pas le lire.
Il est vrai qu'avec le VBA, je me doute bien qu'il n'est pas nécessaire d'avoir plusieurs colonnes avec diverses formules.
Par contre, j'ai testé ce code et il me supprime absolument toutes les formules même celles de la ligne 4
J'ai au préalable retiré toutes les formules se trouvant sur toutes les autres lignes hormis la 4
'Ajout formules en Colonne A et T
.Cells(dlg + 1, 1).AutoFill Destination:=Range("A4:A" & dlg + 1), Type:=xlFillDefault
.Cells(dlg + 1, 20).AutoFill Destination:=Range("T4:T" & dlg + 1), Type:=xlFillDefaultMerci
re
mise à part faire un copier/coller de votre code et le tester, je peux pas faire grand chose d'autre et malheureusement je ne sais pas le lire.
Ok. J'ai ajouté quelques commentaires dans le code pour que vous compreniez. Si soucis n'hésitez pas bien entendu
Par contre, j'ai testé ce code et il me supprime absolument toutes les formules même celles de la ligne 4
J'ai au préalable retiré toutes les formules se trouvant sur toutes les autres lignes hormis la 4
Ok. Désolé je n'avais pas vérifié...
Remplacez les 3 lignes de code par ceci
'Ajout formules en Colonne A et T
If dlg + 1 > 4 Then
.Cells(4, 1).AutoFill Destination:=Feuil1.Range("A4:A" & dlg + 1), Type:=xlFillDefault 'recopier formule en colonne A sur ligne ajoutee
.Cells(4, 20).AutoFill Destination:=Feuil1.Range("T4:T" & dlg + 1), Type:=xlFillDefault 'recopier formule en colonne T sur ligne ajoutee
End IfBonjour,
Afin d'améliorer ce tableau,
1) Est-il possible de conserver la mise en forme sur l'ensemble de la ligne sans les traits horizontales mais avec certaines verticales (comme la ligne 4)
2) Pouvons-nous mettre en place un tri automatique de la colonne B (exemple S47) à chaque insertion de ligne par ordre chronologique ?
3) J'observe que pour chaque ligne créée, il est impossible d'annuler (ctrl Z), pouvons-nous avoir la possibilité d'obtenir cette fonction sans devoir supprimer les lignes créées ?
Merci Dan
Bonjour
1) Est-il possible de conserver la mise en forme sur l'ensemble de la ligne sans les traits horizontales mais avec certaines verticales (comme la ligne 4)
Oui. Faites ceci :
1. Dans l'USF:
- allez dans le code Private Sub CommandButton1_Click()
- juste entre le dernier END WITH et la mention 'Remise à zéro....., rajoutez cette instruction
Call Mise_en_forme2. Allez dans votre module 1et rajoutez ce code
Sub Mise_en_forme()
With Feuil1.Range("A4:V" & Feuil1.Range("A" & Rows.Count).End(xlUp).Row)
'Police
With .Font
.Name = "Calibri"
.Size = 9
End With
'centrer
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
'bordures
.BorderAround LineStyle:=xlContinuous
.BorderAround Weight:=xlThin
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
End With
End With
End SubFaites un test
2) Pouvons-nous mettre en place un tri automatique de la colonne B (exemple S47) à chaque insertion de ligne par ordre chronologique ?
Oui.
C'est bien sur la colonne B que vous voulez faire un tri ?
Si oui dans quel sens voulez-vous le résultat ? plus petit au plus grand ou l'inverse ?
Bonjour Dan,
Le code fonctionne. Par contre, il m'a insérer des bordures sur toutes les colonnes + la ligne 1.
Est-il possible de le faire comme ci-dessous et pas sur l'ensemble ?
Pour ce qui est du tri, ce sera toujours la colonne Sem. et il sera toujours noté S12, ... S42, S43, ... et pour le sens du tri, dans le sens que je viens d'indiquer.
Merci et bon week-end
Bonjour
Par contre, il m'a insérer des bordures sur toutes les colonnes + la ligne 1.
Est-il possible de le faire comme ci-dessous et pas sur l'ensemble ?
Remplacez le code Mise en forme par celui ci-dessous
Sub Mise_en_forme()
Dim dlg As Integer
With Feuil1
dlg = .Range("B" & Rows.Count).End(xlUp).Row
With .Range("A4:V" & dlg)
'Police
With .Font
.Name = "Calibri"
.Size = 9
End With
'centrer
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
'Bordures autour
.BorderAround LineStyle:=xlContinuous
.BorderAround Weight:=xlThin
End With
'bordures verticales et horizaontales
With Union(.Range("A4:A" & dlg), Range("P4:V" & dlg))
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
End With
End With
End With
End SubPour ce qui est du tri, ce sera toujours la colonne Sem. et il sera toujours noté S12, ... S42, S43, ... et pour le sens du tri,
Faites ceci :
1. Dans l'USF:
- allez dans le code Private Sub CommandButton1_Click()
- juste avant le Call Mise_en_forme, ajoutez cette instruction
Call trier2. Dans le module 1 ajoutez ce code
Sub trier()
Dim dlg As Integer
With Feuil1
dlg = .Range("B" & Rows.Count).End(xlUp).Row
With .Sort
.SortFields.Clear
.SortFields.Add2 Key:=Feuil1.Range("B4:B" & dlg), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Feuil1.Range("A4:V" & dlg)
.Header = xlGuess
.Orientation = xlTopToBottom
.Apply
End With
End With
End SubFaites un test
Bonjour Dan,
J'espère que vous avez passé un bon week-end ?
J'ai mis à jour le tableau avec vos dernières informations
Concernant le tri automatique c'est impeccable
Par contre, j'ai effectuer une petite modification de votre code pour avoir un meilleur visuel au niveau des bordures
'bordures verticales et horizontales
With Union(.Range("A4:A" & dlg), Range("I4:V" & dlg))J'ai juste une petite remarque : Si une personne n'indique pas la semaine (Colonne B), voilà ce que cela produit :
Si nous réinsérons une nouvelle ligne, c'est cette ligne qui sera remplacée.
Est-il possible de faire apparaître un message du genre "Merci de remplir l'ensemble des champs" dans le cas ou au moment d'insérer une ligne une personne oubli un ou plusieurs champs ?
Merci