XL 2016 saisie assisté déplacement curseur

michokette

XLDnaute Nouveau
Bonjour à tous

J'ai commencé un bout de code pour déplacer le curseur a des endroits précis, mais je n'arrive à le finaliser

Ainsi je saisie en colonne i sur la 1er ligne, puis le curseur se positionne en colonne E ligne 4

Ce que je souhaite c'est qu'une fois la saisie faite sur la colonne E ligne 4, le curseur se positionne en colonne D sur la 1er ligne

puis de nouveau se positionner en colonne i sur la ligne 5 qui après saisie va se positionner sur la colonne E ligne 8, puis se positionner en colonne D ligne 5

et ainsi de suite, c'est surement une histoire de boucle, mais je n'y arrive pas

Merci pour vos propositions
 

Pièces jointes

  • test.xlsm
    27.2 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour michokette,
Un essai en PJ si j'ai bien saisi la logique, avec :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim L%, C%, Cas%
    Application.EnableEvents = False
    If Target.Count > 1 Then Exit Sub
    L = Target.Row: C = Target.Column     ' Ligne et Colonne de Target
    Cas = 1 + L Mod 4                     ' Cas donne 1 si ligne = 4,8,12 ... et 2 si ligne = 1,5,9 ...
    If C = 9 And Cas = 2 Then             ' Si Ligne 1,5,9 ... et colonne J
        Cells(L + 3, "E").Select
    ElseIf C = 5 And Cas = 1 Then         ' Si Ligne 4,8,12 ... et colonne E
        Cells(L - 3, "D").Select
    ElseIf C = 4 And Cas = 2 Then         ' Si Ligne 1,5,9 ... et colonne D
        Cells(L + 4, "I").Select
    End If
    Application.EnableEvents = True
End Sub
 

Pièces jointes

  • test (7).xlsm
    26.4 KB · Affichages: 7

michokette

XLDnaute Nouveau
Bonjour michokette,
Un essai en PJ si j'ai bien saisi la logique, avec :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim L%, C%, Cas%
    Application.EnableEvents = False
    If Target.Count > 1 Then Exit Sub
    L = Target.Row: C = Target.Column     ' Ligne et Colonne de Target
    Cas = 1 + L Mod 4                     ' Cas donne 1 si ligne = 4,8,12 ... et 2 si ligne = 1,5,9 ...
    If C = 9 And Cas = 2 Then             ' Si Ligne 1,5,9 ... et colonne J
        Cells(L + 3, "E").Select
    ElseIf C = 5 And Cas = 1 Then         ' Si Ligne 4,8,12 ... et colonne E
        Cells(L - 3, "D").Select
    ElseIf C = 4 And Cas = 2 Then         ' Si Ligne 1,5,9 ... et colonne D
        Cells(L + 4, "I").Select
    End If
    Application.EnableEvents = True
End Sub
Sylvanu bonjour

Je viens de tester votre proposition, et cela va au delà de mes espérances.

Un grand merci à vous pour votre précieuse aide

Je vous souhaite une bonne journée
 

patricktoulon

XLDnaute Barbatruc
Bonjour @michokette , @sylvanu
une autre version avec un case sur colonne
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
 dim cel as range
 If Target.Count > 1 Then Exit Sub
  Application.EnableEvents = False
    Select Case Target.Column
        Case 9: Set cel = Target.Offset(3, -4) 'si  en colonne "I"
        Case 5: Set cel = Target.Offset(-3, -1) ' si en colonne "E"
        Case 4: Set cel = Target.Offset(4, 5) ' si en colonne"D"
        Case Else: Set cel = ActiveCell ' si autre endroit on se déplace pas
    End Select
  cel.Select
  Application.EnableEvents = True
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
rien de plus simple
tu ajoute la condition row paire par 4 pour "E"
etarget.row>1 et target.offset(-1,1)<>"" pour "D"
autrement dit les cellules intermédiaire n'agirons pas on pourrait même faire un case application .undo pour effacer une cellule tapée par erreur
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
essaie ça pour voir
j'ai ajouté le undo sur target modifiée par erreur
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim cel As Range, x&
  If Target.Count > 1 Then Exit Sub
  Application.EnableEvents = False
    Select Case Target.Column
        Case 9: Set cel = Target.Offset(3, -4) 'si  en colonne "J"
        Case 5: x = Abs(Target.Row Mod 4 = 0): Set cel = Target.Offset(-3 * x, -1 * x) ' si en colonne "E"
        Case 4: x = Abs(Target.Offset(3, 1) <> ""): Set cel = Target.Offset(4 * x, 5 * x) ' si en colonne"D"
        Case Else: Set cel = ActiveCell ' si autre endroit on laisse excel faire
    End Select
  If cel.Address = Target.Address Then Application.Undo
  cel.Select
  Application.EnableEvents = True
