Как сделать так, чтобы Формула давала множественные результаты через другие ячейки? - PullRequest
0 голосов
/ 25 июня 2018

Так что я работаю над листом Excel, и это то, что я действительно не могу понять.

Я хочу, чтобы, если содержимое ячейки соответствовало определенным критериям, весь столбец ячеек вставлялся в соответствии с этой ячейкой.Ячейка представляет собой раскрывающийся список с 32 различными параметрами (которые можно уменьшить, если нет возможности сделать это), и каждый параметр соответствует отдельному столбцу данных.В столбцах, которые нужно вставить, содержится примерно 32 ячейки данных в каждом.

Моя текущая формула в основном =IFS(A1="Potato",Sheet2!G:G), но это дает мне «0».Лучшее, что я могу сделать, это изменить формулу на =IFS(A1="Potato",Sheet2!G1) или =IFS(A1="Potato",Sheet2!G1:G32), но обе эти формулы дают мне содержимое только первой ячейки (G1).

Любые идеи о том, как я могу это сделатьбез необходимости связываться с инопланетянами или строить космический корабль?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Вы не можете изменять значения ячеек с помощью формулы, например, вставки.Однако существуют различные способы получения нужных значений с помощью формулы или VBA:

Пример формулы : комбинация поиска по индексу и горизонтальному поиску.

=INDEX($D$1:$H$6,ROW(A2),HLOOKUP($A$1,$D$1:$H$1,1,FALSE))

enter image description here

Здесь я вставил формулу в B2 и перетащил ее до B6.Имейте в виду, он вернет 0 для пропущенных значений.Однако в Settings > Advanced вы можете включить 0 значений.

0 голосов
/ 25 июня 2018

Вы можете использовать формулы или VBA.

Я предположил, что ваши 32 столбца исходных данных находятся на Листе 2 с заголовками в строке 1.

Решение для формул

В Sheet1 A73 введите:

=INDEX(Sheet2!$A$1:$AF$41,ROW(A1),MATCH($A$1,Sheet2!$A$1:$AF$1,0))

Скопируйте эту формулу в Sheet1 A74: A105

VBA Solution

Putэтот код в модуле Sheet1;

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Application.EnableEvents = False
        With Sheet2
            Set c = .Rows(1).Find(what:=Sheet1.Range("A1").Value)
            If Not c Is Nothing Then
                Set c = Intersect(.UsedRange, c.EntireColumn)
                Sheet1.Range("A73").Resize(c.Rows.Count, 1).Delete
                c.Copy Sheet1.Range("A73")
            End If
        End With
        Application.EnableEvents = True
    End If
End Sub
0 голосов
/ 25 июня 2018

Отредактированный ответ: (согласно комментарию)

У нас есть следующий макет продуктов

enter image description here

Private Sub CommandButton1_Click()
'first we check the user input
Dim u_input As String
Dim ws As Worksheet: Set ws = Sheets("Sheet1")
u_input = LCase(Trim(ws.Range("A1").Value2))

'now we need to determine how many columns there are so we know when to stop looping
Dim lc As Long, lr As Long
lc = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

' loops through all the products
For Each cell In Range(Cells(1, "F"), Cells(1, lc))
    ' if the product matches the input
    If LCase(Trim(cell)) = u_input Then
        lr = ws.Cells(ws.Rows.Count, cell.Column).End(xlUp).Row
        ' copy and paste the active data range to A37
        ws.Range(Cells(1, cell.Column), Cells(lr, cell.Column)).Copy
        Sheets("Sheet2").Range("A37").PasteSpecial
    End If
Next cell

End Sub

Итак, после ввода огурца и нажатия кнопки:

enter image description here

Мы бы получили следующий результат:

enter image description here

Вы можете добавить туда любое количество товаров, если первый товар начинается в столбце F. (хотя это также можно изменить в коде).


PS: Однако это приведет к перезаписи ваших данных и к тому, что данные будут перекрываться, если диапазоны данных не совпадают. Возможно, было бы разумнее вставить данные в следующую пустую строку в sheet2, а не напрямую в A37

Это может быть достигнуто путем изменения строки Sheets("Sheet2").Range("A37").PasteSpecial до Sheets("Sheet2").Range(Cells((Rows.Count, "A").End(xlUp).Row, "A")).PasteSpecial

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...