VBA Excel每次打开工作簿时都可以生成运行的字母数字吗?

时间:2017-05-19 02:30:49

标签: excel vba excel-vba

我最近在我的表格上制作了一个随机的8位数ID生成器。但我建议创建一个运行的字母数字而不是8位随机数字生成器.. 我当前使用的文件是一个保存的模板供我发送给用户。所以我想知道每次打开文件时是否有可能有一个正在运行的字母数字。我只是想不出任何方式“存储一个主单元格,它可以保持前一代码+1”,因为这个模板不是每次打开时保存,而是发送给其他用户..

或者,无论如何,文件可以在我的数据库中检查下一个要发送的号码并在表单上生成它?感谢..

这是目前8位数发生器

的内容
Private Sub Workbook_Open()
    ' Called every time you open the excel document

    Dim myRandNumber As Long
    Randomize
    myRandNumber = CLng(Rnd() * 99999999)    ' CLng converts the floating point number to a long integer

    Dim rowNum As Integer
    Dim colNum As Integer
    rowNum = 6
    colNum = 4

    With ThisWorkbook.Sheets(MySheetName).Cells(rowNum, colNum)
    If (.Value = "") Then
    .Value = myRandNumber
End If
End With
End Sub

3 个答案:

答案 0 :(得分:0)

只需将数字或随机数映射到字符,例如Chr(65)"A"等等。所以大写字母的范围是65-90(英语/拉丁语没有变音符号)

最简单的是,这会给出一个随机的字母(当然,考虑到Excel / VBA随机性的限制):

Chr(WorksheetFunction.RandBetween(65,90))

数字的范围是48-57。

因此,开发一个简单的算法,选择每个是数字还是字符,然后使用Chr函数进行分配,然后加入它们。

  

我无法想到任何方式“存储一个主单元格,它可以保留前一代码的+1”

将其存储在隐藏工作表的Name或单元格中。

  

或者,无论如何,文件可以在我的数据库中检查下一个要发送的号码并在表单上生成它?

可能,是的,但问题太广泛了。您可以使用多种方法(如this)使用VBA连接到数据库,或者查看here以获取更多可能性。这将需要更强大的编码和错误处理 - 如果用户无法连接到数据库,不在网络上等,会发生什么......

答案 1 :(得分:0)

您可以通过创建像

这样的用户定义函数来完成此操作
username.github.io/repository

应该被称为,

Function createCode(codelength As Integer) As String
  Dim x As Integer, iTemp As Integer
  Dim strTemp As String
  Dim i As Integer
  Do Until i = codelength

    iTemp = Int(Rnd * 99)
    If iTemp >= 65 And iTemp <= 90 Then
    strTemp = strTemp & Chr(iTemp)
    i = i + 1
    ElseIf iTemp >= 97 And iTemp <= 122 Then
    strTemp = strTemp & Chr(iTemp)
    i = i + 1
    ElseIf iTemp >= 48 And iTemp <= 57 Then
    strTemp = strTemp & Chr(iTemp)
    i = i + 1
    End If
  Loop
  createCode = strTemp
End Function

答案 2 :(得分:0)

我打算将此作为答案发布,因为它是(恕我直言)问题的最佳答案,即使它不是问题的最佳答案< /强>

使用 GUID

这意味着您几乎肯定会保证在生成的ID之间不会发生冲突(除非您有数十亿用户多年来每秒打开一次工作簿副本),并且在Excel中很容易做到:

Private Sub Workbook_Open()
    'Update sheet name and range address as appropriate
    With ThisWorkbook.Sheets("Sheet1").Range("D6")
        If IsEmpty(.Value) Then
            .Value = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
        End If
    End With
End Sub