End Sub
le principe
chaque case controle si la précédente cellule de droite est dument remplie avec X
x est le résultat en valeur absolu du contrôle(donc soit 1 soit 0)

et dans les offset je multiplie par x
si x vaut 0 *par 0 =offset(0,0) donc on bouge pas
et en sortie de case si cel address=target.address alors undo (on efface)

elle est pas belle la vie ;)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
j'ai ajouté le undo sur target modifiée par erreur
Je pense mettre mal exprimé. Je pensais que seules les cellules bleues devaient déclencher la macro.
Or dans vos exemples la macro est activée si je valide la cellule I2.
connais tu la différence entre une combinaison de if/elseif et un select case
Perso, j'utilise l'un ou l'autre suivant le contexte. J'essaie toujours de privilégier la lisibilité et la maintenance.
 

patricktoulon

XLDnaute Barbatruc
re oui dans n'importe quel cas un if/elseif ou uncase on arrive toujour au resultat


pour en revenir a "I" oui je n'ai pas mis de controle autant pour moi comme c'est sensé etre la premiere colonne tapée je te fait ca

pour en revenir au if/elseif la différence c'est que le case des qu'il a trouvé une correspondance il zappe le reste
tandis que le if/elseif observe toute les conditions même si il a déjà trouvé une correspondance
voir meme et c'est la que le choix du case ou if entre en jeux c'est quand plusieurs condition pourraient être juste et malheureusement avec if/elseif c'est la dernière trouvée qui serait serait celle choisi par vba alors que ce n'est pas forcement la dernière que tu aurait souhaité

je t'ai mis le controle en "I" aussi
j'ai rendu plus lisible le code et je l'ai commenté
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cel As Range, x&
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Select Case Target.Column
    Case 9: 'case colonne"I"
    x = Abs(Target.Row = 1 Or Target.Row - 1 Mod 4 = 0) 'controle si on est en ligne 1 ou en ligne-1 mod 4 donc x = 0 ou 1
    Set cel = Target.Offset(3 * x, -4 * x) 'si  en colonne "J"
   
    Case 5 'case colonne"E"
    x = Abs(Target.Row Mod 4 = 0) 'ici c'est simple controle si la ligne est  mod 4 =0 (donc x = 0 ou 1)
    Set cel = Target.Offset(-3 * x, -1 * x)    ' si en colonne "E"
   
    Case 4 'case colonne"D"
    x = Abs(Target.Offset(3, 1) <> "") 'ici on control si la "E" precedente est celle qui lui est jumellée est remplie  donc x = 0 ou 1
    Set cel = Target.Offset(4 * x, 5 * x)    ' si en colonne"D"
   
    Case Else: Set cel = ActiveCell    ' ici si autre colonne  on laisse excel faire et cel devient la target
   
    End Select
    If cel.Address = Target.Address Then Application.Undo 'si cel est la target alors on annule la frappe dans la cellule
    cel.Select
    Application.EnableEvents = True
End Sub
et tu peux mettre autant de case que tu veux
en fait c'est une saisie de droite à gauche
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
pour en revenir au if/elseif la différence c'est que le case des qu'il a trouvé une correspondance il zappe le reste
tandis que le if/elseif observe toute les conditions même si il a déjà trouvé une correspondance
Pas d'accord. Quand le ElseIf a trouvé la bonne condition il zappe le reste.
20230309_102103.gif

Ensuite j'ai fait des mesures de temps entre un case avec de nombreux cas, et un elseif dans la même configuration. Ca prends globalement le même temps.
 

patricktoulon

XLDnaute Barbatruc
oui il faudra que je fasse des mesures
la différence dans 2007 était du simple au double maintenant je ne sais pas

par contre le if/elseif je suis surpris sur 2007 c'était le contraire
d'ailleurs je ne sais plus si c'est sur XLD ou développez.com j'avais suivi et participé a une discussion qui mettait en évidence ce problème ainsi que l’utilisation du doubleif "IIF(machin,chose,truc)"

peut etre effectivement cela à été corrigé
 

patricktoulon

XLDnaute Barbatruc
heu.. ben non ca n'a pas été corigé
exemple
ici les 3 conditions son juste si on veut la plus proche on est mort
VB:
Sub test2()
    Dim x&, temoins&
    x = 11
    If x < 15 Then
        y = "toto"
        temoins = 1
    ElseIf x < 14 Then
        y = "titi"
        temoins = 2
    ElseIf x < 12 Then
        y = "riri"
        temoins = 3
    End If
    MsgBox "on est allé jusqu'au temoins " & temoins & " et y vaut " & y
End Sub
je me disais aussi ça serait trop beau
 

Discussions similaires

Réponses
6
Affichages
599

Statistiques des forums

Discussions
315 134
Messages
2 116 610
Membres
112 807
dernier inscrit
g.udry