示例输出:
"ADF3V3224K1WQ"
(12个字符长,更高的字母数字字母和数字值)。
故事
我很难弄清楚如何创建一个字符串生成器(没有说它必须是随机的,但它必须是100%唯一的,这意味着它必须检查重复或存储现有值),我没有VBA经验。我已经在这里发现了一个类似的帖子,但它与我的不同,因为它没有特别要求字符串是100%唯一的。 (我不需要非常低的机会,我需要100%全面投入)。
语法方式我很困惑,我设法找到事件背后的代码,即按下按钮,所以我知道我需要写它的位置,但我不知道如何检查重复。 (甚至依靠时间种子可以确保它是100%独特的很棒)。
链接到类似帖子: MS Access Visual Basic - generate random string in text field
答案 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
注意:
Timer()
并不准确,理论上这可能会导致
问题Getmtimestring
将只返回零),那么这将不会成为问题。