【问题标题】:Problems with generating a unique ID in Excel worksheet在 Excel 工作表中生成唯一 ID 的问题
【发布时间】:2020-11-27 13:16:49
【问题描述】:

我有一个工作表 - 为用户数据输入创建, 我创建了一个独特的 SurveyCode (由行号+文件名组成):

这是我用来生成 SurveyCode 的公式:

      =CONCATENATE(ROW(Sheet1!A1),TRIM(LEFT(SUBSTITUTE(MID(CELL("filename",Sheet1!A1),
        FIND("[",CELL("filename",Sheet1!A1))+1,255),".xl",REPT(" ",255)),255)))

我从单独的 Sheet1 中获取 Row(),因为如果用户决定删除工作表中的一条记录,那么我的 SurveyCode 公式之一被破坏,我将看到 # REF! 错误,而不是 4ClientSatisfactionSurvey,例如

我更改后的公式将如下所示:

      =CONCATENATE(ROW(#REF!),TRIM(LEFT(SUBSTITUTE(MID(CELL("filename",Sheet1!A6),
         FIND("[",CELL("filename",Sheet1!A6))+1,255),".xl",REPT(" ",255)),255)))

使用 ROW(#REF!) 而不是 ROW(A4)

因此,我决定将 Row() 存储在单独的工作表中。即使用户决定删除记录,在这种情况下,我的 SurveyCode 仍将保留。

但我还有另一个问题 - 如果 - 在删除记录后,潜在用户将创建一条新记录 - 它不会是唯一的,但会重复我的 sheet1 中的前一个行号。

例如 - 如果客户从工作表中删除 4ClientSatisfactionSurvey 记录,然后添加新记录 - 新的 SurveyCode 将 = 7ClientSatisfactionSurvey 而不是 8ClientSatisfactionSurvey

我认为,我的问题出在公式的第一部分 - 我不确定如何正确生成 SurveyCode 的唯一“数字”部分。

请帮忙...

【问题讨论】:

  • 据我所知,没有办法在Excel中基于公式创建绝对安全的唯一ID方式,因为它可以修改/删除,导致一切失败。最好的方法是输入值。您应该考虑为此使用 VBA。

标签: excel auto-increment uniqueidentifier


【解决方案1】:

您想使用动态范围。

假设您的数据在 Sheet1 的 A 列中

单击“名称管理器”(功能区的“公式”选项卡) 点击“新建”

姓名:myRange 范围:Workbook 参考:=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!A:A),1)

这将创建一个在添加新数据或删除行时自动更改大小的范围。

您使用INDEX() 引用单元格,因此,在单独的工作表上 =INDEX(myRange,1) 是第一个单元格 =INDEX(myRange,ROW()) 是相应行中的任何单元格


注意:注意您的索引值并使用条件语句来捕获超出范围的错误


警告COUNTA() 只计算非空白单元格,如果有空行,则必须调整公式以计算它们


注意:您可以通过引用辅助单元格将范围固定为恒定的行数

示例:如果在 Sheet2!A1 中输入 20,并且 myRange 指的是 =OFFSET(Sheet1!$A$1,0,0,Sheet2!$A$1,1),那么 myRange 将始终为第 1-20 行,无论插入或删除行


话虽如此,设计良好的 VBA 解决方案将更加安全且易于使用。


【讨论】:

  • 试过但没用(我可能做错了什么)我的数据在 ClientSatisfactionForm (工作表名称),AC5 列 - 起始列 所以,根据您的帮助,我将您的公式修改为“ =OFFSET(ClientSatisfaction Form!$AC$5,0,0,COUNTA(ClientSatisfactionForm!AC:AC),1) " 然后,在单独的 Sheet2 上,我为第一个单元格创建了一个公式 - A1 = INDEX(myRange, Row(A1)) 出现错误- #价值?在我的主工作表 ClientSatisfactionForm 和 Sheet2 中
  • 我想知道是否有办法按照建议在 vba 中创建它...将尝试研究
  • @Hell-1931 您的公式看起来正确,请检查名称管理器以确保范围名称没有拼写错误。范围名称必须与公式中的名称匹配,在本例中为“myRange”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2011-12-24
  • 1970-01-01
  • 2012-03-21
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多