根据日期和请求数创建唯一ID

时间:2016-02-16 17:26:13

标签: excel-vba excel-2007 public uniqueidentifier vba

我创建了一个电子表格(Excel 2007),可以在一年内跟踪订单。作为跟踪的一部分,我需要根据日期和一天到达的订单数生成唯一标识符。计数每天重置。

例如;

请求1 =日期:02/02/16 - > ID#20160202-01

要求2 =日期:02/02/16 - > ID#20160202-02

要求3 =日期:02/03/16 - > ID#20160202-01

由于业务性质,订单以电子邮件格式到达,然后通过用户表单输入电子表格。在此userform中,如果请求的日期与上一个条目匹配,我已尝试使用If..Then语句来递增变量(n)。这是有效的,但每当表单运行时(n)的值都会重置,这意味着我可以得到的最大值是2.

我认为解决方法在于制作(n)全局/公共变量,但我不知道如何通过userform访问公共变量。有没有人有任何建议或良好的参考来解决这个问题?提前感谢您的帮助。

更新:感谢大家的快速反馈。我只是让一位同事停下来,一时兴起,问她是否对我有所帮助。她告诉我,静态变量将是解决这个问题的方法。这个修复有所帮助,但不是一个完美的解决方案。我将发布相关代码以显示已实施的修复。

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 & ""

新问题:如评论中所述,如果电子表格已关闭,则不会存储该变量。因此,如果订单在当天晚些时候进入,则重置计数,从而产生重复,导致整个事情变得混乱。此外,如果混合中存在非连续日期,则生成器不起作用。

2 个答案:

答案 0 :(得分:0)

为什么不使用工作表来存储计数器值?

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中的日期。

答案 1 :(得分:0)

在尝试了一些建议的想法后,包括将计数值存储在单元格和另一张表格中,我决定使用一个循环来搜索在同一天收到的订单。使用For ... Next循环,我遍历每个订单,如果日期与订单日期匹配,则count(n)更新为1。一旦循环播放,(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 & ""
相关问题