Excel 如何使用随机化使我的UDF成为非易失性的?

Excel 如何使用随机化使我的UDF成为非易失性的?,excel,vba,Excel,Vba,我正在尝试创建一个函数,为我创建随机ID 在Excel中使用时,ID列将填充为:=上限(CONCATENATE(左([@Group],4),RandomString(4))) 除非随机字符串中的长度输入(4)发生更改,否则我不希望公式的随机部分再次计算(我永远不会更改长度,因此它将是静态的)。唯一应该更改的字符是与(左([@Group],4)相关的字符 现在,当我更改组列中的任何单元格时,TaskID列中的所有单元格都会重新计算,因此应用程序volatile实际上没有足够的帮助 谢谢 Funct

我正在尝试创建一个函数,为我创建随机ID

在Excel中使用时,ID列将填充为:=上限(CONCATENATE(左([@Group],4),RandomString(4)))

除非随机字符串中的长度输入(4)发生更改,否则我不希望公式的随机部分再次计算(我永远不会更改长度,因此它将是静态的)。唯一应该更改的字符是与(左([@Group],4)相关的字符

现在,当我更改组列中的任何单元格时,TaskID列中的所有单元格都会重新计算,因此应用程序volatile实际上没有足够的帮助

谢谢

Function RandomString(Length As Integer)

Application.Volatile False

Dim CharacterBank As Variant
Dim x As Long
Dim str As String

'Test Length Input
  If Length < 1 Then
    MsgBox "Length variable must be greater than 0"
    Exit Function
  End If

CharacterBank = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
  "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", _
  "W", "X", "Y", "Z")
  

'Randomly Select Characters One-by-One

  For x = 1 To Length
    Randomize
    str = str & CharacterBank(Int((UBound(CharacterBank) - LBound(CharacterBank) + 1) * Rnd + LBound(CharacterBank)))
  Next x

'Output Randomly Generated String
  RandomString = str


End Function

函数随机字符串(长度为整数)
应用程序。易失性错误
作为变体的Dim CharacterBank
暗x等长
作为字符串的Dim str
'测试长度输入
如果长度小于1,则
MsgBox“长度变量必须大于0”
退出功能
如果结束
CharacterBank=数组(“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”_
“A”,“B”,“C”,“D”,“E”,“F”,“G”,“H”,“I”,“J”,“K”,“L”,“M”,“N”,“O”,“P”,“Q”,“R”,“S”,“T”,“U”,“V”_
“W”、“X”、“Y”、“Z”)
'逐个随机选择字符
对于x=1到长度
随机化
str=str&CharacterBank(Int((UBound(CharacterBank)-LBound(CharacterBank)+1)*Rnd+LBound(CharacterBank)))
下一个x
'输出随机生成的字符串
随机字符串=str
端函数

你永远不能依赖UDF而不重新计算,因此这种方法是行不通的。正如Tim所说。这不是一个好主意。使用工作表事件作为触发器。如单元格选择,如果target.value=“”,则“随机字符串”必须将值存储在某个地方。某些选项:1)静态变量(在工作簿关闭或重新打开后将无法生存)2)存储在另一个单元格中(UDF不能直接写入单元格,但有解决方法)3)注册表4)外部文件5)(我不确定UDF是否可以访问这些)感谢您的评论,基于这样的事实,我认为这不是一个好办法,我改为做了以下操作:=IF(C16=“”、UPPER(LEFT)([@Group],4)和TEXT(ROW)()-15,"000")))