Macro Ecrire dans une cellule.

Lemimelo

XLDnaute Nouveau
Bonjour.
Je cherche désespérément du code pour me permettre d'avoir simplement ma macro qui :
- attende que je saisisse qqc dans une cellule (pas de Textbox ou autre)
- une fois avoir tapé sur entrée, enclenche la suite du code qui agira sur ce qui a été saisi dans la cellule.


Ca doit etre simple mais je ne le trouve nulle part...
Merci d'avance pour vos retours.
Lemimelo
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Ecrire dans une cellule.

Bonjour Lemimelo et bienvenu, bonjour le forum,

Il te faut utiliser la macro événementielle Change qui agit à chaque changement dans l'onglet dans lequel tu l'auras appliqué.
Pour cela clique avec le bouton droit de la souris sur le nom de l'onglet en bas et choisis l'otion Visualiser le code. Tu vas te retouver dans VBE (Visual Basic Editor) et dans le premier champ "Objet" (au dessus du curseur qui clignote) où il y a marqué (Général), choisis Worksheet, dans la champ suivant "Procédure" choisis Change. Les première et dernière ligne de la procédure sont créées il ne te reste plus qu'a jouter le code...
Cette procédure sera exécutée à chaque changement dans l'onglet mais tu peut en limiter l'action :
• à une seule cellule (ici A1) avec :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
'... ton code
End Sub

• à une ligne (ici ligne 1) avec :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row <> 1 Then Exit Sub
'... ton code
End Sub

• à une colonne (ici colonne A) avec :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column<> 1 Then Exit Sub
'... ton code
End Sub

• à une plage (ici A10:L20)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("A10:L20")) Is Nothing Then Exit Sub
'... ton code
End Sub

Attention, si dans ton code tu modifies une cellule dans les limites cela relance la procédure et ça peut provoquer des boucles ou des bugs. Pour pallier à ce problème certains utilisent Application.EnableEvents avec la pripriété = False au début puis remise à = True en fin de code. Mais si ça plante avant d'être réinitialiser à True, les macros événementielle ne fonctionnent plus... Je préfère donc utiliser une variable de type Booléenne comme ça :
Code:
Private test As Boolean


Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("A10:L20")) Is Nothing Then Exit Sub
If test = True Then Exit Sub
test = True
'... ton code
test = False
End Sub
Remarque si dans ton code tu modifies une cellule hors des limites, tu n'as pas besoin de booléenne.

En pièce jointe un fichier qui reprend toutes ces possibilités. Modifie un cellule en jaune puis une autre non jaune dans les différents onglets...

[Édition]
Bonjour Néné on s'est croisé...

 

Pièces jointes

  • Lemimelo_v01.xls
    35.5 KB · Affichages: 108
Dernière édition:

Lemimelo

XLDnaute Nouveau
Re : Macro Ecrire dans une cellule.

Bonjour néné, merci pour la bienvenue.

Mon objectif : taper le nom raccourci d'un nom de plante (je suis botaniste) et qu'excel affiche le nom complet une fois tapé sur entrée.

Pour ce faire :
- J'ai un fichier CodeRac.xlsx avec deux colonnes : col A avec les noms raccourcis, col B avec les noms complets auxquels ils se rattachent.
- Un autre fichier Test.xlsm sur lequel je travaille.

Dans Personal.xlsb, j'ai la macro suivante (c'est ma deuxième macro, donc si vous avez des trucs pour clarifier le code...). Pour l'instant elle permet de convertir les noms raccourcis une fois qu'ils ont tous été saisis (ils sont toujours dans la 1ère colonne du tableau sélectionné avec CurrentRegion). J'aimerais donc que la macro puisse fonctionner cellule après cellule après avoir écrit les noms raccourcis dans les cellules.

Sub CodeRac()
'
' CodeRac Macro
' Donne le nom de l'espèce après avoir saisi le coderac.

Dim Val As String
Dim i As Integer

With Application.Workbooks("Test.xlsm").Worksheets(1)
Set AConvertir = .Range("A1").CurrentRegion.Columns(1)
Val = AConvertir.Cells(1, 1).Value

For i = 1 To AConvertir.Rows.Count
Set Converti = AConvertir
Val = AConvertir.Cells(i, 1).Value
Set CodeRacATrouver = Application.Workbooks("CodeRac.xlsx").Worksheets(1). _
Range("a1:a8153").Find(Val, LookIn:=xlValues)
If Not CodeRacATrouver Is Nothing Then
Converti.Cells(i, 1) = CodeRacATrouver.Offset(0, 1)
Else: Converti.Cells(i, 1).Font.ColorIndex = 3
End If
Next

