Копировать строки, которые соответствуют критериям, в два или более разных листа в Excel с VBA - PullRequest
0 голосов
/ 08 ноября 2018

Есть ли кто-нибудь, кто хочет помочь начинающему самоучке (с большим энтузиазмом изучать этот материал)?

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

Я дошел до того, что смог скопировать строки таблицы ORDERS на листе ORDERS, в таблицу INSTOCKORDERS на листе INSTOCKORDERS. Но то, что я действительно хочу, это сделать два разных листа из всех заказов. Один с товарами, которые заказаны и есть в наличии. И еще один лист с заказами / товарами, которых нет в наличии. После того, как это действие произошло, он должен очистить таблицу ORDERS. И после этого в следующий раз он должен поместить ORDERS в таблицы INSTOCKORDERS и NOSTOCKORDERS под своей последней строкой.

То, что я хотел сделать с сортировкой, это поместить все элементы с количеством 0 на вершине таблицы, что, как я думал, могло бы облегчить копирование всех элементов с 0 элементами в NOSTOCKORDERS и все остальные. ИНСТАКОРДЕРС. Но я не имею ни малейшего понятия о том, как сделать это аккуратным рабочим действием, не говоря уже о том, как начать (извините за невежество моих новичков ...) Я прошел через некоторые прежние вопросы, столкнулся с Автофильтром, но не получил его ...

Sub CopyOrders()

'Sorting column STOCK in ORDERS from a-z
    Worksheets("Orders").ListObjects("Orders").Sort. _
        SortFields.Clear
    Worksheets("Orders").ListObjects("Orders").Sort. _
        SortFields.Add2 Key:=Range("Orders[[#All],[STOCK]]"), SortOn:= _
        xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With Worksheets("Orders").ListObjects("Orders").Sort
        .Apply
    End With

'Copying the table ORDERS to INSTOCKORDERS
Range("Orders").Copy Range("InStockOrders")

End Sub

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Обновление: ответ 2: Я думаю, что я нашел ошибку во всем этом.Что делает до сих пор, так это копирование правильных строк в этот момент.Но это копирует с формулами!Это означает, что когда исходная таблица (Заказы) сортируется другим способом, или строки удаляются, или что-либо еще, скопированные строки в "... StockOrders" показывают разные значения из-за их формул!Что мне нужно, так это небольшая помощь ... Как скопировать значения вместо формул?

Ответ 1: Благодаря Curtis000 он куда-то попадает.Теперь у меня есть кусок VBA, который делает копии предметов, которые есть в наличии.Он копируется на лист "InStockOrders" в таблицу с таким же именем.Однако есть небольшая проблема.

Первые 5 столбцов копируются с правильными значениями в нем.Но 6-й столбец и далее получают скопированные значения, которые относятся к первым строкам моей таблицы "ORDERS".

    Sub FilterInStock()

Worksheets("Orders").Range("B2,I2").AutoFilter Field:=6, Criteria1:="<>" & "0", VisibleDropDown:=True
Worksheets("Orders").Range("ORDERS").SpecialCells(xlCellTypeVisible).Copy Range("InStockOrders")

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

End Sub

Но таблица NoStockOrders имеет совершенно правильную копию тех, которые должны быть там.До сих пор я управляю двумя VBA отдельно.В этом примере: сначала FilterInStock, а затем FilterNoStock.

    Sub FilterNoStock()

Worksheets("Orders").Range("B2,I2").AutoFilter Field:=6, Criteria1:="0", VisibleDropDown:=True
Worksheets("Orders").Range("ORDERS").SpecialCells(xlCellTypeVisible).Copy Range("NoStockOrders")

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

End Sub

Таблица заказов

Таблица InStockOrders

NoStockOrders стол

0 голосов
/ 28 ноября 2018

Наконец-то появилась хорошая рабочая система.

    Sub CopyOrders()

'Sorting column STOCK in ORDERS from A-Z
    Worksheets("Orders").ListObjects("Orders").Sort. _
        SortFields.Clear
    Worksheets("Orders").ListObjects("Orders").Sort. _
        SortFields.Add2 Key:=Range("Orders[[#All],[STOCK]]"), SortOn:= _
        xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With Worksheets("Orders").ListObjects("Orders").Sort
        .Apply
    End With

