如何通过VBA获取/设置Excel中单元格的唯一ID

Chr*_*ton 5 excel vba excel-vba

我希望为Excel数据表中的每个数据行设置/定义一个唯一的ID - 这样我可以在向前传递数据时使用它,并且当在其上面添加/删除行时它保持不变.

我的想法是使用Range的ID属性(msdn link)

所以,我有一个用户定义的函数(UDF),我放在每一行获取/设置ID,如下所示:

Dim gNextUniqueId As Integer

Public Function rbGetId(ticker As String)
    On Error GoTo rbGetId_Error
    Dim currCell As Range
    'tried using Application.Caller direct, but gives same error
    Set currCell = Range(Application.Caller.Address)
    If currCell.id = "" Then
        gNextUniqueId = gNextUniqueId + 1
        'this line fails no matter what value I set it to.
        currCell.id = Str(gNextUniqueId)
    End If
    rbGetId = ticker & currCell.id
    Exit Function

    rbGetId_Error:
    rbGetId = "!ERROR:" & Err.Description
End Function
Run Code Online (Sandbox Code Playgroud)

但这在提到的那条线路上失败了

"应用程序定义的或对象定义的错误"

我想也许它是UDF的那些限制之一,但如果我从带状按钮触发的代码中尝试它,我也会得到同样的错误...

关于如何保持一致id的任何其他建议 - 也许我应该通过我的功能区按钮填充单元格,找到没有ID的单元格并生成/设置那些单元格的值...

编辑:正如Ant想的那样,我保护了表单,但即使在未锁定的单元格中,它仍然会失败.取消保护工作表修复了问题....但我使用了"保护UserInterFaceOnly:= True"这应该允许我这样做.如果我在保护工作表时手动允许"编辑对象"它也可以工作,但我没有看到编程选项 - 我需要调用AutoOpen中的Protect功能来启用UserInterfaceOnly功能...

我想我需要在我的ID设置周围关闭/开启保护 - 假设可以在UDF中完成...它似乎不能,因为它不起作用 - 既不是ActiveSheet.unprotect也不是ActiveWorkbook.unprotect :(

提前致谢.克里斯

Chr*_*ton 0

我发现如果我使用“Protect DrawingObjects:=False”保护工作表,UDF 可以设置 Id。奇怪的。

感谢您对此提供的所有帮助。