生成由数字/字母组成的唯一字符串
Generate a UNIQUE string made out of numeric / ALPHABET
我的问题
- 我什么都不知道VBA
- 需要生成 12 个字符的字符串(ALPHA + 数字,0-9,A-Z)IN VBA...
示例输出:
"ADF3V3224K1WQ"
(12 个字符长,大写字母,以及数值)。
故事
我很难搞清楚如何创建一个字符串生成器(没有说它必须是随机的,但它必须 100% 是唯一的,这意味着它必须检查重复或存储现有的值),我没有使用 VBA 的经验。我已经在这里找到了类似的 post,但它与我的不同,因为它没有特别要求字符串 100% 唯一。 (我不需要很低的几率,我需要的是全线100%)。
语法方面我很困惑,我设法找到事件背后的代码在哪里,即按钮按下,所以我知道我需要在哪里写它,但我不知道如何检查重复。 (即使依靠可以确保它 100% 唯一的时间种子也很棒)。
Link 类似于 post: MS Access Visual Basic - generate random string in text field
使用日期时间字符串:
公式:=TEXT(NOW(),"yymmddhhmmss")
-> 170705161201
VBA: Debug.Print Format(Now, "yymmddhhmmss")
这个问题有多种解决方案,但我喜欢这个:
Public Function newguidx() As String
With CreateObject("Scriptlet.TypeLib")
newguidx = Left(.Guid, 38)
End With
End Function
它创建了一个 GUID。这些本身并不是独一无二的,但您可以在维基百科页面上阅读它们也可能是独一无二的。如果需要,您可以使用 Replace
删除 {}-
符号。
此外,由于格式是标准化的,大多数程序员都清楚它是什么。
显然,您可以 trim 个字符来获得您想要的长度,这会增加您找到重复项的机会。
编辑:
遗憾的是,出于安全原因,目前默认阻止访问 Scriptlet.TypeLib
。有关生成 GUID 的多种方法的详细概述,请参阅 for information on that, and 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
好吧,我想如果它真的需要字母数字和唯一性,这就是要走的路:
这段代码根据当前时间生成一个随机字符串(就像@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()
不是很准确,理论上这会导致
问题
- 此代码与 OS X 不兼容,但如果您仅限于访问,那将不是问题(
Getmtimestring
将 return 零)
- 你真的应该和你的老板谈谈。在紧迫的期限内要求您做一些您并不真正胜任的事情,没有选择使用稍微其他的解决方案是不健康的工作场所行为。
- 该字符串包含编码时间,可以解码。如果你想保密字符串的创建时间,请不要报告它。
我的问题
- 我什么都不知道VBA
- 需要生成 12 个字符的字符串(ALPHA + 数字,0-9,A-Z)IN VBA...
示例输出:
"ADF3V3224K1WQ"
(12 个字符长,大写字母,以及数值)。
故事
我很难搞清楚如何创建一个字符串生成器(没有说它必须是随机的,但它必须 100% 是唯一的,这意味着它必须检查重复或存储现有的值),我没有使用 VBA 的经验。我已经在这里找到了类似的 post,但它与我的不同,因为它没有特别要求字符串 100% 唯一。 (我不需要很低的几率,我需要的是全线100%)。
语法方面我很困惑,我设法找到事件背后的代码在哪里,即按钮按下,所以我知道我需要在哪里写它,但我不知道如何检查重复。 (即使依靠可以确保它 100% 唯一的时间种子也很棒)。
Link 类似于 post: MS Access Visual Basic - generate random string in text field
使用日期时间字符串:
公式:
=TEXT(NOW(),"yymmddhhmmss")
-> 170705161201VBA:
Debug.Print Format(Now, "yymmddhhmmss")
这个问题有多种解决方案,但我喜欢这个:
Public Function newguidx() As String
With CreateObject("Scriptlet.TypeLib")
newguidx = Left(.Guid, 38)
End With
End Function
它创建了一个 GUID。这些本身并不是独一无二的,但您可以在维基百科页面上阅读它们也可能是独一无二的。如果需要,您可以使用 Replace
删除 {}-
符号。
此外,由于格式是标准化的,大多数程序员都清楚它是什么。
显然,您可以 trim 个字符来获得您想要的长度,这会增加您找到重复项的机会。
编辑:
遗憾的是,出于安全原因,目前默认阻止访问 Scriptlet.TypeLib
。有关生成 GUID 的多种方法的详细概述,请参阅
个人喜好:
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
好吧,我想如果它真的需要字母数字和唯一性,这就是要走的路:
这段代码根据当前时间生成一个随机字符串(就像@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()
不是很准确,理论上这会导致 问题- 此代码与 OS X 不兼容,但如果您仅限于访问,那将不是问题(
Getmtimestring
将 return 零) - 你真的应该和你的老板谈谈。在紧迫的期限内要求您做一些您并不真正胜任的事情,没有选择使用稍微其他的解决方案是不健康的工作场所行为。
- 该字符串包含编码时间,可以解码。如果你想保密字符串的创建时间,请不要报告它。