Excel / champ saisie
Bonjour à tous et ttes,
j’espère que vous allez bien. je suis nouveau sur ce forum que je découvre. je suis pas expert en excel ni en vba.
je me permets de faire appel a vous car j'ai un souci.
je cherche à mettre en place un système qui ne fasse en sorte que les données introduites en b2, c2, d2, c2 viennent après validation, se mettre au début du tableau de données qui commence à la ligne b4.
la colonne b est la date d'encodage,
la colonne c est l’article acheté,
la colonne c est le nom du fournisseur,
la colonne d est le montant de l'article.
pour faire simple, j'essaie de trouver un moyen qui m'évite de systématiquement devoir faire insertion nouvelle ligne en haut de mon tableau. je pensais donc faire un champ de saisie, qui fasse en sorte qu'une fois que j'ai encodé de nouvelles données en b2, c2, d2,e2, je fasse enter et qu'une fois enter fait ses données viennent se mettent au haut du tableau qui commence en b4.
je ne cherche pas à devoir nécessairement passé par la vba mais je pense ne pas avoir le choix.
si qq un ou qq une peut m'aider....merci à vous,
cdlmnt,
berni////
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut,
Un essai,
Il y a du code VBA dans le module1 (pour la fonction) et dans workbooks (pour gerer la touche entrée)
Damien
bonjour bigadams,
merci d'avoir pris le temps de me répondre.
j'ai essayé d'introduire des donnes mais, j'arrive a écrire dans les cellules mais les données restent dans leurs cellules d'origine.
petit observation, j'ai placé sur la feuil2 les données de mon tableau (peut-être cela pourra-t-il servir).
merci de votre aide..;
bav,
berni///
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut
Juste une remarque, tu as ecris dans A1->E1 alors qu'il fallait écrire dans les lignes A2->E2 et faire entrée lors de la fin de saisie sur E2.
CF ton message.
Je regarde ton tableau et j'adapte mon code pour ton exemple.
Damien
Avec le code modifié pour ton exemple.
Dis moi si cela te vas. Il faut faire ENTER sur la cellule "I2" pour ajouter la ligne
++
Damien
re-bjr damien,
un tt grand merci pour votre fichier qui est vraiment ce que je cherchais à faire..merci à vous..
tout ma difficulté va être de de transposer votre travail sur le fichier original...
avez-vous un conseil afin de ne pas trop ma planter..?
si besoin, accepteriez-vous de regarder sur mon fichier si tt est ok..?
merci à vous..
bonne après-midi..
berni///
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Re,
Il y a deux macros a ajouter pour que cela fonctionne :
1ere Macro a mettre dans Workbooks, cette macro va permettre l'execution d'une autre macro lors de l'appuie sur une touche (enter pour notre exemple).
Donc Excel -> ALT F11 (ouvre Editeur VBA)
Fenêtre Haut gauche , cliquer sur VBAProject(..) -> Microsoft Excel Objects puis sur ThisWorkbook
Dans la partie haut droite coller le code suivant :
Private Sub Workbook_Open()
Application.OnKey "{Enter}", "AjouteCopieligne" 'Touche enter pavé numerique
Application.OnKey "~", "AjouteCopieligne" 'Touche Entrée
End SubQu'importe l'onglet actif, dès que l'on clique sur entrée ou Enter (pavé numerique) cela va lancer la macro AjouteCopieligne
2eme Macro
Il faut la créer dans un module
Donc Excel -> ALT F11 (ouvre Editeur VBA)
Fenêtre Haut gauche , cliquer DROIT sur VBAProject(..) ->Insertion -> Module
Dans la partie haut droite coller le code suivant :
Sub AjouteCopieligne()
Dim c As Range
If Selection.Count <> 1 Then Exit Sub 'si on a selectionner plusieurs cellule alors on sors
If ActiveSheet.Name <> "Feuil2" Then Exit Sub 'Si on est pas sur la bonne feuille alors on ne fait pas le copier/coller
If Selection = Range("I2") Then 'Si on appuie sur enter et que l'on est dans la cellule E2 alors
Rows("4:4").Insert Shift:=xlDown 'on insere une nouvelle ligne sur la ligne 4
Range("b2", "I2").Copy 'On copy la ligne B2 -> E2
Range("B4").PasteSpecial xlPasteValues 'On colle les valeurs
Range("b2", "I2").Clear 'On supprime les valeurs
'Code permettant de mettre le contour autour des cellules
For Each c In Range("B2", "I2") 'Contour mis autour des cellules B2 -> I2
c.Borders(xlDiagonalDown).LineStyle = xlNone
c.Borders(xlDiagonalUp).LineStyle = xlNone
With c.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Next
'Code pour colorier en rose la nouvelle ligne collé
For Each c In Range("B4", "I4") 'Ligne B4 -> I4
With c.Interior
.ColorIndex = 38 '38 = rose
.Pattern = xlSolid
End With
Next
End If
End SubIMPORTANT :
Il faut sans doute modifier les lignes :
If ActiveSheet.Name <> "Feuil2" Then Exit Sub 'Si on est pas sur la bonne feuille (ici la bonne c'est Feuil2) alors on ne fait pas le copier/coller
If Selection = Range("I2") Then 'Si on appuie sur enter et que l'on est dans la cellule I2 alorsSauvegarde ensuite le fichier et ouvre le a nouveau.
Cela devrait fonctionner sans problème.
Damien
Bonjour damien, bonjour à tous...
comme indiqué dans mon précédement post..j'ai essaté de transferer sur le fichier original la vba proposé par damien.
je commencerais par le remercier car d'une part ça marche et d'autre part, je suis grâce à ses bons conseils parvenu à transposer la vba.
je pense qu'une des régles de ce type de forum est le partage donc, je post le fichier
deux observations/demandes :
1) le code couleur de la ligne à inscrusté n'est pas la même que la couleur utilisé pour les lignes du dessous. est-il de rectifier le tire (j'ai regardé sur la palette couleur...le 38 renvoi au rose saumon mais il me semble que dans mon cas on est plus sur du rose),
2) j'ai cherché à protéger ma feuille d'encodage sauf la ligne 2 afin d'éviter les erreurs de manip..
j'observe que si je protège ma feuille...la macro bugg...j'imagine que les chose sont liés...pouvez-vous confirmer l'info...est-il possible de contourner le pb..? [en ne protégeant pas la ligne 4 par ex..?]
3) j'aimerais aujouter à la macro l'info d'ajouter à la ligner inscruster des bordures blanches...pour se faire, je peux ajouter à la macro ceci :
Sub couleurs()
'Epaisseur de la bordure
ActiveCell.Borders.Weight = 1
'Couleur de la bordure : rouge
ActiveCell.Borders.Color = RGB(255, 255, 255)
End Sub
je decouvre ce site...et je suis surpris par son efficacité et la qualité de ses interventions..
merci aux modérateurs et concepteur de ce site...
tres cdlmnt,
berni///
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut,
De retour de vacances..... Ca fait du bien !!
Pour répondre a tes questions :
1 - Change le code couleur a ta convenance. Il y a sur le forum du code permettant de récuperer le code couleur d'une cellule.
2- Un peu plus compliqué :
- Selectionner la plage de saisie (B2=>G2)
- Aller dans le Menu Outils-> protection -> permettre aux utilisateurs de modifier de plages.
- On doit avoir Plage1 |$B$2:$g$2 (Pas de mot de passe) - Cliquer sur appliquer
- Dans le code on aura les moficiations suivantes a faire :
La définition du mot de passe :
Dim monpassword As String
monpassword = "123" La deprotection de la feuille
ActiveSheet.Unprotect (monpassword) 'On deprotège la feuille puis on fait la manipulationLa reprotection de la feuille
ActiveSheet.Protect password:=monpassword, DrawingObjects:=False, Contents:=True, Scenarios:=False 'On reprotege la feuilleCe qui fait a la fin :
Sub AjouteCopieligne()
Dim c As Range
Dim monpassword As String
monpassword = "123" 'MODIF PROTECTION
If Selection.Count <> 1 Then Exit Sub 'si on a selectionner plusieurs cellule alors on sors
If ActiveSheet.Name <> "encodage_données" Then Exit Sub 'Si on est pas sur la bonne feuille alors on ne fait pas le copier/coller
If Selection = Range("g2") Then 'Si on appuie sur enter et que l'on est dans la cellule E2 alors
ActiveSheet.Unprotect (monpassword) 'On deprotège la feuille puis on fait la manipulation
Rows("4:4").Insert Shift:=xlDown 'on insere une nouvelle ligne sur la ligne 4
Range("b2", "g2").Copy 'On copy la ligne B2 -> E2
Range("B4").PasteSpecial xlPasteValues 'On colle les valeurs
Range("b2", "g2").Clear 'On supprime les valeurs
'Code permettant de mettre le contour autour des cellules
For Each c In Range("B2", "g2") 'Contour mis autour des cellules B2 -> g2
c.Borders(xlDiagonalDown).LineStyle = xlNone
c.Borders(xlDiagonalUp).LineStyle = xlNone
With c.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Next
'Code pour colorier en rose la nouvelle ligne collé
For Each c In Range("B4", "g4") 'Ligne B4 -> I4
With c.Interior
.ColorIndex = 38 '38 = rose
.Pattern = xlSolid
End With
Next
ActiveSheet.Protect password:=monpassword, DrawingObjects:=False, Contents:=True, Scenarios:=False 'On reprotege la feuille
End If
End Sub3 - Il faut juste modifier la partie du code suivant :
'Code pour colorier en rose la nouvelle ligne collé
For Each c In Range("B4", "g4") 'Ligne B4 -> I4
With c.Interior
.ColorIndex = 38 '38 = rose
.Pattern = xlSolid
c.Borders.Weight = 1
'Couleur de la bordure : rouge
c.Borders.Color = RGB(255, 255, 255)
End With
NextCloture la demande svp si tu as ta réponse.
Damien