Excel:把​​两个不同的复杂公式(独特的清单和拆分)

你好,所有你惊人的人

我想做两件事

  • 从长长的重复值列表中填充一个独特的清单
  • 提取用连字符分隔的文本的组成部分

我在不同的地方find了解决这些问题的方法。

独特的清单在这里 : http : //www.get-digital-help.com/2009/03/30/how-to-extract-a-unique-list-and-the-duplicates-in-excel-from-one -柱/

公式是

`{=INDEX(A2:A65000,MATCH(0,COUNTIF($B$1:B1,A2:A65000),0))}` 

其中列B是唯一列表填充的位置


从这里提取(拆分文本) : http : //spreadsheetpage.com/index.php/tip/the_versatile_split_function/

 Function ExtractElement(str, n, sepChar) ' Returns the nth element from a string, ' using a specified separator character Dim x As Variant x = Split(str, sepChar) If n > 0 And n - 1 <= UBound(x) Then ExtractElement = x(n - 1) Else ExtractElement = "" End If End Function 

下面的公式演示了如何在公式中使用ExtractElement函数。

 =ExtractElement("546-339-909-944",3,"-") 

该公式返回909,即string中的第三个元素(使用“ – ”作为分隔符)。


这些都很好 ,解决了很多我想做的事情。 但是我也试图将这两个function一起做到另一列。

我有一个值的列如:

香蕉 – 黄色 – 水果
太阳 – 黄 – 星
血液 – 红色 – 液体
退出 – 红色 – 标牌

我正在试图得到结果

黄色

我希望用公式完成这一切,不希望使用助手列。 我不介意VBA(你可以看到,这里的第二个链接是VBA)。

任何帮助表示赞赏。 太感谢了!

斯利拉姆

一个使用ADO的例子。

 Dim cn As Object Dim rs As Object Dim strFile As String Dim strCon As String Dim strSQL As String Dim i As Integer ''http://support.microsoft.com/kb/246335 strFile = ActiveWorkbook.FullName strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon ''The connection string is set up for ''headers, so you can use column names ''You can substitute a named range ''for [Sheet8$] strSQL = "SELECT DISTINCT " _ & "Mid(ColName,Instr(ColName,""-"")+1," _ & "InStrRev(ColName,""-"")-Instr(ColName,""-"")-2) " _ & "FROM [Sheet8$]" rs.Open strSQL, cn, 3, 3 ''Copies the results to a worksheet Worksheets("Sheet7").Cells(2, 1).CopyFromRecordset rs 

在你的问题中有一些有用的链接 – 谢谢。

我做了如下使用你的样品数据香蕉 – 黄色 – 水果太阳 – 黄色 – 星血 – 红色 – 液体出口 – 红色 – 标牌

第1步复制到记事本,并在Excel中打开,并通过向导运行提取分隔符“”和“ – ”。 这将数据作为文本放置在3个相邻的列中,然后在列A,B和C中分别命名为列表1,列表2和列表3(分别在范围A2:A5,B2:B5,C2:C5中)。 在工作簿中使用单独的工作表来执行此操作会更好。 我保持第一行清楚。

步骤2通过使用从单元格D2开始的以下公式将步骤1中的列表合并到一列(在我的示例中为列D)中:

 {=IFERROR(INDEX(List1,ROWS($D$1:D1)),IFERROR(INDEX(List2,ROWS($D$1:D1)-ROWS(List1)),IFERROR(INDEX(List3,ROWS($D$1:D1)-ROWS(List1)-ROWS(List2)),"")))} 

这是一个数组公式,应该使用CTRL + SHIFT + ENTERinput然后复制下来。 这个范围我调用了ListSource(d2:d13)。 我再次不使用第一行。

步骤3为了从E 2单元开始只提取E列中的重复项,这个公式就完成了

 {=IFERROR(INDEX(ListSource,MATCH(0,COUNTIF($E$1:E1,ListSource)+IF(COUNTIF(ListSource,ListSource)>1,0,1),0)),"")} 

这也是一个数组公式,应该使用CTRL + SHIFT + ENTERinput并复制到列中的其他单元格中。 虽然你可以添加一些标题,但第1行没有任何内容。

这产生了所需的输出黄色红色

您可能会认为在步骤1中使用导入向导并不是严格意义上的编程解决scheme,因此可以自动执行此步骤。

希望这可以帮助。

对于您已经显示的具体情况,我修改了公式,以使用公式来提取颜色,而不是使用VBA代码。

 =INDEX(RIGHT(LEFT(SUBSTITUTE(A2:A65000,"-","|",2),FIND("|",SUBSTITUTE(A2:A65000,"-","|",2))-1),LEN(LEFT(SUBSTITUTE(A2:A65000,"-","|",2),FIND("|",SUBSTITUTE(A2:A65000,"-","|",2))-1))-FIND("-",LEFT(SUBSTITUTE(A2:A65000,"-","|",2),FIND("|",SUBSTITUTE(A2:A65000,"-","|",2))-1))),MATCH(0,COUNTIF($B$1:B1,RIGHT(LEFT(SUBSTITUTE(A2:A65000,"-","|",2),FIND("|",SUBSTITUTE(A2:A65000,"-","|",2))-1),LEN(LEFT(SUBSTITUTE(A2:A65000,"-","|",2),FIND("|",SUBSTITUTE(A2:A65000,"-","|",2))-1))-FIND("-",LEFT(SUBSTITUTE(A2:A65000,"-","|",2),FIND("|",SUBSTITUTE(A2:A65000,"-","|",2))-1)))),0)) 

和你一样,这是一个数组公式; 所以点击Ctrl-Enter。

然后,您可以从B2向下复制并粘贴此公式,当您获得#VALUES时,没有更多的唯一。 此外,如果您修改A列中的值,则可能需要将公式复制到更多单元格(如果唯一值增加)。