WedX - журнал о программировании и компьютерных науках

Как получить несколько значений для данных в ячейке на основе одного значения поиска

У меня есть лист 1, в котором столбец A заполнен основными задачами, а столбец B заполнен значениями поиска.

Данные

Лист 2 имеет диапазон значений поиска. Столбец B на листе 1 такой же, как столбец A на листе 2.

Диапазон поиска

На листе 3 мне нужна основная задача. На листе 1 (столбец A) должны быть заполнены на основе подзадач на листе 2 (столбец B) и запланированных часов на листе 2 (столбец C).

Пожалуйста, проверьте приведенный ниже вывод.

Вывод:

Решение должно искать столбец B на листе 1 и возвращаться к листу 2, подсчитывать количество подзадач (столбец B) и заполнять основную задачу на листе 1 (столбец A) столько раз, включая содержимое подзадач и запланированные часы.

Вывод

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


Ответы:


1

Что вы хотите сделать, так это ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ на таблице на втором листе с таблицей на первом.

Итак, ниже Вариант 1 с PowerQuery и 2 с VBA-SQL

Вариант 1:

Это можно сделать с помощью бесплатной надстройки PowerQuery (построен в 2016 г.).

1) Настройте свои данные на листах 1 и 2 в виде таблиц (щелкните заполненную ячейку в диапазоне данных, а затем нажмите Alt + T > выберите, что в моей таблице есть заголовки.

Таблица на листе1

2) Выделите каждую таблицу, а затем перейдите на вкладку data (2016) или Powerquery (2010-2013) и создайте новые данные запроса из таблицы (Get and Transform)

Появится окно редактора запросов, показывающее вашу таблицу (запрос/таблица, которую вы можете переименовать с правой стороны)

Запрос › из таблицы

3) Затем вы можете выбрать закрыть и load to > only create connection (в верхнем левом углу окна

Значок закрытия и загрузки

Только выбор подключения

загрузка таблицы только для подключения

Повторите для таблиц на листах 1 и 2.

4) Затем создайте новый запрос> объедините запросы> объедините

объединение запросов

Убедитесь, что ваша таблица подзадач является первой выбранной таблицей, а основные задачи — второй. Нажмите на столбцы Content_Category_Product Sub Type в обеих таблицах, чтобы они были выделены (это будет столбец соединения).

Убедитесь, что join kind соответствует Left outer, и что для сопоставления выбора стоит зеленая галочка.

Затем нажмите «ОК» и загрузите на лист3.

Объединение таблиц

5) Отсортировать полученную таблицу по первому столбцу по возрастанию

Сортировать по основным задачам

6) Посмотреть результат:

Таблица результатов

Есть много ресурсов о Powerquery, которые вы можете найти. Это позволит вам изменить имена столбцов и т. д. Вы также можете удалить ненужные столбцы, чтобы они соответствовали опубликованному вами изображению.

Или вариант 2:

С SQL адаптируя подход из barrowc и функцию Johan Kreszner, убедившись, что вы перешли в редактор VBA (Alt-F11) и добавили ссылку (Tools > References) на "Microsoft ActiveX Data Objects X.X Library".

Я предположил, что только таблицы находятся на листах 1 и 2, но в противном случае вам может потребоваться изменить SQL, чтобы настроить таргетинг на диапазоны таблиц (объекты списка), поэтому я включил функцию Йохана для возврата диапазона объекта списка, предоставленного вам передать имя таблицы в виде строки.

Option Explicit

Sub LeftJoinTables()

    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection

    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
                            "Extended Properties=""Excel 12.0 Macro;IMEX=1;HDR=YES"";"
        .Open
    End With

    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    rs.Open "SELECT [Main Task], [Sub Task], [Budget Hours] FROM [Sheet2$] LEFT JOIN [Sheet1$] ON [Sheet2$].[Content Category_Product Sub type] = " & _
            "[Sheet1$].[Content Category_Product Sub type] ORDER BY [Main Task]", cn

    Dim fld As ADODB.Field
    Dim i As Integer

    With ThisWorkbook.Worksheets("Sheet3")
        .UsedRange.ClearContents
        i = 0
        For Each fld In rs.Fields
            i = i + 1
            .Cells(1, i).Value = fld.Name
        Next fld
        .Cells(2, 1).CopyFromRecordset rs
        .UsedRange.Columns.AutoFit
    End With

    rs.Close
    cn.Close

End Sub



Public Function GetRange(ByVal sListName As String) As String

Dim oListObject As ListObject
Dim wb As Workbook
Dim ws As Worksheet

Set wb = ThisWorkbook

For Each ws In wb.Sheets
    For Each oListObject In ws.ListObjects
        If oListObject.Name = sListName Then
            GetRange = "[" & ws.Name & "$" & Replace(oListObject.Range.Address, "$", "") & "]"
        Exit Function
        End If
    Next oListObject
Next ws

End Function
22.12.2017
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]