Vba 在文本字段中生成随机字符串
我们公司有一个使用Microsoft Access运行的旧软件(多年前由首批员工之一制作)。老板让我在点击时在特定的文本框中添加随机字符串生成,但我不知道怎么做。我没有任何Microsoft Access编程经验,所以我想请你帮忙 到目前为止,我设法创建了按钮和文本字段。这就是它停止的地方。我还设法访问了按钮操作的代码:Vba 在文本字段中生成随机字符串,vba,ms-access,Vba,Ms Access,我们公司有一个使用Microsoft Access运行的旧软件(多年前由首批员工之一制作)。老板让我在点击时在特定的文本框中添加随机字符串生成,但我不知道怎么做。我没有任何Microsoft Access编程经验,所以我想请你帮忙 到目前为止,我设法创建了按钮和文本字段。这就是它停止的地方。我还设法访问了按钮操作的代码: Private Sub command133_Click() End Sub 尝试此功能: Public Function GetRandomString(ByVal iL
Private Sub command133_Click()
End Sub
尝试此功能:
Public Function GetRandomString(ByVal iLength As Integer) As String
Dim sResult As String = ""
Dim rdm As New Random()
For i As Integer = 1 To iLength
sResult &= ChrW(rdm.Next(32, 126))
Next
Return sResult
End Function
这是一种方法,将在Access VBA(比vb.net旧的basic)中工作。它将生成一个包含字母和数字的字符串
Sub test()
Dim s As String * 8 'fixed length string with 8 characters
Dim n As Integer
Dim ch As Integer 'the character
For n = 1 To Len(s) 'don't hardcode the length twice
Do
ch = Rnd() * 127 'This could be more efficient.
'48 is '0', 57 is '9', 65 is 'A', 90 is 'Z', 97 is 'a', 122 is 'z'.
Loop While ch < 48 Or ch > 57 And ch < 65 Or ch > 90 And ch < 97 Or ch > 122
Mid(s, n, 1) = Chr(ch) 'bit more efficient than concatenation
Next
Debug.Print s
End Sub
子测试()
Dim s作为字符串*8'固定长度字符串,包含8个字符
作为整数的Dim n
Dim ch作为“整数”字符
对于n=1到Len(s),不要将长度硬编码两次
做
ch=Rnd()*127'这可能更有效。
'48是'0',57是'9',65是'A',90是'Z',97是'A',122是'Z'。
当ch<48或ch>57和ch<65或ch>90和ch<97或ch>122时循环
Mid(s,n,1)=Chr(ch)'比级联更有效
下一个
调试。打印s
端接头
在@Bathsheba代码上工作,我做到了。它将生成一个随机字符串,其中包含您想要的字符数
代码:
Public Function GenerateUniqueSequence(numberOfCharacters As Integer) As String
Dim random As String ' * 8 'fixed length string with 8 characters
Dim j As Integer
Dim ch As Integer ' each character
random = ""
For j = 1 To numberOfCharacters
random = random & GenerateRandomAlphaNumericCharacter
Next
GenerateUniqueSequence = random
End Function
Public Function GenerateRandomAlphaNumericCharacter() As String
'Numbers : 48 is '0', 57 is '9'
'LETTERS : 65 is 'A', 90 is 'Z'
'letters : 97 is 'a', 122 is 'z'
GenerateRandomAlphaNumericCharacter = ""
Dim i As Integer
Randomize
i = (Rnd() * 2) + 1 'One chance out of 3 to choose one of 3 catégories
Randomize
Select Case i
Case 1 'Numbers
GenerateRandomAlphaNumericCharacter = Chr(Rnd() * 9 + 48)
Case 2 'LETTERS
GenerateRandomAlphaNumericCharacter = Chr(Rnd() * 25 + 65)
Case 3 'letters
GenerateRandomAlphaNumericCharacter = Chr(Rnd() * 25 + 97)
End Select
End Function
我将其与随机数的字符一起使用,如下所示:
'Generates random Session ID between 15 and 30 alphanumeric characters
SessionID = GenerateUniqueSequence(Rnd * 15 + 15)
结果:
s8a8qWOmoDvC4jKRjPr5hOY12u 26
TB24qZ4cNfr6EdyY0J 18
6LZRQ9P5WHLNd71LIdqJ 20
KPN0RmlhhJKnVzPTkW 18
R2pNOKWJMKl9KpSoIV2egUNTEb1QC2 30
X8jHuupP6SvEI8Dt2wJi 20
注意:这仍然不是完全随机的。它将提供比正常更高的数字计数,因为生成的所有字符中约有1/3是数字
正态分布如下所示:
10个数字加26个小写加26个大写=62个可能的字符。
数字通常为字符串的10/62部分或1/6.2
使用代码
i=(Rnd()*2)+1'三分之一的机会从三个类别中选择一个
数字的计数被推高到1/3(平均值)
也许不太令人担心——除非你试图击败国家安全局,然后你的射程明显缩小 Q关于Access VBA,但不是VB.NETYes,但在提交此答案后编辑了标记。它将在vb.net中工作,所以+1。@Bathsheba字母和数字,比如8个字符长。您想要小写和大写字母吗?我给出的答案只适用于大写字母。@Bathsheba是的,也适用于小写字母+数字,如果不是太多的工作:)我已经修改:生成字母和数字now@Bathsheba谢谢:)将尝试了解它的工作原理并学习新的东西,而不仅仅是复制它。+1,作为替代,我将使用额外的rand值来确定generatech
的范围。想法来自这里:嗨,芭丝谢芭,只是一个反馈。我在Excel中测试代码的随机字符串长度为13个字符。在一百万行中,excel创建13826个重复字符串,只剩下986174个唯一字符串。在大多数情况下,它可能足够独特,但我认为Rnd()函数中存在缺陷。理论上,在62个字符和数字(0-9 a-z a-z)中随机选择13个字符和数字,应该有83亿个以上的唯一选择。因此,100万条记录中的14k条重复记录非常重要。有吗?谢谢你的代码。唯一随机是一个完全不同的要求。您是对的,Rnd()
的周期非常小。也许您应该在调用Rnd()之前添加Randomize