Excel基于级别生成基于公式的序列

时间:2013-12-19 17:20:36

标签: excel excel-vba excel-formula vba

我想要实现的是以下

 ID            Name       Level 
 1             ABC           1
 11            ABC           2
 11001         ABC           3
 1100101       ABC           4
 110010101     ABC           5
 11001010101   ABC           6
 11002         ABC           3
 1100201       ABC           4
 110020101     ABC           5
 11002010101   ABC           6
 11002010102   ABC           6
 110020102     ABC           5
 11002010201   ABC           6
 11002010202   ABC           6
 11002010203   ABC           6
 2             ABC           1
 21            ABC           2
 21001         ABC           3
 2100101       ABC           4
 210010101     ABC           5
 210010102     ABC           6
 21002         ABC           3    

我在excel中有以下代码来生成此代码,但我无法实现上述目标,任何人都可以帮助我,请在下面找到我正在使用的公式:

=CONCATENATE(COUNTIF($D$9:D18,1),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=1,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,2),COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=1,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,2),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=2,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,3),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=2,ROW(D9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,3),"000"),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=3,ROW(D9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,4),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=3,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,4),"00"),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=4,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,5),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=4,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,5),"00"),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=5,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,6),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=5,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,6),"00"),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=6,ROW(D9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,7),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=6,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,7),"00"),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=7,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,8),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=7,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,8),"00"),""),IF(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=8,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,9),TEXT(COUNTIF(INDIRECT("D"&MAX(IF(INDIRECT(ADDRESS(9,4)):INDIRECT(ADDRESS(ROW(),4))=8,ROW($D$9:INDIRECT(ADDRESS(ROW(),4))),0))):D18,9),"000"),""))

基本上我正在尝试自动生成ID字段中的代码,让我解释它是如何工作的:使用Level 1的Levels字段设置ID,它是它所代表的ID字段中的第一个数字,对于Level 2,它是3级的第2位,2位后的3位,以及每级的2位数。此外,一旦分配了1级,它就不能分配到另一个级别1,因此第二级1将给出下一个号码,其第一级2将具有1作为数字而第二级2将在其中给它2并且相同的去对于以下代码。

我的代码的问题是,它计算的值一直到第一级1及其下面的代码,但是当它下载代码时它的开始表现不正确,它不应该打印4,5,6的级别代码如果我生成3级,则更多。这些是我面临的一些问题

提前致谢

2 个答案:

答案 0 :(得分:2)

1放在A2

在单元格A3及以下,放置此公式:

=CHOOSE(C3,
LEFT(A2,1)+1,
IF(C2=1,A2*10+1,LEFT(A2,2)+1),
IF(C2=2,A2*1000+1,LEFT(A2,5)+1),
IF(C2=3,A2*100+1,LEFT(A2,7)+1),
IF(C2=4,A2*100+1,LEFT(A2,9)+1),
IF(C2=5,A2*100+1,LEFT(A1,11)+1))

答案 1 :(得分:1)

虽然我使用辅助列,但我可以这样做。它可以全部进入一个单元格,但它比我希望看到的公式更长

如果A列中有级别,您将计算B列中的小数ID和C列中的实际ID

单元格B2 = 1(因为该公式在该系列的第一个中不起作用)

B列中的其他单元格使用公式

=INDIRECT("B"&MAX(ROW($A$2:A2)*($A$2:A2<=A3)))+INDEX({1,0.1,0.0001,0.000001,0.00000001,0.0000000001},MATCH(A3,{1,2,3,4,5,6},0))

使用Ctrl + Shift + Enter

进入

此公式从最后一行中找到小于或等于其自身的十进制ID的值(间接部分)

索引查找级别并将正确的金额添加到公式第一部分中找到的值。

C列使用公式

=B2*10^IF(B2=INT(B2),0,LEN(B2)-FIND(".",B2))

通过查找小数点数(if语句)然后将10提高到该幂并乘以小数ID来将数字四舍五入为整数。

如果您确实需要在一个列中执行此操作,则可以在第二个公式中看到B2的任何位置粘贴整个第一列,但这会使公式完全难以理解。

enter image description here

戈登

第2部分

根据更多级别的要求,我不得不使用一种主要处理文本的不同技术。

我没有使用内置于公式中的数组,而是创建了一个单独的表,使其更容易处理,您可以使用命名范围,单独的图表引用它,或者只是将数字放在公式中,如果你想要的话

enter image description here

对于您输入Level和sigfigs的单元格。

保持的数字是从上面的水平减去1(M3=L2-1

的sigfigs

数字添加开始是上面级别(N3=L2

的sigfigs

数字从level - sigfigs增加length = sigfigs从+1以上的级别(`O3 = L3-L2 + 1)

对于实际索引公式,第一行的值再次为1,然后在单元格B3中使用

=LEFT(B2,INDEX($M$2:$M$12,MATCH(A3,$K$2:$K$12,0))) & MID(B2&"00000",INDEX($N$2:$N$12,MATCH(A3,$K$2:$K$12,0)),INDEX($O$2:$O$12,MATCH(A3,$K$2:$K$12,0)))+1

要打破这个

=LEFT(B2,INDEX($M$2:$M$12,MATCH(A3,$K$2:$K$12,0)))

表示将索引的左侧部分保留在上方。从数字保持列

中找出要保留的长度

MID(B2&"00000",INDEX($N$2:$N$12,MATCH(A3,$K$2:$K$12,0)),INDEX($O$2:$O$12,MATCH(A3,$K$2:$K$12,0)))+1

表示在末尾添加一堆零,这样您就可以使用比当前级别更高的级别。找到您需要开头的数字,以及您要使用的位数。将1加到此值。

&amp;他们之间的标志将它们连接在一起。