Скопируйте определенные столбцы из отфильтрованного списка на другой лист

Я работаю над этим проектом некоторое время и не могу заставить отладчик работать чисто. Если кто-то может заставить меня двигаться в правильном направлении, я был бы так благодарен!

Эта рабочая книга фильтрует данные из списка ("Soap_List") на листе формы заказа. Моя цель - нажать одну кнопку, чтобы отфильтровать список, а затем скопировать только видимую ячейку из столбцов A, B и D в рабочий лист Echo France, начиная с ячейки «C12».

Бонус, если вы можете сказать мне, как удалить фильтры после того, как функция копирования / вставки была выполнена!

Вот что у меня есть до сих пор:

Private Sub cmbPrintEchoFrance_Click() 
    Dim OrderForm As Worksheet
    Dim EchoFrance As Worksheet
    Dim SoapList As ListObject  
    Dim lastRow As Long

    Set OrderForm = Worksheets("ORDER FORM")
    Set EchoFrance = Worksheets("ECHO FRANCE")
    Set SoapList = Worksheets("ORDER FORM").ListObjects("SOAP_LIST")

    SoapList.Range.AutoFilter Field:=3, Criteria1:="ECHO FRANCE"
    SoapList.Range.AutoFilter Field:=1, Criteria1:="<>"

    Set lastRow = OrderForm.Range("A" & OrderForm.Rows.Count).End(xlUp).Row

    Set copyRange = OrderForm.Range("A:A" & lastRow)

    copyRange.SpecialCells(xlCellTypeVisible).Copy EchoFrance.Range("C12")


End Sub

*ОБНОВЛЕНИЕ* Я все еще получаю сообщение об ошибке в разделе последней строки кода. Не уверен, что попробовать дальше. Проблема в том, что я устанавливаю именованный ListObject?

Private Sub cmbPrintEchoFrance_Click()
    Dim OrderForm As Worksheet
    Dim EchoFrance As Worksheet
    Dim SoapList As ListObject


    Set OrderForm = Worksheets("ORDER FORM")
    Set EchoFrance = Worksheets("ECHO FRANCE")

    Set SoapList = Worksheets("ORDER FORM").ListObjects("SOAP_LIST")

    SoapList.Range.AutoFilter Field:=3, Criteria1:="ECHO FRANCE"
    SoapList.Range.AutoFilter Field:=1, Criteria1:="<>"

    LastRow = SoapList.Range("A" & Rows.Count).End(xlUp).Row

    OrderForm.Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).Copy EchoFrance.Range("C12")




 End Sub

person SaraDeeCee    schedule 21.03.2014    source источник
comment
Может быть, вы можете подробно рассказать о том, где останавливается отладчик и какие ошибки?   -  person Bigtree    schedule 21.03.2014
comment
проблема здесь OrderForm.Range("A:A" & lastRow) - для столбца A должно быть так: OrderForm.Range("A1:A" & lastRow).   -  person Dmitry Pavliv    schedule 21.03.2014
comment
@Bigtree На самом деле у меня проблема с кодом, проходящим мимо раздела Set lastRow. Я продолжаю получать ошибку компиляции: Object Required Не совсем уверен, что я делаю неправильно...   -  person SaraDeeCee    schedule 22.03.2014
comment
Я думаю, что проблема в строке, выдающей ошибку, требующую объекта, заключается в том, что вы используете set, который нужен только для установки объектов. Строка должна, вероятно, читать lastrow = orderform.range....   -  person Bigtree    schedule 23.03.2014
comment
@Bigtree Я пробовал это, но все равно получаю сообщение об ошибке. Я собираюсь снова опубликовать весь код, так как я кое-что изменил.   -  person SaraDeeCee    schedule 26.03.2014
comment
Soaplist это что ListObject? Это Таблица?   -  person L42    schedule 26.03.2014


Ответы (1)


Я наконец-то понял! Вот рабочий код, который у меня есть прямо сейчас. Что бы мне действительно хотелось сейчас, так это выяснить оператор If, который будет проверять, пуста ли ячейка «D15» на листе PO, и если это так, не печатать страницу и перейти к следующей части кода. По сути, если мы не заказываем мыло у определенной компании, я не хочу, чтобы эта страница печаталась. Любые идеи?

Private Sub cmbPrintEchoFrance_Click()
    Dim OrderForm As Worksheet
    Dim PO As Worksheet
    Dim SoapList As ListObject
    Dim lRow As Long
    Dim rngToCopy As Range, rRange As Range

    Set OrderForm = Worksheets("ORDER FORM")
    Set PO = Worksheets("PRINT ORDER")

    Set SoapList = Worksheets("ORDER FORM").ListObjects("SOAP_LIST")
    Application.ScreenUpdating = False

     With OrderForm
     lRow = .Range("A" & .Rows.Count).End(xlUp).Row
     Set rRange = .Range("A1:A" & lRow)
    .AutoFilterMode = False

        With rRange
        'print the Echo France order
        .AutoFilter Field:=3, Criteria1:="ECHO FRANCE"
        .AutoFilter Field:=1, Criteria1:="<>"
        .Range("A1:A" & lRow).Copy PO.Range("D14")
        .Range("B1:B" & lRow).Copy PO.Range("E14")
        .Range("D1:D" & lRow).Copy PO.Range("F14")
        PO.Range("E12").Value = "ECHO FRANCE"
        PO.PrintOut
    End With

'clear print order
PO.Range("D14:F84").Clear
PO.Range("D14:F84").ClearFormats

    With rRange
    'print the european soaps order
    .AutoFilter Field:=3, Criteria1:="EUROPEAN SOAPS"
    .AutoFilter Field:=1, Criteria1:="<>"
    .Range("A1:A" & lRow).Copy PO.Range("D14")
    .Range("B1:B" & lRow).Copy PO.Range("E14")
    .Range("D1:D" & lRow).Copy PO.Range("F14")
    PO.Range("E12").Value = "EUROPEAN SOAPS"
    PO.PrintOut
    End With

 'clear print order
PO.Range("D14:F84").Clear
PO.Range("D14:F84").ClearFormats

    With rRange
    'print the la lavande order
    .AutoFilter Field:=3, Criteria1:="LA LAVANDE"
    .AutoFilter Field:=1, Criteria1:="<>"
    .Range("A1:A" & lRow).Copy PO.Range("D14")
    .Range("B1:B" & lRow).Copy PO.Range("E14")
    .Range("D1:D" & lRow).Copy PO.Range("F14")
    PO.Range("E12").Value = "LA LAVANDE"
    PO.PrintOut
    End With

     'clear print order
    PO.Range("D14:F84").Clear
    PO.Range("D14:F84").ClearFormats

    End With

SoapList.Range.AutoFilter Field:=1
SoapList.Range.AutoFilter Field:=3
Application.ScreenUpdating = True

End Sub
person SaraDeeCee    schedule 10.04.2014