Страницы: 1
RSS
Проблема с копированием Range с фильтром на другой лист
 
Я VBA только изучаю, поэтому возможно последуют "чайниковые" вопросы.

Есть некая база, пользователь вводит название страны, vba сортирует всю базу по этому названию, показывая только продукты из этой страны, далее надо скопировать все эти продукты на отдельный лист.
Код
Sub test()

Application.CutCopyMode = False

Dim Country
Country = InputBox("Введите страну")


Sheets("Все вина").Select
    Cells.Find(What:="Франция", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    ActiveSheet.Range("$A$1:$P$676").AutoFilter Field:=10, Criteria1:=Country


Range("A1:ZZ10000").Select
Selection.Copy
ActiveSheet.ShowAllData

Sheets("temp").Select
Range("b2").Select
ActiveSheet.Paste
Application.CutCopyMode = False


End Sub

Выдает ошибку "Метод Paste из класса Worksheet завершен неверно".
Смотрел решения здесь, и на других площадках.
Пробовал решать через:
1) Do Events
2) цикл с paste, пока не будет ошибки (стал бесконечным)
3) Wait time, так как читал, что может быть связано с тем, что не успевает копироваться в буфер обмена


Также подумал, что проблема связана с копированием кучи ячеек за раз. Попробовал скопировать только одну ячейку в другой лист, та же ошибка, так что связано не с этим. Файл прикрепляю, смотреть макрос "test". Эксель стоит последний.

Буду очень благодарен за помощь!
 
При активном листе "Все вина"
Код
Sub test()
Application.CutCopyMode = False
Dim Country As String
Dim Rng As Range
Country = Application.InputBox("Введите страну", Type:=2)
  ActiveSheet.ShowAllData
    ActiveSheet.Range("$A$1:$P$676").AutoFilter Field:=10, Criteria1:=Country
    With ActiveSheet.AutoFilter.Range
      Set Rng = .SpecialCells(xlCellTypeVisible) 'с шапкой таблицы
    End With
    With Worksheets("temp")
      Rng.Copy
      .Range("A6").PasteSpecial
    End With
Application.CutCopyMode = False
End Sub
 
Цитата
Kuzmich написал:
При активном листе "Все вина"
А можете пояснить что где происходит? Что такое type , почему через with и почему paste special? У меня потом по такому же принципу надо делать другие сортировки
 
Вот ещё вариант
Код
Sub test()
Dim Country As String, Rng As Range, FilteredRng As Range

    Country = InputBox("Введите страну", "Введите страну")
    
    'удаляем старые данные на листе Temp
    Worksheets("temp").Range("A1").CurrentRegion.ClearContents
    
    With Worksheets("Все вина")
        '.Select
        If .AutoFilterMode = False Then .Range("A1:P1").AutoFilter
        If .FilterMode = True Then .ShowAllData
        'поиск по всему листу
        Set Rng = .Cells.Find(What:=Country, LookIn:=xlFormulas, LookAt:=xlPart)
        If Rng Is Nothing Then
            MsgBox "По стране " & Country & " данных нет!", vbOKOnly + vbInformation, "Внимание"
            Exit Sub
        End If
        'поиск столбца Страна
        Set Rng = .Rows(1).Find(What:="Страна", LookIn:=xlFormulas, LookAt:=xlPart)
        .Range("A1").CurrentRegion.AutoFilter Field:=Rng.Column, Criteria1:=Country
        With .AutoFilter.Range
                'если в таблице нужных строк нет
                If .Resize(.Rows.Count, 1).SpecialCells(xlCellTypeVisible).Count = 1 Then
                    MsgBox "По стране " & Country & " данных нет!", vbOKOnly + vbInformation, "Внимание"
                    .Parent.ShowAllData
                    Exit Sub
                End If
                Set FilteredRng = .Rows.SpecialCells(xlCellTypeVisible)
                FilteredRng.Copy
        End With
    End With
    
    'вставка данных
    With Worksheets("temp")
        .Select
        .Range("A1").Select
        .Paste
        .Range("A1").Select
    End With
    Application.CutCopyMode = False
End Sub
 
New, Спасибо большое! Так гораздо понятнее и правильнее!
 
Вениамин Ветлужских, написал
Цитата
Так гораздо понятнее и правильнее!
То, что для вас понятней, можно согласиться.
Но чем докажете, что он правильнее моего?
 
Kuzmich, правильнее по сравнению с моим
 
Здравствуйте, уважаемые знатоки! Возник вопрос очень схожий с темой ветки, поэтому тема не отдельная.
Часть макроса копирует отфильтрованные ранее данные с одного листа на другой, видимые ячейки из диапазона G2:G???. Во всех случаях отрабатывает корректно, кроме как если видимой остается только вторая строка. В этом случае вместо копирования только G2 копируются целиком все строки листа кроме скрытых. Пример файла и кусочек кода прилагается. Подскажите, в чём подвох?
Код
Sub Макрос1()
     LastRow = Cells(Rows.Count, 1).End(xlUp).Row                 'при значении LastRow = 2
     Range("G2:G" & LastRow).SpecialCells(xlCellTypeVisible).Copy 'копирует все видимые строки листа
     Range("G2:G" & LastRow).Copy                                 'работает корректно но есть сомнения что будет корректная вставка
End Sub
 
Код
Sub Макрос1()
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    If LastRow = 2 Then
        Range("G2:G" & LastRow).Copy
    Else
        Range("G2:G" & LastRow).SpecialCells(xlCellTypeVisible).Copy
    End If
End Sub
А вообще у AutoFilter есть Range и вот именно с ним и нужно работать, как показано выше
 
Цитата
написал:
у AutoFilter есть Range
Вот за это спасибо!
Меня мучает любопытство, чем для копирования видимых ячеек неугоден диапазон G2:G2? Что здесь может сбить программу с толку?
Страницы: 1
Наверх