【问题标题】:Random 8 digit Values generating with either VBA or Formula BUT copy and special paste over it to keep the value使用 VBA 或公式生成随机 8 位值,但复制并在其上特殊粘贴以保留该值
【发布时间】:2017-10-14 23:11:25
【问题描述】:

我对 Excel VBA 和公式很陌生,但我需要在我创建的表单上有一个带有随机值的单元格,以便像唯一 ID 一样创建(我知道可能会有重复的数字,但它很苗条)发送给人们填写表格,但问题是如果我使用 RandBetween(00000000,99999999),隐藏和取消隐藏只是继续激活公式,如果我要发送,我很难跟踪这个模板供其他人填写。那么,当我有公式并且用户打开 Excel 表单时,有什么方法会随机化一个 8 位数字并复制和特殊粘贴覆盖它的值以冻结值。 (也欢迎其他方式,提前谢谢大家)

【问题讨论】:

  • 是的,有办法。 几种方法。这么多方式,这个问题对于这个网站来说太宽泛了。尝试一些东西,查找如何实现一些你想要它做的事情。当您遇到障碍(特定编程问题)并且在此站点上找不到任何可以帮助您的东西时,那么您就有了一个可以回答的 SO 问题。请参阅How to Ask 了解更多信息。
  • 但这已经是我的障碍了,我无法让它记录表单上的第一个随机数字并复制粘贴它,这样当用户将其发回给我时,我就可以冻结8 位 ID @Mat's Mug
  • 说到record,你试过macro recorder吗? 记录自己的复制和粘贴,查看为您的每个操作生成的代码。根据需要调整它,并确保您 read this 删除所有 .Select.Activate 正在进行的操作。
  • This 问题(和答案)应该能让你有所收获。
  • 当然,如果您想几乎绝对、肯定、肯定地保证唯一的 id,您可以使用 Left(CreateObject("Scriptlet.TypeLib").GUID, 38) 返回 Windows 用来唯一标识事物的那种 ID。 (Universally unique identifier)

标签: vba excel excel-formula formula


【解决方案1】:

我不确定您在这里实际尝试做什么,但如果您想生成一个随机数并将其值存储在一个单元格中,您可以在 VBA 的“ThisWorkbook”中使用此代码:

Option Explicit

Const MySheetName As String = "Sheet1"      ' Change this to your sheet name

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

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

    Dim rowNum As Integer
    Dim colNum As Integer
    rowNum = 3
    colNum = 5

    ThisWorkbook.Sheets(MySheetName).Cells(rowNum, colNum).Value = myRandNumber

End Sub

如果您想确保这个数字是唯一的,这可能是您真正想要做的,您可以将这些值存储在单独的隐藏工作表中,并在每次要生成新数字时检查这些值。

您也可以使用这行代码而不是随机数为数字加上时间戳:

ThisWorkbook.Sheets(MySheetName).Cells(rowNum, colNum).Value = CDbl(Now() * 100000)

这将根据系统时间每 1 秒创建一个新的唯一编号。

如果我理解正确,您想生成一次这个数字。我可以想到几种方法来做到这一点:

  1. 仅当单元格为空白时生成数字
  2. 在隐藏工作表中设置标志

在这两种情况下,如果您想再次生成数字,您只需清除包含数字的单元格(选项1)或清除工作表中的标志(选项2)

选项1可以通过替换上面这部分代码来完成:

ThisWorkbook.Sheets(MySheetName).Cells(rowNum, colNum).Value = myRandNumber

用这个:

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

希望对你有帮助

【讨论】:

  • 您好,Aspekt!我试过你的代码,它就像一个魅力!但奇怪的是,当我清除单元格并重新打开工作簿时,由于某种原因,它给出了相同的数字,即 705547511,知道为什么会这样吗?谢谢!
  • 啊,是的,你需要在使用 Rnd 之前调用 Randomize,否则它每次都会给你相同的一组值。我已经更新了答案以包含这个
  • 打开后只能执行一次吗?因为假设我将这个唯一编号保存到数据库中,几天后我要检查原始文件的记录,但是由于工作簿是打开的,它会生成另一组代码重写原始唯一编号,导致我无法匹配数据库中的代码,该代码从几天前与现在相比已获取唯一 ID,因为它重写了它所以很抱歉给您带来麻烦
  • 我想我明白你想要做什么。我已经通过检查该字段是否已填充来更新答案。这将确保该数字仅生成一次,并且不会被打开文档覆盖。
  • 天哪,它有效!非常感谢 Aspekt,不知道宏有那么强大,真的需要更多地了解它!再次感谢! PS:代码: With ThisWorkbook.Sheets(MySheetName).Cells(rowNum, colNum) If (.Value = "") Then .Value = myRandNumber End If 在最后一行缺少“End With” 以防人们偶然发现穿过这个帖子,和我的问题一样,呵呵,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多