Я хочу вставить время в диапазон, который не должен обновляться автоматически. Например, если в ячейке № k5 есть какое-либо значение, то текущее время должно автоматически вставляться в ячейку № N5. Точно так же, если есть какое-либо значение в k6, то текущее время должно быть автоматически вставлено в N6, и так далее. Еще одна вещь, которую я хотел бы отметить в своем роде: во всем столбце K также есть формула, поэтому, если я введу любое значение в любой ячейке слева от столбца K, он покажет вычисленный результат в соответствующей ячейке (в столбце K). Более того, время не должно обновляться автоматически. Я пытался использовать эту формулу

= ЕСЛИ (К5 <0 "" ЕСЛИ (K5 = 0, "", сейчас ()))

Эта формула работает, но она автоматически обновляет время с помощью системных часов. Я хочу, чтобы это не обновляло время. Вы можете увидеть снимок также:

Любая помощь?

1 ответ1

0

Вы можете использовать com-объект в AutoHotkey, но я бы не рекомендовал делать это таким образом.

Если вы поместите макрос Worksheet_Change() в вашу электронную таблицу, Excel будет оценивать его каждый раз, когда вы вводите что-либо вручную (т. Е. Когда вы обновляете ячейку или меняете ее). Макрос получит объект Range из измененных ячеек, поэтому из объекта диапазона можно получить строку и столбец. Если столбец - это столбец, который вас интересует (в вашем случае, столбец K), тогда вы используете ту же строку и другой столбец (в вашем случае, столбец N) для вставки времени. Макрос Worksheet_Change() будет вызываться для всех обновлений электронных таблиц при каждом изменении ячейки, поэтому важно различать, какие столбцы вам нужны, поскольку подпрограмма также будет выполняться для любых обновлений столбцов, которые вас не интересуют.

Приведенный ниже пример кода должен легко адаптироваться. Он разработан с несколькими вариантами, которые вы можете удалить и адаптировать к вашей ситуации.

  1. Он предназначен для вставки даты, а не времени ... это легко изменить
  2. Он предназначен для запуска нескольких столбцов, а не только одного столбца
  3. Чтобы обеспечить гибкость при изменении структуры электронной таблицы или перемещении столбцов, она не жестко закодирована в конкретном столбце, то есть K или N

Описание пункта 3 в деталях:

  • Код не опирается на жестко закодированные значения адресов столбцов
  • Вместо этого он опирается на первую строку MyRange = Range("1:1") являющуюся строкой заголовка (которая также обычно выглядит хорошо)
  • Как только строка заголовка определена (т. Е. Жестко закодирована как строка 1), она находит заголовки столбцов, которые важны для запуска обновления.
  • После того, как он находит эти заголовки столбцов, он проверяет, была ли измененная ячейка в одном из этих столбцов.
  • Если ячейка была в одном из этих столбцов, то Дата вставляется

Эта настройка позволяет вам использовать помеченную строку заголовка в первой строке и перемещать столбцы позже по желанию (вставлять или удалять столбцы где угодно), при этом автоматическая вставка по-прежнему работает правильно, даже если интересующие вас ячейки больше не находятся на те же самые колонки K или N больше. Если вы не заботитесь об этом, конечно, вы можете просто оставить свою таблицу без заголовков, уберите WorksheetFunction.Match кода и использование жестко закодированных адресов столбцов.

Чтобы использовать этот код, откройте редактор VBA - как правило, слева будет дерево, показывающее VBAProject (имя файла) с подпапкой для объектов Microsoft Excel, а затем подпункты для каждого из трех листов (по умолчанию на новая рабочая тетрадь), а также ThisWorkbook. Дважды щелкните на листе, на котором вы хотите, чтобы он работал, а затем вставьте нижеприведенную функцию Worksheet_Change() чтобы вы могли использовать и редактировать ее для этого листа.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .