生成由数字/ ALPHABET

时间:2017-07-05 19:44:33

标签: vba ms-access access-vba ms-access-2016

我的问题

  • 我不知道任何VBA
  • 需要生成12个字符串(ALPHA +数字,0-9,A-Z) IN VBA ...
  • 示例输出:

    "ADF3V3224K1WQ"
    

    (12个字符长,更高的字母数字字母和数字值)。

故事

我很难弄清楚如何创建一个字符串生成器(没有说它必须是随机的,但它必须是100%唯一的,这意味着它必须检查重复或存储现有值),我没有VBA经验。我已经在这里发现了一个类似的帖子,但它与我的不同,因为它没有特别要求字符串是100%唯一的。 (我不需要非常低的机会,我需要100%全面投入)。

语法方式我很困惑,我设法找到事件背后的代码,即按下按钮,所以我知道我需要写它的位置,但我不知道如何检查重复。 (甚至依靠时间种子可以确保它是100%独特的很棒)。

链接到类似帖子: MS Access Visual Basic - generate random string in text field

3 个答案:

答案 0 :(得分:4)

这个问题有多种解决方案,但我喜欢这个:

Public Function newguidx() As String
    With CreateObject("Scriptlet.TypeLib")
        newguidx = Left(.Guid, 38)
    End With  
End Function

创建GUID。这些本身并不是唯一的,但您可以在维基百科页面上阅读它们可能也是如此。如果您愿意,可以使用Replace删除{}-标志。

此外,由于格式是标准化的,大多数程序员都清楚它是什么。

显然,你可以修剪角色以获得所需的长度,这将增加你找到重复的机会。

编辑:

不幸的是,由于安全原因,默认情况下目前会阻止对Scriptlet.TypeLib的访问。有关相关信息,请参阅MS Access VBA Error: Run time error '70' Permission Denied;有关生成GUID的多种方法的详细概述,请参阅How can I generate GUIDs in Excel?

我个人的偏好:

Public Function CreateGUID() As String
    Do While Len(CreateGUID) < 32
        If Len(CreateGUID) = 16 Then
            '17th character holds version information
            CreateGUID = CreateGUID & Hex$(8 + CInt(Rnd * 3))
        End If
        CreateGUID = CreateGUID & Hex$(CInt(Rnd * 15))
    Loop
    CreateGUID = "{" & Mid(CreateGUID, 1, 8) & "-" & Mid(CreateGUID, 9, 4) & "-" & Mid(CreateGUID, 13, 4) & "-" & Mid(CreateGUID, 17, 4) & "-" & Mid(CreateGUID, 21, 12) & "}"
End Function

答案 1 :(得分:2)

使用日期时间字符串:

  • 公式:=TEXT(NOW(),"yymmddhhmmss") - &gt; 170705161201

  • VBA:Debug.Print Format(Now, "yymmddhhmmss")

答案 2 :(得分:1)

嗯,我想如果它真的需要字母数字和唯一,这就是要走的路:

此代码根据当前时间生成一个随机字符串(如@ paul-bica的答案),只是按字母数字编码它们并使用计时器获得一秒的分数达到12个字符)。这样你就能够每秒生成多个随机字符串。

只需致电UniqueTimeBasedString()即可获取字符串。 (请注意,如果在查询中使用此函数,Access将缓存结果,并且根本不会是唯一的。)

Public Function UniqueTimeBasedString() As String
    Dim alphanumericCharacters As String
    alphanumericCharacters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim timeString As String
    timeString = Format(Now, "yymmddhhmmss") & Getmtimestring(6)
    Dim c As Integer
    Dim intTimepart As Integer
    c = 1
    Do While c < Len(timeString)
        intTimepart = CInt(Mid(timeString, c, 3))
        c = c + 3
        UniqueTimeBasedString = UniqueTimeBasedString & Mid(alphanumericCharacters, Int(intTimepart / 61) + 1, 1) & Mid(alphanumericCharacters, intTimepart Mod 61 + 1, 1)
    Loop
End Function

Public Function Getmtimestring(length As Integer) As String
    Dim mtime As Double
    mtime = Timer()
    Dim mtimeLng As Long
    mtimeLng = Int((mtime - Int(mtime)) * (10 ^ length))
    Getmtimestring = CStr(mtimeLng)
    Do While Len(Getmtimestring) < length
        Getmtimestring = "0" & Getmtimestring
    Loop
End Function

注意:

  1. Timer()并不准确,理论上这可能会导致 问题
  2. 此代码与OS X不兼容,但如果您仅限于Access(Getmtimestring将只返回零),那么这将不会成为问题。
  3. 你真的应该和老板谈谈。要求你做一些你没有真正有资格在紧迫的期限内完成任何事情,没有选择使用其他一些解决方案不是健康的工作场所行为。
  4. 该字符串包含编码时间,可以解码。如果您希望创建字符串的时间是秘密的,请不要报告。