'Delete all rows from table NoStockOrders
On Error Resume Next
Worksheets("NoStockOrders").ListObjects("NoStockOrders").DataBodyRange.EntireRow.Delete

'Copy all orders which have no stock to
'the sheet NoStockOrders
Worksheets("Orders").Range("ORDERS").AutoFilter _
    Field:=6, Criteria1:="0", VisibleDropDown:=True
On Error Resume Next
Worksheets("Orders").Range("ORDERS").SpecialCells _
    (xlCellTypeVisible).Copy
    Range("NoStockOrders").PasteSpecial _
    Paste:=xlPasteValues

If Worksheets("Orders").ListObjects("Orders").FilterMode Then
    Worksheets("Orders").AutoFilter.ShowAllData
End If

'Sorting column STOCK in ORDERS from Z-A
    Worksheets("Orders").ListObjects("Orders").Sort. _
        SortFields.Clear
    Worksheets("Orders").ListObjects("Orders").Sort. _
        SortFields.Add2 Key:=Range("Orders[[#All],[STOCK]]"), SortOn:= _
        xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With Worksheets("Orders").ListObjects("Orders").Sort
        .Apply
    End With

'Delete all rows from table InStockOrders
On Error Resume Next
Worksheets("InStockOrders").ListObjects("InStockOrders").DataBodyRange.EntireRow.Delete

'Copy all orders which have no stock to
'the sheet InStockOrders
Worksheets("Orders").Range("ORDERS").AutoFilter _
    Field:=6, Criteria1:=">0", VisibleDropDown:=True
On Error Resume Next
Worksheets("Orders").Range("ORDERS").SpecialCells _
    (xlCellTypeVisible).Copy
    Range("InStockOrders").PasteSpecial _
    Paste:=xlPasteValues

If Worksheets("Orders").FilterMode Then
    Worksheets("Orders").ShowAllData
End If

'Copying the table ORDERS to INSTOCKORDERS
'Range("Orders").Copy Range("InStockOrders")

End Sub

Имейте в виду: запуск этого извне таблицы заказов не работает должным образом!Тогда не будет очищен режим фильтра в таблице.(следуйте за моим новым вопросом: введите описание ссылки здесь )

0 голосов
/ 08 ноября 2018

Вы правы, функция автофильтра - это то, что вам нужно. Автофильтру нужны критерии для фильтрации, а затем необходимо указать, в каком столбце (поле) найти критерии. Затем необходимо отфильтровать оставшиеся видимые ячейки после фильтрации. В приведенном ниже коде замените рабочие книги, рабочие таблицы и диапазон тем, что нужно для вашей рабочей книги:

Sub FilterNoStock()
Workbooks.Worksheets.Range.AutoFilter Field=5, Criteria1:="0", VisibleDropDown:=True
Workbooks.Worksheets.Range.SpecialCells(xlCellTypeVisible).Copy
End Sub

Таким же образом вы можете фильтровать все значения, кроме 1:

Sub FilterInStock()
Workbooks.Worksheets.Range.AutoFilter Field=5, Criteria1:="<>" & "0", VisibleDropDown:=True
Workbooks.Worksheets.Range.SpecialCells(xlCellTypeVisible).Copy
End Sub

Я бы также порекомендовал связать это с функцией Rows.Count, чтобы иметь возможность динамически копировать только строки, содержащие данные, и вставлять их в конце ваших списков на листах InStock и NoStock. С помощью метода Rows.Count вы заставляете VBA подсчитывать, сколько у вас строк, устанавливаете это в переменную, а затем используете эту переменную для объявления длины вашего диапазона. Прямо сейчас вы копируете весь рабочий лист, что будет проблематично, если вы попытаетесь скомпилировать несколько заказов в ваших листах InStock и NoStock, так как вставка перезапишет все ваши данные из предыдущих заказов: Описание Rows.Count

...