End With
End Sub
 

Pièces jointes

  • Test.xlsm
    13.5 KB · Affichages: 77
  • CodeRac.xlsx
    255 KB · Affichages: 685
  • Test.xlsm
    13.5 KB · Affichages: 77
  • Test.xlsm
    13.5 KB · Affichages: 79

néné06

XLDnaute Accro
Re : Macro Ecrire dans une cellule.

Bonjour Robert

Quel beau "Cours Magistral" tu viens de dispenser:

Tout y est, de "Change" en passant par les zones et les evenements et autres.
Difficile d'en rajouter.
Notre ami Lemimelo ne pouvait espérer plus!!

Je ne peux que dire un grand BRAVO!!!

René
 

Lemimelo

XLDnaute Nouveau
Re : Macro Ecrire dans une cellule.

Merci Robert pour cette explication très claire !
Vu que je pensais faire partager le fichier aux collègues, ce sera donc indispensable qu'ils fassent leur saisie dans la même feuille ! Je pense donc faire un classeur unique avec CodeRac.xlsx en deuxième feuille et que les gens puissent saisir les espèces en première feuille.

Je vais essayer de bidouiller le code pour qu'il puisse être inactif si l'on saisit autre chose qu'un nom raccourci.

Merci encore c'est super !
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Ecrire dans une cellule.

Bonjour le fil, bonjour le forum,

En pièce jointe tes fichiers modifiés. Comme je n'ai que la version Excel 2003 il sont devenus .xls... Pense à les renommer avec la bonne extension car ler code tiens compte de l'extensiion .xlsx
Le code :
Code:
Private test As Boolean 'déclare la variable test

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim cs As Workbook 'déclare la variable cs (Classeur Source)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim r As Range 'déclare la variable r (Recherche)

If test = True Then Exit Sub 'si test est vrsie. sort de la procédure
If Target.Column <> 1 Then Exit Sub 'si le changement a lieu ailleurs que dans la colonne A, sort de la procédure
If Target = "" Then Exit Sub 'si la cellule est effacée, sort de la procédure
test = True 'définit la variable test
Set cs = Workbooks("CodeRac.xlsx") 'définit le classeur source
Set os = cs.Sheets("Feuil1") 'définit l'onglet source
'définit la recherche (recherche la valeur de la cellule éditée dans la colonne A de l'onglet source)
Set r = os.Columns(1).Find(Target.Value, , xlValues, xlWhole)
'si il existe au moins une occurrence, remplace la valeur de la cellule par la valeur de la cellule en colonne B de l'occurrence
If Not r Is Nothing Then Target.Value = r.Offset(0, 1).Value
test = False 'réinitialise la variable test
End Sub

Les fichiers :
 

Pièces jointes

  • Test.xls
    49.5 KB · Affichages: 60
  • Test.xls
    49.5 KB · Affichages: 69
  • CodeRac.xls
    803 KB · Affichages: 109
  • Test.xls
    49.5 KB · Affichages: 62
Dernière édition:

néné06

XLDnaute Accro
Re : Macro Ecrire dans une cellule.

Re,

Pourquoi ne pas utiliser une combobox avec ta liste de raccourcis, ce qui te permet, dés la première lettre tapée , d'avoir les raccourcis approchants, tu trouve le raccourci exact, tu click et tu as la ligne par "combobox.listindex" .
Tu prends la cellule en colonne "B" ?

Oups.. j'avais mal lu le debut " Pas de textbox ou autres"
Ne pas tenir compte de ce post.

A+
 
Dernière édition:

Lemimelo

XLDnaute Nouveau
Re : Macro Ecrire dans une cellule.

Re,

Pourquoi ne pas utiliser une combobox avec ta liste de raccourcis, ce qui te permet, dés la première lettre tapée , d'avoir les raccourcis approchants, tu trouve le raccourci exact, tu click et tu as la ligne par "combobox.listindex" .
Tu prends la cellule en colonne "B" ?

A+

Tout simplement parce que je n'ai encore jamais maîtrisé cet outil (je suis total autodidacte depuis une semaine), mais je me promettais de l'utiliser par la suite. C'est vrai que j'aimerais avoir une saisie semi-automatique, mais si j'ai bien compris l'utilisation des combobox (ce que je ne suis pas sur), elles permettent de saisir à partir d'une boite qui apparait -> Cela me semblait trop fastidieux pour ce que j'ai envie de faire car je préfèrerais saisir directement dans les cellules. Après, si c'est le seul moyen d'avoir une saisie semi automatique, je suis preneur !

Et à quoi ressemblerait alors le code ?

