Создать уникальный идентификатор книги из шаблона в Excel

В моей организации у нас есть шаблон Excel, который все сотрудники должны часто заполнять. Этот шаблон создает сотни / тысячи файлов Excel (рабочих книг) в год.

Ради организации мне срочно нужно иметь уникальный идентификатор для каждого из этих файлов (т. Е. Уникальный идентификатор для каждой книги, созданной этим шаблоном).

В настоящее время моя идея заключается в создании следующего идентификатора в ячейке рабочей книги:

[Пользователь]-[YYYYMMDD]-[ччммсс]

в котором:

  • user является строкой, представляющей имя пользователя сотрудника, которое будет заполнено пользователем. Так что нет проблем здесь.
  • YYYYMMDD год, месяц и день объединены
  • hhmmss час, минута и секунда соединены

Для этого мне нужно, чтобы мой шаблон Excel автоматически заполнял ячейку YYYYMMDD-hhmmss информация с точной датой и временем генерации.

Эта информация должна быть создана после того, как шаблон сгенерирует рабочую книгу, и не может быть изменена после этого. Так что это должны быть значения в (защищенной) ячейке, а не формула (я полагаю).

Я не могу понять, как это сделать после долгого поиска. Я не уверен, нужно ли это или нет, но я не мастер VBA.

2 ответа

Решение

Идея иметь поле даты / времени хороша... создайте рабочую книгу, смутную для этого

добавьте следующий код в модуль ThisWorkbook:

Private Sub Workbook_Open()
    If [B2] = "" Then
        ' timestamp
        [B2] = Now()

        ' suppress warning when saving macro containing workbook in non-macro format
        Application.DisplayAlerts = False

        ' save under calculated name
        ActiveWorkbook.SaveAs [B1] & "-" & Format([B2], "YYYYMMDD-hhmmss")

        ' turn on alerts again
        Application.DisplayAlerts = True
    End If
End Sub

и сохранить как макрос с включенным шаблоном

Затем создайте [File - New] из этого шаблона.... он будет сразу же сохранен под именем пользователя с удаленными макросами, чтобы код не мог попасть в него в другой раз.

Имя пользователя может быть получено из среды или из реестра.

В качестве альтернативы вы можете проверить, имеет ли файл истинное имя или (все еще) называется Book nnn, что означает, что он не был сохранен ранее; это устраняет необходимость резервировать ячейку метки времени в вашей книге

Вот несколько функций, которые вы можете использовать, чтобы получить свой идентификатор. Если вы поместите это в модуль vba в своем шаблоне, вы сможете вызывать функции из рабочих таблиц или другого кода vba (например, в рабочей книге просто введите '=get_id()', в vba вы бы сделали что-то вроде 'id = get_id()'чтобы назвать это:

Вариант Явный

Public Function lpad(string1, padded_length, _
                     Optional pad_string = " ")
    Dim chars

    chars = padded_length - Len(string1)
    lpad = WorksheetFunction.Rept(pad_string, chars) & string1

End Function

Public Function get_id()
    Dim user
    Dim YYYYMMDD
    Dim hhmmss

    user = Environ("username")
    YYYYMMDD = Year(Now()) & lpad(Month(Now()), 2, 0) & lpad(Day(Now()), 2, 0)
    hhmmss = lpad(Hour(Now()), 2, 0) & lpad(Minute(Now()), 2, 0) & lpad(Second(Now()), 2, 0)

    get_id = user & "-" & YYYYMMDD & "-" & hhmmss

End Function

Функция lpad предназначена только для форматирования (так что вы получите 07 за июль вместо 7 и т. Д.). Я также добавил кое-что, чтобы установить для пользователя переменную окружения Windows для имени текущего пользователя, но если вы хотите запросить пользователя, вместо этого эту часть можно легко заменить.

Дайте знать, если у вас появятся вопросы.

Другие вопросы по тегам