Excel:将两个不同的复杂公式放在一起(Unique distinct list& Split)

时间:2009-12-16 00:48:54

标签: excel vba excel-vba split unique

你们所有的人都好吗

我想做两件事

  • 从一长串重复值中填充唯一的不同列表
  • 提取用连字符分隔的文本的组件

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

此处的唯一不同列表http://www.get-digital-help.com/2009/03/30/how-to-extract-a-unique-list-and-the-duplicates-in-excel-from-one-column/

公式是

`{=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,即字符串中的第三个元素(使用“ - ”作为分隔符)。


这些很棒并解决了我想要做的很多事情。但我也试图将这两个功能同时用于另一个专栏。

我有一个包含以下值的列:

  

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

我想把结果作为

  

黄色
     红色

我希望使用公式完成所有操作,并且不希望使用帮助列。我不介意VBA(你可以看到,这里的第二个链接是vba)。

感谢任何帮助。万分感谢!

斯利拉姆

3 个答案:

答案 0 :(得分:0)

使用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 :(得分:0)

您的问题中有一些有用的链接 - 谢谢。

我使用您的示例数据执行了以下操作 香蕉 - 黄色 - 水果 太阳 - 黄 - 星 血 - 红 - 液体 退出 - 红色 - 标牌

第1步 将其复制到记事本中并在excel中打开并通过向导运行以提取分隔符“”和“ - ”。这将数据作为文本放在3个相邻的列中,然后我在列A,B和C中命名为list1,list2和list3(分别在范围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 + ENTER输入,然后向下复制。 这个范围我叫做ListSource(d2:d13)。我再次没有使用第一行。

第3步 为了从单元格E2开始只提取E列中的重复项,这个公式就成功了

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

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

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

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

希望这有帮助。

答案 2 :(得分:0)

对于您显示的特定情况,我修改了公式以使用公式而不是使用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。

然后你可以复制&amp;从B2下来粘贴这个公式,当你得到#VALUES时,就没有其他独特的了。此外,如果修改A列中的值,如果唯一值增加,则可能需要将公式复制到更多单元格。