Voici du code permettant lors de l'appui sur des touches déterminées (modifiables dans la macro) de rentrer la valeur et de passer à la cellule suivante sans avoir à appuyer sur une autre touche (Entrée, Tab ou Flèche −>).
Si la valeur saisie est incorrecte, une boite de dialogue s'affiche et on revient automatiquement sur la cellule incriminée.
Pour que le "Listener" se déclenche, il faut ajouter des évènements sur la feuille via un clic droit sur son onglet.
Code : Tout sélectionner
REM ***** BASIC *****
' Macro permettant dans une zone déterminée, d'aller automatiquement
' à la cellule suivante lors de l'appui de touches précises
' Ici touche 0, 1, 9, a ou A (évite d'avoir à appuyer sur la touche Entrée)
global oKeyHandler as object
Sub AddKeyHandler
'Macro à associer à l'évènement "Activation" de la feuille
oKeyHandler = CreateUnoListener("KeyHandler_","com.sun.star.awt.XKeyHandler")
thisComponent.currentController.addKeyHandler(oKeyHandler)
'Print "Listener On"
End Sub
Sub RemoveKeyHandler
'Macro à associer à l'évènement "Désactivation" de la feuille
On Error Resume Next
thisComponent.currentController.removeKeyHandler(oKeyHandler)
'Print "Listener Off"
End Sub
Sub KeyHandler_disposing
End Sub
Function KeyHandler_keyPressed(oKeyEvent as new com.sun.star.awt.KeyHandler) As Boolean
'KeyHandler_keyPressed = false
cellule=thisComponent.CurrentSelection
If cellule.supportsService("com.sun.star.table.Cell") Then
Select Case oKeyEvent.keyChar
Case "A","a","0","1","9":
KeyHandler_keyPressed = false
Case Else:
KeyHandler_keyPressed = false
End Select
Else
KeyHandler_keyPressed = false
End If
End Function
Function KeyHandler_keyReleased(oKeyEvent as new com.sun.star.awt.KeyHandler) As Boolean
KeyHandler_keyReleased = False
maFeuille=thisComponent.CurrentController.ActiveSheet
zoneEcoute=maFeuille.getCellRangeByName("B5:S9").RangeAddress
LigDeb=zoneEcoute.StartRow
ColDeb=zoneEcoute.StartColumn
LigFin=zoneEcoute.EndRow
ColFin=zoneEcoute.EndColumn
cellule=thisComponent.CurrentSelection
'xray oKeyEvent
If cellule.supportsService("com.sun.star.table.Cell") Then
adresseCellule=cellule.CellAddress
lig=adresseCellule.Row
col=adresseCellule.Column
If lig>=LigDeb And lig<=LigFin And col>=ColDeb And col<=ColFin Then
'KeyHandler_keyReleased = False
cellule=maFeuille.getCellByPosition(col+1,lig)
Select Case oKeyEvent.keyChar
Case "A","a","0","1","9":
thisComponent.currentController.Select(cellule)
Case Else:
thisComponent.currentController.Select(cellule)
cellule=maFeuille.getCellByPosition(col,lig)
eval=cellule.String
Select Case eval
Case "A","a","0","1","9":
' N'efface pas la case si elle contient une valeur
Case Else:
cellule.String=""
MsgBox "Erreur" 'Affichage Erreur
End Select
thisComponent.currentController.Select(cellule)
End Select
End If
End If
End Function
Thierry