在 Excel 工作表中生成唯一 ID 的问题
Problems with generating a unique ID in Excel worksheet
我有一个作品sheet - 为用户数据输入而创建,
我在其中创建了一个独特的 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(),因为如果用户决定删除工作中的一条记录sheet,那么我的 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() 存储在单独的 sheet 中。即使用户决定删除记录,在这种情况下我的调查代码仍将保留。
但我还有另一个问题 - 如果 - 在记录删除后,潜在用户将创建一个新记录 - 它不会是唯一的,但会重复我的 sheet1 中的前一个行号。
例如 - 如果客户从工作 sheet 中删除 4ClientSatisfactionSurvey 记录,然后将添加一条新记录 - 新的调查代码将 = 7ClientSatisfactionSurvey 而不是 8ClientSatisfactionSurvey
我想,我的问题出在公式的第一部分 - 我不确定如何正确生成 SurveyCode 的唯一“数字”部分。
求求你帮忙...
您想使用动态范围。
假设您的数据在工作表 1 的 A 列中
单击“名称管理器”(功能区的“公式”选项卡)
单击“新建”
姓名:myRange
范围:Workbook
参考:=OFFSET(Sheet1!$A,0,0,COUNTA(Sheet1!A:A),1)
这将创建一个范围,该范围会在添加新数据或删除行时自动更改大小。
您使用 INDEX()
引用单元格,因此,在单独的 sheet
=INDEX(myRange,1)
是第一个单元格
=INDEX(myRange,ROW())
是相应行中的任何单元格
注意:注意您的索引值并使用条件语句来捕获超出范围的错误
警告:COUNTA()
只计算 non-blank 个单元格,如果有空行则必须调整公式以计算它们
注意:您可以通过引用辅助单元格
将范围固定为固定行数
示例:如果在 Sheet2!A1
中输入 20,并且 myRange
指的是 =OFFSET(Sheet1!$A,0,0,Sheet2!$A,1)
,那么 myRange
将始终是行1-20,无论插入或删除行
综上所述,设计良好的 VBA 解决方案将更安全且更易于使用。
我有一个作品sheet - 为用户数据输入而创建,
我在其中创建了一个独特的 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(),因为如果用户决定删除工作中的一条记录sheet,那么我的 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() 存储在单独的 sheet 中。即使用户决定删除记录,在这种情况下我的调查代码仍将保留。
但我还有另一个问题 - 如果 - 在记录删除后,潜在用户将创建一个新记录 - 它不会是唯一的,但会重复我的 sheet1 中的前一个行号。
例如 - 如果客户从工作 sheet 中删除 4ClientSatisfactionSurvey 记录,然后将添加一条新记录 - 新的调查代码将 = 7ClientSatisfactionSurvey 而不是 8ClientSatisfactionSurvey
我想,我的问题出在公式的第一部分 - 我不确定如何正确生成 SurveyCode 的唯一“数字”部分。
求求你帮忙...
您想使用动态范围。
假设您的数据在工作表 1 的 A 列中
单击“名称管理器”(功能区的“公式”选项卡) 单击“新建”
姓名:myRange
范围:Workbook
参考:=OFFSET(Sheet1!$A,0,0,COUNTA(Sheet1!A:A),1)
这将创建一个范围,该范围会在添加新数据或删除行时自动更改大小。
您使用 INDEX()
引用单元格,因此,在单独的 sheet
=INDEX(myRange,1)
是第一个单元格
=INDEX(myRange,ROW())
是相应行中的任何单元格
注意:注意您的索引值并使用条件语句来捕获超出范围的错误
警告:COUNTA()
只计算 non-blank 个单元格,如果有空行则必须调整公式以计算它们
注意:您可以通过引用辅助单元格
将范围固定为固定行数示例:如果在 Sheet2!A1
中输入 20,并且 myRange
指的是 =OFFSET(Sheet1!$A,0,0,Sheet2!$A,1)
,那么 myRange
将始终是行1-20,无论插入或删除行
综上所述,设计良好的 VBA 解决方案将更安全且更易于使用。