Это VBA решение вопроса.ИМХО, это более уместно, чем формула (в данном случае).Подход с формулой - это нормально, но есть и недостатки: вы должны запомнить правило CSE, а затем скопировать формулы в нужное количество строк (которые вы не знаете заранее) и т. Д. И т. Д.
В этом коде используются те же предположения, что и при использовании формулы.
1 - листы = отчет об акциях и запасах
2 - данные в листах, столбцы A и B (заголовок в строке 1)
3 -код поиска находится в отчете об акциях
4 - вывод находится в отчете об акциях
Одно из преимуществ состоит в том, что если новые данные добавляются в лист акций (т. е. нижний ряд> 700), vba автоматически корректируется.
Код самодокументирован.Но суть в том, что он создает автофильтр на «Акции», используя значение поиска в качестве критерия;копирует строки, которые соответствуют критериям;и вставляет результат в выходной диапазон в «Отчетах о запасах».Диапазон вывода очищается перед началом копирования / вставки, так что нет остатков от любого предыдущего поиска.
Я думаю, что есть что сказать для создания раскрывающегося списка для ячейки поиска.Без сомнения, это тоже можно автоматизировать, получая коды из столбца А, получая уникальные значения, а затем применяя их к поисковой ячейке.Просто мысль;)
Sub so_52537740()
' CREDITS
'
' Refer: https://stackoverflow.com/questions/17531128/copy-paste-calculate-visible-cells-from-one-column-of-a-filtered-table
' Date: 8 July 2013
' Submitted by: Jon Crowell (https://stackoverflow.com/users/138938/jon-crowell)
Dim src As Worksheet, tgt As Worksheet
Dim filterRange As Range, copyRange As Range
Dim lastRow As Long
Dim stocks As String, stockreport As String
' set values for sheet names
stocks = "Stocks"
stockreport = "Stock report"
' set values for Sheet variables
Set src = ThisWorkbook.Sheets(stocks)
Set tgt = ThisWorkbook.Sheets(stockreport)
' clear the exist target data
tgt.Range("A4:B" & Rows.Count).ClearContents
' turn off any autofilters that are already set
If src.AutoFilterMode Then src.AutoFilter.ShowAllData
' find the last row in the Stocks sheet with data in column A
lastRow = src.Range("A" & src.Rows.Count).End(xlUp).Row
' the range that we are auto-filtering (all columns)
Set filterRange = src.Range("A1:B" & lastRow)
' the range we want to copy (only columns we want to copy)
' in this case we are copying both columns A and B
' we set the range to start in row 2 to prevent copying the header
Set copyRange = src.Range("A2:B" & lastRow)
' filter range based on column A being equal the the value in Cell A1 of the stockreport
' consider making this a dropdown list so that there are no errors
filterRange.AutoFilter field:=1, Criteria1:=Format(Sheets(stockreport).Range("a1").Value)
' copy the visible cells to our target range
' note that you can easily find the last populated row on this sheet
' if you don't want to over-write your previous results
copyRange.SpecialCells(xlCellTypeVisible).copy tgt.Range("A4")
' turn off any autofilters that are already set
If src.AutoFilterMode Then src.AutoFilter.ShowAllData
End Sub
Надо отдать должное : Как говорится, под солнцем нет ничего нового.Я основал этот ответ на отличной работе Джона Кроуэлла по вопросу в StackOverflow « Копировать / Вставить / Рассчитать видимые ячейки из одного столбца отфильтрованной таблицы » в июле 2013 года. Просто чтобы показать, чтоможно немного погуглить и упорствовать.