根据日期和请求数创建唯一 ID
Posted
技术标签:
【中文标题】根据日期和请求数创建唯一 ID【英文标题】:Creating Unique ID Based on Date, and Number of Requests 【发布时间】:2016-05-28 02:52:10 【问题描述】:我创建了一个电子表格 (Excel 2007),用于跟踪一年中的订单。作为跟踪的一部分,我需要根据日期和一天内到达的订单数量生成一个唯一标识符。计数每天都会重置。
例如;
请求 1= 日期:02/02/16 -> ID # 20160202-01
请求 2 = 日期:02/02/16 -> ID # 20160202-02
请求 3 = 日期:02/03/16 -> ID # 20160202-01
由于业务的性质,订单以电子邮件格式到达,然后通过用户表单输入到电子表格中。在这个用户表单中,如果请求的日期与前一个条目匹配,我尝试了一个 If..Then 语句来增加一个变量 (n)。这可行,但是每当运行表单时 (n) 的值都会重置,这意味着我可以获得的最大值是 2。
我相信解决方法在于使 (n) 成为全局/公共变量,但我不知道如何使用公共变量来通过用户窗体访问。有没有人有任何建议或很好的参考来解决这个问题?提前感谢您的帮助。
更新:感谢大家的快速反馈。我刚请了一位同事过来,一时兴起,问她是否有办法解决我的问题。她告诉我静态变量将是解决此问题的方法。此修复程序有所帮助,但不是完美的解决方案。我将为此发布相关代码以显示已实施的修复。
Sub CommandButtonSubmitClose_Click()
Static n As Integer
Dim ordDate As Date
Dim ordYear As Integer
Dim txtYear As String
Dim txtMonth As String
Dim txtDay As String
Dim txtCount As String
Dim IDnum As String
Dim prevRow As Long
Dim LastRow As Long, ws As Worksheet
'Define variables'
prevRow = LastRow - 1
txtYear = reqYear
txtMonth = Format(month(reqDate), "00")
txtDay = Format(day(reqDate), "00")
If ordDate = ws.Range("A" & prevRow).Value Then
n = n + 1
Else 'Determine daily count'
n = 1
End If
txtCount = Format(n, "00")
'Create ID Number'
IDnum = " " & txtYear & "" & txtMonth & "" & txtDay & "-" & txtCount & ""
新问题:如 cmets 中所述,如果电子表格关闭,则不会存储变量。因此,如果当天晚些时候有订单进来,计数就会被重置,从而产生重复,导致整个事情变得混乱。此外,如果混音中有不连续的日期,则生成器将无法工作。
【问题讨论】:
如果我们能看到您当前的相关代码,那就太好了,找到错误可能比重新发明代码更容易。 当电子表格关闭并重新打开时,您不能将值“存储”在变量中。数据是如何存储的?我们或许可以在此基础上找到一个简单的解决方案。 将计数存储在工作表上的单元格中,并让代码递增所述单元格。 【参考方案1】:为什么不用一张表来存储计数器值?
Sub CommandButtonSubmitClose_Click()
Dim r As Range
Dim txtCount As String
'Add 1 to the counter if the day is still the same,
Set r = ThisWorkbook.Sheets("Var_Sht").Range("A1")
If r.Value = Date Then
r.Offset(1, 0).Value = r.Offset(1, 0).Value + 1
Else
r.Value = Date
r.Offset(1, 0).Value = 1
End If
txtCount = r.Offset(1, 0).Value
'the other code in your procedure...
End Sub
显然您需要一个名为 Var_Sht
的工作表,但您可以将工作表设置为非常隐藏,这样您的用户就看不到它。
工作表将在 A1 中存储日期,在 A2 中存储每日计数器。当代码运行时,如果 A1 中的日期不等于 Date
函数,那么我们知道 A1 中的日期不是今天,所以我们重置计数器并更新 A1 中的日期。
【讨论】:
【参考方案2】:在尝试了一些建议后,包括将计数值存储在一个单元格和另一张工作表中,我决定使用一个循环来搜索在同一天收到的订单。使用 For...Next 循环,我遍历每个订单,如果日期与订单日期匹配,则计数 (n) 将更新一。循环播放完后,如上所述使用 (n)。如果没有找到其他值,则 (n) 设置为 1。 (n) 的值在循环之前重置为零。感谢大家的反馈,感谢您的帮助!
如果有人感兴趣,这里是修复代码:
n = 1
For i = 11 To LastRow
If ordDate = ws.Range("A" & i).Value Then
n = n + 1
End If
Next i
txtCount = Format(n, "00")
'Create ID Number'
IDnum = " " & txtYear & "" & txtMonth & "" & txtDay & "-" & txtCount & ""
【讨论】:
以上是关于根据日期和请求数创建唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章