Comment insérer l'heure dans une plage de feuille Excel qui ne devrait pas être mise à jour automatiquement à l'aide de l'objet com dans autohotkey?

0

Je veux insérer du temps dans une plage qui ne devrait pas être mise à jour automatiquement. Par exemple, s'il existe une valeur dans la cellule n ° k5, l'heure actuelle doit automatiquement être insérée dans la cellule n5. De même, s’il existe une valeur dans k6, l’heure actuelle doit être automatiquement insérée dans N6, etc. Un dernier point que je voudrais apporter à votre aimable remarque qu’il existe également une formule dans la colonne K entière, donc Si je tape toute valeur dans une cellule de la colonne K indique le résultat calculé dans la cellule correspondante (colonne K). De plus, l'heure ne devrait pas être mise à jour automatiquement. J'ai essayé d'utiliser cette formule

= IF (K5 <0, "", IF (K5 = 0, "", NOW ()))

Cette formule fonctionne mais met à jour automatiquement l'heure avec l'horloge du système. Je veux qu'il ne faut pas mettre à jour l'heure. Vous pouvez aussi voir l'instantané:

entrez la description de l'image ici

De l'aide?

ramji
la source
Dans Excel sur Mac, le point-virgule de commande insère l’heure actuelle sous forme de valeur statique. Par conséquent, il est clair que Windows Excel est similaire à une frappe similaire. Sinon, vous pouvez en ajouter une avec la personnalisation du menu et de la frappe.
Blm
Vous avez posé la même question la veille et reçu une réponse il y a plusieurs semaines. L'étudiant de Gary a passé beaucoup de temps à développer et personnaliser une solution pour vous, et vous ne l'avez même pas invitée à voter. JJohnston2 a évidemment passé un temps considérable à élaborer une autre réponse pour vous ici, et vous n'avez même pas voté pour cette réponse. D'après vos commentaires, il semble que vous ne possédiez pas les connaissances nécessaires pour mettre en œuvre le type de solution requis. Vous former à VBA n'entre pas dans le cadre d'une question ou d'une réponse. Les gens vont cesser de répondre à vos questions si vous abusez de leur temps de cette façon.
fixer1234

Réponses:

0

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.

  1. Il est conçu pour insérer la date, pas l'heure ... facile à changer
  2. Il est conçu pour déclencher sur plusieurs colonnes, pas seulement une colonne.
  3. 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 Kni 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 Kou Ncolonne 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.Matchcode 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
JJohnston2
la source
merci cher @ JJohnston2 pour votre aimable réponse. Pourriez-vous s'il vous plaît dites-moi comment définir les codes en fonction de mes besoins, car je suis novice dans les codes vba. Aidez-moi, s'il vous plaît.
Ramji