这是一个公式解决方案。不需要 VBA。
假设您的列表从单元格 A1 开始,在单元格 B1 中输入以下公式:
=LEFT(A1,MATCH(,--(CODE(MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1))<96),)-3)
这是一个数组公式,必须用Ctrl+Shift+Enter确认。
然后在 C1 单元格中输入:
=MID(A1,MATCH(,--(CODE(MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1))<96),)-1,99)
这是一个数组公式,必须用Ctrl+Shift+Enter确认。
现在选择范围 B1:C1 并根据需要向下复制。
.
这是它们的工作原理。我们将讨论第一个公式。
MID 函数将单元格 A1 的值拆分为单个字符。 CODE 函数返回每个字符的 ASCII 码。我们测试每个代码号,看它是否小于96,即“a”第一个小写字符。
这为我们提供了一组布尔值(TRUE 或 FALSE),单元格 A1 中的每个字符都有一个布尔值。
我们通过双一元 (--) 将布尔值转换为 ONES 和 ZEROES。
我们使用 MATCH 函数在数组中搜索第一个零的位置。
连续大写字母的结尾是 MATCH 返回的位置之前的三个字符位置。
就是这样。
使这一切成为可能的原因是位于由 ROW/OFFSET 组合生成的公式核心的数组。结合 LEN 函数,此组合生成一个类似于 {1;2;3;4;5;6;7;8;9;10;11} 的向量数组。该数组的最后一个也是最大的数字等于单元格 A1 中值的长度。
.
更新
这是一个示例工作簿,显示这些公式适用于问题的示例数据:http://www.excelhero.com/samples/torentino_excelhero.xlsx