Vous pouvez utiliser un objet com dans AutoHotkey mais je ne recommanderais pas de le faire de cette façon.
Si vous placez une Worksheet_Change()
macro dans votre feuille de calcul, Excel l’évalue chaque fois que vous saisissez manuellement un élément (c’est-à-dire lorsque vous mettez à jour une cellule ou que vous le modifiez). La macro recevra l'objet Range de la ou des cellules modifiées, de sorte que vous pouvez obtenir la ligne et la colonne à partir de l'objet Range. Si la colonne est une colonne qui vous tient à cœur (dans votre cas, colonne K
), vous utilisez la même ligne et une colonne différente (dans votre cas, colonne N
) pour insérer l'heure. La Worksheet_Change()
macro sera appelée pour toutes les mises à jour de la feuille de calcul chaque fois qu'une cellule est modifiée. Il est donc important de distinguer les colonnes qui vous intéressent, car la routine sera également exécutée pour toutes les mises à jour des colonnes qui ne vous intéressent pas.
L'exemple de code ci-dessous devrait être facile à adapter. Il est conçu avec quelques variantes que vous pouvez supprimer et adapter à votre situation.
- Il est conçu pour insérer la date, pas l'heure ... facile à changer
- Il est conçu pour déclencher sur plusieurs colonnes, pas seulement une colonne.
- Pour permettre une modification de la conception de la feuille de calcul ou du déplacement des colonnes, la feuille de calcul n'est pas codée en dur dans une colonne particulière, c'est-à-dire
K
ni N
.
Description de l'article 3 en détail:
- Le code ne repose pas sur des valeurs d'adresse de colonne codées en dur
- Au lieu de cela, la première ligne
MyRange = Range("1:1")
est une ligne d'en-tête (ce qui est généralement joli aussi)
- Une fois que la ligne d'en-tête est définie (c'est-à-dire codée en dur en tant que ligne
1
), il trouve ensuite les en-têtes de colonne qui sont importants pour déclencher une mise à jour.
- Après avoir trouvé ces en-têtes de colonnes, il vérifie si la cellule qui a changé était dans l'une de ces colonnes.
- Si la cellule était dans l'une de ces colonnes, la date est insérée
Cette configuration vous permet d’utiliser une ligne d’en-tête étiquetée dans la première ligne et de déplacer les colonnes plus tard librement (insérer ou supprimer des colonnes où que vous soyez), tout en maintenant le bon fonctionnement de l’insertion automatique même si les cellules qui vous intéressent ne se trouvent plus au bon endroit. emplacement identique K
ou N
colonne plus longtemps. Si vous ne vous en souciez pas, vous pouvez bien sûr laisser votre feuille de calcul sans en-têtes, effacer le WorksheetFunction.Match
code et utiliser des adresses de colonne codées en dur.
Pour utiliser ce code, ouvrez l’éditeur VBA - il y aura généralement une arborescence à gauche affichant VBAProject (Nom du fichier) avec un sous-dossier pour les objets Microsoft Excel, puis des sous-éléments pour chacune des trois feuilles ( nouveau classeur) ainsi que ThisWorkbook. Double-cliquez sur la feuille sur laquelle vous souhaitez travailler, puis insérez la Worksheet_Change()
fonction ci-dessous pour pouvoir l'utiliser et la modifier pour cette feuille.
Private Sub Worksheet_Change(ByVal Target As Range)
'Do nothing if more than one cell is changed or content deleted
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
'Debug.Print Time
MyRange = Range("1:1")
TotalColumn = Application.WorksheetFunction.Match("Total", MyRange, 0) 'exact match, row 1
ProjectColumn = Application.WorksheetFunction.Match("Project", MyRange, 0) 'exact match, row 1
DescriptionColumn = Application.WorksheetFunction.Match("Description", MyRange, 0) 'exact match, row 1
If Target.Column = TotalColumn Then ' If Total gets updated, then update the Total change date
DateColumn = Application.WorksheetFunction.Match("Date Last Total Change", MyRange, 0) 'exact match, row 1
'MsgBox DateColumn
' ------------------------------------------------
' EnableEvents not required, but keeps this routine from being called again
' ------------------------------------------------
Application.EnableEvents = False
'Update field with Date of last update
ActiveSheet.Cells(Target.Row, DateColumn).Value = Date
Application.EnableEvents = True ' re-enable events
' ------------------------------------------------
End If
If (Target.Column = TotalColumn) Or (Target.Column = ProjectColumn) Or (Target.Column = DescriptionColumn) Then
DateColumn1 = Application.WorksheetFunction.Match("Date", MyRange, 0) 'exact match, row 1
' Update the open date if it's empty, otherwise leave it alone
If ActiveSheet.Cells(Target.Row, DateColumn1).Value = "" Then
ActiveSheet.Cells(Target.Row, DateColumn1).Value = Date
End If
End If
End Sub