En tout cas merci pour la rapidité, à peine après avoir compris un message, deux autres apparaissent !
Lemimelo
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Ecrire dans une cellule.

Bonjour le fil, bonjour le forum,

Re,

Pourquoi ne pas utiliser une combobox avec ta liste de raccourcis, ce qui te permet, dés la première lettre tapée , d'avoir les raccourcis approchants, tu trouve le raccourci exact, tu click et tu as la ligne par "combobox.listindex" .
Tu prends la cellule en colonne "B" ?

A+
Ben oui au fait ! Pourquoi pas ? Ou avec une TextBox...
Dans l'exemple en pièce jointe, ta base se trouve dans l'onglet Feuil1 et tu travailles dans l'onglet Feuil2. Double-clique dans une cellule de la colonne A, ça lance l'Userform, Commence à taper les premières lettres, quand la ListBox1 ne contient qu'ujne seule valeur, cette valeur s'affiche dans la cellule et l'UserForm est fermée.

Le code :
Code:
Private pl As Range 'déclare la variable pl (PLage)

Private Sub UserForm_Initialize() 'a l'initialisation de l'UserForm
Dim dl As Integer 'définit la variable dl (Dernière Ligne)

With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A)
    Set pl = .Range("A2:A" & dl) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "Feuil1"
End Sub
Private Sub TextBox1_Change() 'au changement dans la TextBox1
Dim cel As Range 'déclare la variable cel (CELlule)
ListBox1.Clear 'vide la ListBox1
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    'si les premiers caractères de la TextBox1 correspondent au premier caractères de la cellule cel
    '(majuscule comme minuscule), ajoute la v aleur de la cellule à la ListBox1
    If UCase(Left(cel.Value, Len(Me.TextBox1.Value))) = UCase(Me.TextBox1.Value) Then Me.ListBox1.AddItem cel.Value
Next cel 'prochaine cellule de la boucle
If Me.ListBox1.ListCount = 1 Then 'condition : si la ListBox1 ne contient qu'un seul élément
    'place dans la cellule active le resultat de la recherche dans la plage pl du contenu de la ListBox1 décalé d'une colonne à droite
    ActiveCell.Value = pl.Find(Me.ListBox1.List(0), , xlValues, xlWhole).Offset(0, 1)
    Unload Me 'vide et ferme l'UserForm
End If 'fin de la condition
End Sub
Le fichier :
 

Pièces jointes

  • CodeRac_v02.xls
    805.5 KB · Affichages: 136

Lemimelo

XLDnaute Nouveau
Re : Macro Ecrire dans une cellule.

Oui effectivement ça peut être intéressant !
Je vais essayer de chercher des trucs un peu balèze pour mon niveau :
- redimensionner la combobox pour qu'elle corresponde à la taille d'une cellule
- que si je clique sur n'importe quelle cellule, la combobox se positionne directement sur cette dernière
- que lorsque j'appuie sur entrée, la combobox se décale d'une ligne et que le nom complet de l'espèce s'affiche dans la cellule précédente.

J'imagine que pour les deux derniers points, il faudra que je me mette dans la procédure "Change"...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Ecrire dans une cellule.

Bonjour le fil, bonjour le forum,

La version 03 modidiée. Au lieu de s'ouvrir sur le double-clic dans une cellule de la colonne A (de l'onglet Feuil2), l'USerForm s'ouvre au clic simple dans la cellule et se ferme avec la touche [Échap.]. Une fois la cellule éditée, le curseur se plave une ligne en dessous pour une nouvelle édition... Le reste est identique à la Version 02...
Le fichier :
 

Pièces jointes

  • CodeRac_v03.xls
    809 KB · Affichages: 184
Dernière édition:

Lemimelo

XLDnaute Nouveau
Re : Macro Ecrire dans une cellule.

C'est très intéressant, au moins j'apprends beaucoup !

Pour rester dans ton exemple Robert, je me dis que ce serait bien que dans le listbox apparaisse les deux colonnes avec le nom raccourci et le nom complet pour voir à quoi correspondent les choix. Pour cela, je pense que je vais faire une troisième colonne qui concatène les deux premières.
Par contre il y a un bug quand l'UserForm va dans la cellule qui suit, on ne peut plus rien saisir car la liste ne se déroule plus.
Ce serait bien de pouvoir bouger l'UserForm avec la touche tab ou la flèche haut en plus d'Entrée.

Sinon je trouve le Combobox de néné plus sympathique, mais par contre, impossible pour moi de le déplacer !

Eh ben je m'y remets après une ptite pause...
 

Discussions similaires

Statistiques des forums

Discussions
312 755
Messages
2 091 701
Membres
105 052
dernier inscrit
HAMOUD