我有一张用来盘点的纸。我们使用信函成本代码,员工在扫描项目时输入该代码。详情如下。B-1,L-2,A3,C-4,K-5,R-6,O-7,U-8,G-9,E-0
我试图使这些字母,但输入(即,UUC)显示其相应的号码(884)在一个单独的列。这是我写的,但要不断地得到错误的答案。
=if(I586="B",1,if(I586="L",2,if(I586="A",3,if(I586="C",4,if(I586="K",5,if(I586="R",6,if(I586="O",7,if(I586="U",8,if(I586="G",9,if(I586="E",0,))))))))))
发布于 2021-07-12 00:25:48
在海报的电子表格中,第一列的标题后面跟着以下四种输入类型之一:
·货币格式的数字(小数点2位)
文本字符串"NA“或"N/A”以任何一种形式出现
*文章中描述的包含有限字母代码的字符串
·空
根据我的理解,海报需要代码转换成美元和美分的货币(例如,UUC = 884 =8.84美元)。
基于此,我在这根柱子线上提供了以下解决方案:
首先,选择完整的L栏并删除其中的所有内容。
为了处理速度,总是最好保持您的纸张修整只满足您的需要。因此,我建议您下一步删除数据下面所有未占用且可能仍未占用的行。
然后,在L1中放置以下公式:
=ArrayFormula( {"HEADER OF CHOICE"; IF( (ISNUMBER(I2:I)) + (LEFT(I2:I)="N") + (I2:I=""), I2:I, VALUE( SUBSTITUTE( TRANSPOSE( QUERY( TRANSPOSE( ARRAY_CONSTRAIN( IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))), ROWS(I2:I), 10)),, 10)), " ", "")) / 100)} )
这个公式将创建标题(您可以在公式中随意更改)和所有列结果,说明您输入的"N/A“(也以”NA“的形式输入)、空格、货币和代码。
How它工作在
标题文本可以根据需要在公式中进行更改。
IF( (ISNUMBER(I2:I)) + (LEFT(I2:I)="N") + (I2:I=""), I2:I, ...
如果列-i输入是货币或以"N“开头的任何内容,请将其返回到L列(注意:"N”不在代码字母中,因此它只对"NA“或"N/A”文本字符串起作用)。
否则,从内到外工作..。
REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~")
这将将"X“的10次迭代附加到I2:I中的任何内容(就所有意图和目的而言,这些迭代都只是此时的代码),然后将整个新字符串替换为每个原始字符,后面跟着一个倾斜符,例如,UUC
将变成U~U~C~X~X~X~X~X~X~X~X~X~X~
。附加的"X“字符不是代码字母,因此这些字符将允许以后将每个字符串截断为偶数10个字符,而不管其原始长度如何;这种一致性在公式的稍后阶段是必要的。
SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~")
上面的字符串将是SPLIT
,用于在倾斜点分隔列。
SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE")
然后,每个字符都将按照值从1到10的顺序在代码字母的组合中进行SEARCH
编辑,即BLACKROUGE
,B
值为1,E
值为10。
RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))
如果不包括两位数的10,这一步可能已经被取消了.但是,由于我们有10 (在代码中值为0),我们只需从每个RIGHT
编辑位置获取SEARCH
单个字符。这将返回代码字母的值0-9 (或在“BLACKROUGE”中找不到的“X”字符的错误)。
IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE")))
IFERROR
将控制发生"X“的上述错误,将这些错误保留为空。
ARRAY_CONSTRAIN( IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))), ROWS(I2:I), 10)
在这里,我们看到了额外的“X”字符的原因,因为ARRAY_CONSTRAIN
现在可以提取一个统一的I2:I
行和10列数组。这10列数据中的每一列现在要么为0-9,要么为null。
TRANSPOSE( QUERY( TRANSPOSE( ARRAY_CONSTRAIN( IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))), ROWS(I2:I), 10)),, 10))
这是利用QUERY
函数的一个特性的标准“技巧”。也就是说,人们不仅需要选择0
或1
作为QUERY
的头数。这种函数组合,翻转由ARRAY-CONTRAIN
创建的数组,要求QUERY
不返回表数据,只返回10个标头(这将是我们在1-9和nulls上面创建的所有列数据),然后将其翻转回原来的方向。最终的结果是,所有的0-9和空字符将形成一行字符串,每个原始字符之间有空格。
SUBSTITUTE( TRANSPOSE( QUERY( TRANSPOSE( ARRAY_CONSTRAIN( IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))), ROWS(I2:I), 10)),, 10)), " ", "")
SUBSTITUTE
移除这些空格,每一行形成一个连续字符串。
VALUE( SUBSTITUTE( TRANSPOSE( QUERY( TRANSPOSE( ARRAY_CONSTRAIN( IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))), ROWS(I2:I), 10)),, 10)), " ", ""))
VALUE
将将这些数字字符串转换为实际的数值。
VALUE( SUBSTITUTE( TRANSPOSE( QUERY( TRANSPOSE( ARRAY_CONSTRAIN( IFERROR( RIGHT( SEARCH( SPLIT( REGEXREPLACE( I2:I & REPT("X", 10), "(.)", "$1~"), "~"), "BLACKROUGE"))), ROWS(I2:I), 10)),, 10)), " ", "")) / 100
/ 100
的添加将将这些数值转换为美元和美分。
https://webapps.stackexchange.com/questions/155527
复制相似问题