Создать уникальный идентификатор книги из шаблона в 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 для имени текущего пользователя, но если вы хотите запросить пользователя, вместо этого эту часть можно легко заменить.
Дайте знать, если у вас появятся вопросы.