Excel: объединение двух разных сложных формул (уникальный отдельный список и разделение) - PullRequest
2 голосов
/ 16 декабря 2009

Привет всем вам, удивительные люди

Я хотел сделать две вещи

  • заполнить уникальный отдельный список из длинного списка повторяющихся значений
  • извлечение компонента текста, разделенного дефисом

Я нашел решение каждой из этих проблем в разных местах.

Уникальный уникальный список здесь : http://www.get -digital-help.com / 2009/03/30 / как извлечь уникальный список-и-дубликаты -в-первенствует-из-одной колонки /

Формула

`{=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).

Любая помощь приветствуется. Спасибо миллион!

Sriram

Ответы [ 3 ]

0 голосов
/ 16 декабря 2009

В вашем вопросе было несколько полезных ссылок - спасибо.

Я сделал это следующим образом, используя ваши образцы данных Банан - Желтый - Фрукт Солнце - Желтый - Звезда Кровь - Красный - Жидкость Выход - Красный - Вывески

шаг 1 Скопировал его в блокнот, открыл в Excel и пробежал по мастеру, чтобы извлечь разделители "" и "-". Это поместило данные в виде текста в 3 смежных столбца, которые я затем назвал list1, list2 и list3 в столбцах A, B и C (соответственно они были в диапазонах A2: A5, B2: B5, C2: C5). Для этого было бы лучше использовать отдельный лист в рабочей тетради. Я держал первый ряд чистым.

шаг 2 объединили списки из шага 1 в один столбец (в моем случае теперь столбец D), используя следующую формулу, начиная с ячейки D2:

{=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 Чтобы извлечь только дубликаты в столбце E, начиная с ячейки E2, эта формула добилась цели

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

, который опять-таки является формулой массива, которая должна быть введена с помощью сочетания клавиш CTRL + SHIFT + ENTER и скопирована в другие ячейки в столбце. Опять же, в строке 1 ничего нет, хотя можно добавить несколько заголовков.

Это дало желаемый результат желтый Красный

Вы можете решить, что использование мастера импорта на шаге 1 не является строго программным решением, поэтому возможно автоматизировать этот шаг.

Надеюсь, это поможет.

0 голосов
/ 27 августа 2016

Для показанного вами конкретного случая я изменил вашу формулу для извлечения цветов с помощью формул вместо использования кода 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, вам может потребоваться скопировать формулу в большее количество ячеек, если уникальные значения увеличатся.

0 голосов
/ 16 декабря 2009

Пример использования 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
...