假设你有一列数据在每个单元格中有一个文本字符串由逗号分隔的项目列表.类似于下面的表格。
你怎么能得到第n项从这个列表吗?一个解决办法是使用文本到列把每个列表分成不同的列,然后用指数函数在这些列。问题是,在这个过程中,你已经销毁了原始列表,现在它跨越了许多不同的列。一个更简单的解决方案可能是创建一个用户定义函数在VBA中。
函数INDEXLIST(strList As String, strSeparator As String, lngIndex As Long) As String Dim ListArray() As String ListArray() = Split(strList, strSeparator) INDEXLIST = ListArray(lngIndex - 1)结束
这段代码利用了visual basic分裂函数来为我们执行“重列表”,将列表分隔为一个数组,然后我们需要做的就是调用n数组元素.
语法
=INDEXLIST (列表、分离器、索引)
- 列表(required) -这是分隔项的列表。
- 分隔符(required) -这是用于分隔列表中的项目的分隔符。
- 指数(required) -这是您想要返回的项目索引号。
有了这个代码,我们就可以这个公式列表中的第n项.
”、“= INDEXLIST (B3, C3)
需要注意的事情INDEXLIST函数。
- 如果输入的索引数大于列表中的数或项,或者小于列表中的项数,函数将返回a#价值!错误。
- 如果我们使用一个非整数,函数将四舍五入到最接近的整数并从列表中返回该项。
一个公式解决方案
使用Excel的内置公式可以获得列表中的第n项,但我找到的解决方案显然没有这么优雅。
- 使用替代函数将分隔符","替换为可能不会在列表中的任何项中使用的字符,CHAR (1)应该不太可能出现在任何数据中。现在我们可以用找到函数来找到这个的位置CHAR (1)的性格。在分隔符“,”第n次出现时重复此逻辑。
- 使用IFERROR当N太大或太小时。
- 使用LEN和中期函数返回分隔符之间的文本。
IFERROR =替代(中期(B3(找到(CHAR(1)替代品(B3,”、“CHAR (1) C3-1)), 1), IFERROR(找到(CHAR(1)替代品(B3,”、“CHAR (1), C3)), LEN (B3) + 1) -IFERROR(找到(CHAR(1)替代品(B3,”、“CHAR (1) C3-1)), 1 )),", ","")
这肯定不漂亮,但很管用。
很好的方法。但是有一个很小的限制,即如果分隔符上的空间比定义的多或少,则会抛出错误。为了解决这个问题,我添加了TRIM函数并删除了空格和逗号作为分隔符。
INDEXLIST(修剪([@ list ]),”,”,[@[ 项目编号]])
INDEXLIST(修剪(B3)”、“,C3)
谢谢你的提示!