在 Excel 中,我尝试使用 vba UDF 在表中生成 UUID 列,但我只希望它在第一次调用时运行,以便它生成的 UUID 永远不会改变。
制作 UUID 很容易(从https://nolongerset.com/createguid/修改-编辑:添加了对单元格 A1 的检查,以便与下面@MGonet 的答案正常工作):
'These Declare lines go at the very top of the code module
#If VBA7 Then
Private Declare PtrSafe Function CoCreateGuid Lib "ole32" (id As Any) As Long
#Else
Private Declare Function CoCreateGuid Lib "ole32" (id As Any) As Long
#End If
' ----------------------------------------------------------------
' Procedure : CreateGUID
' Author : Dan ([email protected])
' Source : http://allapi.mentalis.org/apilist/CDB74B0DFA5C75B7C6AFE60D3295A96F.html
' Adapted by : Mike Wolfe
' Republished: https://nolongerset.com/createguid/
' Date : 8/5/2022
' ----------------------------------------------------------------
Private Function CreateGUID() As String
'Application.OnRepeat Text:="Paste Next Date", _
'Procedure:="Application.thisCell.Text"
If (Application.thisCell.Address <> "$A$1") Then
Const S_OK As Long = 0
Dim id(0 To 15) As Byte
Dim Cnt As Long, GUID As String
If CoCreateGuid(id(0)) = S_OK Then
For Cnt = 0 To 15
CreateGUID = CreateGUID & IIf(id(Cnt) < 16, "0", "") + Hex$(id(Cnt))
Next Cnt
CreateGUID = LCase(Left$(CreateGUID, 8) & "-" & _
Mid$(CreateGUID, 9, 4) & "-" & _
Mid$(CreateGUID, 13, 4) & "-" & _
Mid$(CreateGUID, 17, 4) & "-" & _
Right$(CreateGUID, 12))
Else
MsgBox "Error while creating GUID!"
End If
Else
CreateGUID = Application.thisCell.Text
End If
End Function
我想要的是将其包装在一个If
语句中以确定该函数是否已经被计算过。经过一番折腾后我尝试过:
Public Function CreateGUID() As String
If (Application.thisCell.Characters = "") Then
'Generate UUID
Else
CreateGUID = Application.thisCell.Value
End If
End Function
然而这似乎不起作用。我还尝试使用application.onrepeat进行修改,但这似乎也不起作用。是否有其他方法来确定公式是否已被评估?
我不知道你想在实践中如何使用这个公式。
如果您想将公式保留在单元格中,这使您可以复制带有公式的单元格,但是它们将包含相同的值,因此您需要激活它们才能获取新值。您可以使用 UDF 来实现此目的:
如果重新计算工作表,单元格内容保持不变,但是如果编辑单元格,则会生成新值。
如果您更喜欢一次性功能,可以尝试其他方法。在这种情况下,函数结果被替换为常量,因此它不会因重新计算而自动更改。但是每次你想生成一个新值时,你必须对单元格输入新的函数调用
=EOneCall()
这是两个函数的集合,因为我们的函数应该被间接调用。