从Excel中的模板生成工作簿唯一ID

时间:2013-08-01 11:25:12

标签: excel uniqueidentifier unique-id excel-template

在我的组织中,我们有一个Excel模板,所有员工都必须经常填写。该模板每年生成数百/数千个Excel文件(工作簿)。

为了组织起见,我迫切需要为每个文件都有一个唯一的ID(即该模板生成的每个工作簿的唯一ID)。

目前,我的想法是在工作簿的单元格中生成以下ID:

  

[用户] - [YYYYMMDD] - [HHMMSS]

其中:

  • user是一个字符串,表示将由用户填写的员工的用户名。所以这里没问题。
  • YYYYMMDD是年,月,日 连接
  • hhmmss是小时,分钟和秒连接

对于这个效果,我需要我的Excel模板自动填充一个包含YYYYMMDD-hhmmss信息的单元格以及生成的确切日期和时间。

一旦模板生成工作簿,就应该创建此信息,并且以后不能更改。所以这些应该是(受保护的)单元格中的值而不是公式(我猜)。

在搜索了很长时间后,我无法弄清楚如何做到这一点。我不确定是否需要它,但我不是VBA的主人。

2 个答案:

答案 0 :(得分:0)

以下是一些可用于获取身份的功能。如果你把它放在模板上的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功能仅用于格式化(因此您将获得7月7日而不是7等)。我还在这里添加了一些内容,将用户设置为当前用户名的windows环境变量,但是如果你想提交用户,那么这部分很容易被替换。

如果您有任何问题,请与我们联系。

答案 1 :(得分:0)

拥有日期/时间字段的想法很好....创建一个对此

的工作簿

enter image description here

将以下代码添加到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 ,这意味着它之前尚未保存;这样就无需在工作簿中保留时间戳单元格