OVH Cloud OVH Cloud

autoselection des cellules à saisir

8 réponses
Avatar
JMG
Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de l'utilisateur
(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la valide, alors
la selection se fait sur la
cellule C3 etc etc ...
==============================================
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
===============================================

Merci de votre aide.

8 réponses

Avatar
Pounet95
Bonjour,
Tu peux regarder ton calendrier ? Tu es déjà au 14 janvier !!!!!!

--
Pounet95
on trouve tout ( ou presque ) http://www.excelabo.net/

"JMG" a écrit dans le message de news:
e8ku4fY%
Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de l'utilisateur
(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la valide,
alors
la selection se fait sur la
cellule C3 etc etc ...
============================================= > Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
============================================== >
Merci de votre aide.




Avatar
anomymousA
bonjour,

en charchant à respecter d'assez près la structure de ton programme
tu mets les procédures uivantes dans le module Thisworkbook de ton projet et
ca marchera pour toutes les feuilles de ton classeur
Si tu veux que ca ne marche que pour quelques feuilles , il faut que tu
fasses un test sur sh.name dans la procédure suivante.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Application.EnableEvents = False

If Intersect(Target, Range("C2:C600")) Is Nothing And Intersect(Target,
Range("F2:F600")) Is Nothing Then Exit Sub

If Target.Offset(0, -1) <> "" Then Exit Sub

If Not Intersect(Target, Range("C2:C600")) Is Nothing Then
movecell -1, 3, Target
Else
movecell 0, -3, Target
End If

Application.EnableEvents = True

End Sub
Sub movecell(ligne, col, cellinaction As Range)

If cellinaction = "" Then
cellinaction.Offset(0, -1) = ""
Else
cellinaction.Offset(0, -1) = Now
ActiveCell.Offset(ligne, col).Select
End If

End Sub

Espère avoir bien compris ton prioblème

A+


Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de l'utilisateur
(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la valide, alors
la selection se fait sur la
cellule C3 etc etc ...
============================================= > Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
============================================== >
Merci de votre aide.





Avatar
anomymousA
re,

les Application.enablevents sont superfétatoires car les modifications
automatiques ayant lieu sur des cellules n'appartenant pas aux ranges
spécifiés (C2:C600 et F2:F600), il n'y a pas de risque de boucle infernale.
J'attire toutefois ton attention sur le fait qu'une suppression de plus
d'une cellule provoque une erreur sur l'instruction If Target.Offset(0, -1)
<> "" Then Exit Sub.
En conséquence et pour s'en prémunir, ecrire en haut de la procédure on
error resume next si tu enlèves les application.enableevents , autrement
gerer l'erreur par un gestionnaire en fin de programme pour rétablir
Application.enablevents=true

A+


bonjour,

en charchant à respecter d'assez près la structure de ton programme
tu mets les procédures uivantes dans le module Thisworkbook de ton projet et
ca marchera pour toutes les feuilles de ton classeur
Si tu veux que ca ne marche que pour quelques feuilles , il faut que tu
fasses un test sur sh.name dans la procédure suivante.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Application.EnableEvents = False

If Intersect(Target, Range("C2:C600")) Is Nothing And Intersect(Target,
Range("F2:F600")) Is Nothing Then Exit Sub

If Target.Offset(0, -1) <> "" Then Exit Sub

If Not Intersect(Target, Range("C2:C600")) Is Nothing Then
movecell -1, 3, Target
Else
movecell 0, -3, Target
End If

Application.EnableEvents = True

End Sub
Sub movecell(ligne, col, cellinaction As Range)

If cellinaction = "" Then
cellinaction.Offset(0, -1) = ""
Else
cellinaction.Offset(0, -1) = Now
ActiveCell.Offset(ligne, col).Select
End If

End Sub

Espère avoir bien compris ton prioblème

A+


Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de l'utilisateur
(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la valide, alors
la selection se fait sur la
cellule C3 etc etc ...
============================================= > > Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
============================================== > >
Merci de votre aide.







Avatar
JMG
Bonsoir et merci de votre aide
Je vais essayer d'être plus précis:
-1ere étape
en colonne B: affichage automatique de la date du jour
si données(saisies par utilisateur) en colonne C
ex: valeur de B2 = date du jour dès que C2 a été rempli par l'utilisateur du
classeur et qu'il a validé sa saisie par Entrée
-2ème étape
Lors de la validation de la saisie (par Entrée), selection automatique de la
prochaine cellule à saisir
(dans l'exemple la cellule F2 sera selectionnée après que B2 soit remplie)
-3ème étape
L'utilisateur saisit les données en colonne F (dans l'exemple en F2), puis
valide (par touche Entrée)
La selection se fait alors sur la cellule juste en dessous de C2, donc en C3
et ainsi de suite
(en colonne D et E , il y des formules basés sur le contenu de la colonne C)
J'ai teste le code du précédent message
Il fonctionne, sauf qu'il inscrit la date également en colonne E.
(Je précise que le classeur est destinée à une personne débutante, qui ne
connait pas Excel, le but
étant de limité au maximum les saisies et manipulation qu'elle aura à
effectuer)
J'espère que j'ai décris clairement le but recherché.

Est qu'une autre voie (par userform par exemple) serait plus commode?
Par exemple un clic dans la cellule vide en colonne C->Userform1.Show (avec
un TextBox.Caption=Format(Now,......), deux autres textbox, l'un pour valeur
en C, l'autre pour valeur en F, et un commandbutton pour injecter les
valeurs saises dans l'userform dans la feuille active?

Ou dois-je offrir une formation sur Excel à ma collègue débutante?

Merci à ceux qui pourront m'aider en VBA...., et sont heureux de ne pas
connaitre ma collègue....

"anomymousA" a écrit dans le message
de news:
re,

les Application.enablevents sont superfétatoires car les modifications
automatiques ayant lieu sur des cellules n'appartenant pas aux ranges
spécifiés (C2:C600 et F2:F600), il n'y a pas de risque de boucle
infernale.

J'attire toutefois ton attention sur le fait qu'une suppression de plus
d'une cellule provoque une erreur sur l'instruction If
Target.Offset(0, -1)

<> "" Then Exit Sub.
En conséquence et pour s'en prémunir, ecrire en haut de la procédure on
error resume next si tu enlèves les application.enableevents , autrement
gerer l'erreur par un gestionnaire en fin de programme pour rétablir
Application.enablevents=true

A+


bonjour,

en charchant à respecter d'assez près la structure de ton programme
tu mets les procédures uivantes dans le module Thisworkbook de ton
projet et


ca marchera pour toutes les feuilles de ton classeur
Si tu veux que ca ne marche que pour quelques feuilles , il faut que tu
fasses un test sur sh.name dans la procédure suivante.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)



Application.EnableEvents = False

If Intersect(Target, Range("C2:C600")) Is Nothing And Intersect(Target,
Range("F2:F600")) Is Nothing Then Exit Sub

If Target.Offset(0, -1) <> "" Then Exit Sub

If Not Intersect(Target, Range("C2:C600")) Is Nothing Then
movecell -1, 3, Target
Else
movecell 0, -3, Target
End If

Application.EnableEvents = True

End Sub
Sub movecell(ligne, col, cellinaction As Range)

If cellinaction = "" Then
cellinaction.Offset(0, -1) = ""
Else
cellinaction.Offset(0, -1) = Now
ActiveCell.Offset(ligne, col).Select
End If

End Sub

Espère avoir bien compris ton prioblème

A+


Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de l'utilisateur
(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la valide,
alors



la selection se fait sur la
cellule C3 etc etc ...
============================================= > > > Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
============================================== > > >
Merci de votre aide.









Avatar
anonymousA
re,

ben comme tu m'expliquais pas tout, j'avais supposé qu'il fallait traiter la
saisie en F comme en C donc forcément j'inscrivais quelque chose en cellule
E. Ceci dit, as-tu compris le principe du code afin de pouvoir l'adapter ?
N'étant pas encore absolument sur que tu m'aies tout dit, je vais supposer
qu'une fois saisi quelque chose en colonne F, on ne fait rien d'autre que
passer à la cellule C+1.

En conséquence pour adapter le code il te faut remplacer dans la procédure
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
la ligne movecell 0, -3, Target
par Target.Offset(1, -3).Select

et ca marche !

Pour le reste, je ne connais pas ta collègue mais le + dur dans les appli
informatique c''est de prévoir les c..... des utilisateurs et de verrouiller
les choses pour que ca ne soit pas préjudiciable aux données.

A+



"JMG" a écrit dans le message de news:
e51rEBc#
Bonsoir et merci de votre aide
Je vais essayer d'être plus précis:
-1ere étape
en colonne B: affichage automatique de la date du jour
si données(saisies par utilisateur) en colonne C
ex: valeur de B2 = date du jour dès que C2 a été rempli par l'utilisateur
du

classeur et qu'il a validé sa saisie par Entrée
-2ème étape
Lors de la validation de la saisie (par Entrée), selection automatique de
la

prochaine cellule à saisir
(dans l'exemple la cellule F2 sera selectionnée après que B2 soit remplie)
-3ème étape
L'utilisateur saisit les données en colonne F (dans l'exemple en F2), puis
valide (par touche Entrée)
La selection se fait alors sur la cellule juste en dessous de C2, donc en
C3

et ainsi de suite
(en colonne D et E , il y des formules basés sur le contenu de la colonne
C)

J'ai teste le code du précédent message
Il fonctionne, sauf qu'il inscrit la date également en colonne E.
(Je précise que le classeur est destinée à une personne débutante, qui ne
connait pas Excel, le but
étant de limité au maximum les saisies et manipulation qu'elle aura à
effectuer)
J'espère que j'ai décris clairement le but recherché.

Est qu'une autre voie (par userform par exemple) serait plus commode?
Par exemple un clic dans la cellule vide en colonne C->Userform1.Show
(avec

un TextBox.Caption=Format(Now,......), deux autres textbox, l'un pour
valeur

en C, l'autre pour valeur en F, et un commandbutton pour injecter les
valeurs saises dans l'userform dans la feuille active?

Ou dois-je offrir une formation sur Excel à ma collègue débutante?

Merci à ceux qui pourront m'aider en VBA...., et sont heureux de ne pas
connaitre ma collègue....

"anomymousA" a écrit dans le
message

de news:
re,

les Application.enablevents sont superfétatoires car les modifications
automatiques ayant lieu sur des cellules n'appartenant pas aux ranges
spécifiés (C2:C600 et F2:F600), il n'y a pas de risque de boucle
infernale.

J'attire toutefois ton attention sur le fait qu'une suppression de plus
d'une cellule provoque une erreur sur l'instruction If
Target.Offset(0, -1)

<> "" Then Exit Sub.
En conséquence et pour s'en prémunir, ecrire en haut de la procédure on
error resume next si tu enlèves les application.enableevents , autrement
gerer l'erreur par un gestionnaire en fin de programme pour rétablir
Application.enablevents=true

A+


bonjour,

en charchant à respecter d'assez près la structure de ton programme
tu mets les procédures uivantes dans le module Thisworkbook de ton
projet et


ca marchera pour toutes les feuilles de ton classeur
Si tu veux que ca ne marche que pour quelques feuilles , il faut que
tu



fasses un test sur sh.name dans la procédure suivante.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)



Application.EnableEvents = False

If Intersect(Target, Range("C2:C600")) Is Nothing And
Intersect(Target,



Range("F2:F600")) Is Nothing Then Exit Sub

If Target.Offset(0, -1) <> "" Then Exit Sub

If Not Intersect(Target, Range("C2:C600")) Is Nothing Then
movecell -1, 3, Target
Else
movecell 0, -3, Target
End If

Application.EnableEvents = True

End Sub
Sub movecell(ligne, col, cellinaction As Range)

If cellinaction = "" Then
cellinaction.Offset(0, -1) = ""
Else
cellinaction.Offset(0, -1) = Now
ActiveCell.Offset(ligne, col).Select
End If

End Sub

Espère avoir bien compris ton prioblème

A+


Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de
l'utilisateur




(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la
valide,




alors
la selection se fait sur la
cellule C3 etc etc ...
============================================= > > > > Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
============================================== > > > >
Merci de votre aide.













Avatar
JMG
Question subsidiaire:

Dois-je copier cette procédure dans chaque feuille du classeur
ou puis-je la copier dans un module puis dans chaque feuille
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Call Autosaisie()
End Sub?
Avatar
JMG
Ca ne fonctionne pas
Erreur exécution 424
Objet requis
"JMG" a écrit dans le message de
news:e8ku4fY%
Bonjour

J'utilise le code ci-dessous pour faciliter la saisie de l'utilisateur
(ce qui fonctionne bien)
je voudrais juste compléter le code pour que :
une fois dans la saisie effectuée dans la colonne F
la selection se fasse en en ligne C+1
Exemple:
L'utilisateur saisit en C2, la date du jour s'affiche en B2, puis la
selection se fait en F2, l'utilisateur effectue sa saisie, la valide,
alors

la selection se fait sur la
cellule C3 etc etc ...
============================================= > Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("C2:C600")) Is Nothing Then: Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then
Target.Offset(0, -1) = ""
Else
Target.Offset(0, -1) = Now
ActiveCell.Offset(-1, 4).Range("A1").Select
End If
End Sub
============================================== >
Merci de votre aide.




Avatar
JMG
Bonjour

En conséquence pour adapter le code il te faut remplacer dans la procédure
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)

la ligne movecell 0, -3, Target
par Target.Offset(1, -3).Select

et ca marche !
Effectivement cela fonctionne


Peux-t-on inclure d'autres "macros" dans cette procédure pour d'autres
Range?
Par exemple puis-je ajouter le code ci-dessous:
Ou dois-je l'insérer dans un module ou dans un autre évenement Woorkbook ou
Worksheet?
'code de Michel_M
If Intersect(Target, Range("H3:K502", "M3:O500")) Is Nothing Then: Exit Sub
lig = Target.Row
Cells(lig, 8).Select
'appelle la macro commune aux 12 mois
situer
....
Sub situer()
Dim nom_cl As String, moyen_p As String
nom_cl = ActiveCell.Value
'évite de déclencher worksheet_change car "changements" en cours
flag = True
'ligne où se trouve nom_cl
lig = Columns(8).Find(nom_cl, Range("H2"), , , xlByRows).Row
If Application.CountIf(Worksheets("clients").Range("A2:A10000"), nom_cl) = 0
Then
MsgBox "nom inconnu"
Range(Cells(lig, 8), Cells(lig, 15)).ClearContents
Exit Sub
End If
If IsEmpty(ActiveCell) Then
Range(Cells(lig, 9), Cells(lig, 15)).ClearContents
Exit Sub
End If
' report des coordonnées
Cells(lig, 9) = Application.VLookup(nom_cl, Range("bdclient"), 2, 0)
Cells(lig, 10) = Application.VLookup(nom_cl, Range("bdclient"), 3, 0)
Cells(lig, 11) = Application.VLookup(nom_cl, Range("bdclient"), 4, 0)
End Sub