Como inserir o Tempo em um intervalo da planilha do Excel que não deve atualizar automaticamente usando o objeto com no autocuidado?

0

Eu quero inserir o tempo em um intervalo que não deve ser atualizado automaticamente. Por exemplo, se houver algum valor na célula não k5, a hora atual deverá ser inserida automaticamente na célula, sem N5. Da mesma forma, se houver algum valor em k6, a hora atual deve ser inserida automaticamente em N6, e assim por diante. Só mais uma coisa. Gostaria de informar que há também uma fórmula na coluna inteira K, se eu digitar qualquer valor em qualquer célula deixada para a coluna K mostra o resultado calculado em sua célula correspondente (na coluna K). Além disso, o tempo não deve ser atualizado automaticamente. Eu tentei usar essa fórmula

= SE (K5 < 0, "", IF (K5 = 0, "", AGORA ()))

Esta fórmula está funcionando, mas atualiza automaticamente o horário com o relógio do sistema. Eu quero que não deve atualizar o tempo. Você pode ver o instantâneo também:

Alguma ajuda?

    
por ramji 18.10.2015 / 16:57

1 resposta

0

Você poderia usar um objeto com no AutoHotkey, mas eu não recomendaria fazer isso dessa maneira.

Se você colocar uma macro Worksheet_Change() em sua planilha, o Excel a avaliará sempre que você inserir algo manualmente (ou seja, quando você atualizar uma célula ou alterá-la). A macro receberá o objeto Range da (s) célula (s) modificada (s); portanto, a partir do objeto de intervalo, você pode obter a linha e a coluna. Se a coluna é uma coluna que você gosta (no seu caso, coluna K ), então você usa a mesma linha e uma coluna diferente (no seu caso, coluna N ) para inserir a hora. A macro Worksheet_Change() será chamada para todas as atualizações de planilha toda vez que uma célula for alterada, por isso é importante distinguir com quais colunas você se importa, pois a rotina também será executada para quaisquer atualizações nas colunas com as quais você não se importa também. / p>

O exemplo de código abaixo deve ser fácil para você se adaptar. Ele é projetado com algumas variações que você pode remover e adaptar à sua situação.

  1. Ele é projetado para inserir a data, não o horário ... que é fácil de alterar
  2. Ele é projetado para acionar várias colunas, não apenas uma coluna
  3. Para permitir flexibilidade no reprojeto da planilha ou movimentação de colunas, ela não é codificada para uma determinada coluna, por exemplo, K ou N .

Descrição do item 3 em detalhes:

  • O código não depende de valores de endereço de coluna codificados
  • Em vez disso, ele conta com a primeira linha MyRange = Range("1:1") sendo uma linha de cabeçalho (que geralmente também é legal)
  • Quando a linha do cabeçalho é definida (ou seja, codificada como linha 1 ), ela encontra os cabeçalhos da coluna que são importantes para acionar uma atualização
  • Depois de encontrar esses cabeçalhos de coluna, ele verifica se a célula que mudou estava em uma dessas colunas
  • Se a célula estava em uma dessas colunas, a data é inserida

Essa configuração permite usar uma linha de cabeçalho rotulada na primeira linha e mover as colunas mais tarde à vontade (inserir ou excluir colunas em qualquer lugar) e ainda ter a inserção automática funcionando corretamente, mesmo se as células de que você gosta não mais no mesmo K ou N localizações da coluna por mais tempo. Se você não se importar com isso, é claro, você pode simplesmente deixar sua planilha sem cabeçalhos, retirar o código WorksheetFunction.Match e usar endereços de coluna codificados.

Para usar este código, abra o editor do VBA - normalmente haverá uma árvore à esquerda mostrando VBAProject (Filename) com uma subpasta para Microsoft Excel Objects e sub-itens para cada uma das três folhas (por padrão em uma nova pasta de trabalho), bem como ThisWorkbook. Clique duas vezes na Planilha na qual deseja trabalhar e insira a função Worksheet_Change() abaixo para poder usá-la e editá-la para essa planilha.

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
    
por 19.10.2015 / 06:50

Tags