0

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

为了组织起见,我迫切需要为这些文件中的每一个文件设置一个唯一 ID(即此模板生成的每个工作簿的唯一 ID)。

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

[用户]-[YYYYMMDD]-[hhmmss]

其中:

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

为了达到这种效果,我需要我的 Excel 模板自动填充具有YYYYMMDD-hhmmss确切生成日期和时间的信息的单元格。

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

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

4

2 回答 2

0

这里有几个函数可以用来获取你的 id。如果你把它放在模板上的 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 月获得 07 而不是 7 等)。我还在此处添加了一些内容,将用户设置为当前用户名的 windows 环境变量,但如果您想提示用户,则可以轻松替换此部分。

如果您有任何问题,请告诉我。

于 2013-08-01T12:32:21.347 回答
0

拥有日期/时间字段的想法很好....创建一个与此类似的工作簿

在此处输入图像描述

将以下代码添加到 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,这意味着它之前没有保存过;这消除了在工作簿中保留时间戳单元格的需要

于 2013-08-01T12:57:35.667 回答