Проблемы со вставкой при смещении ячеек вниз

Привет, я пытаюсь скопировать информацию из книги в другую книгу и вставить, сдвигая ячейки вниз. Моя проблема в том, что я вообще не вставляю информацию. Код делает все, что должен, кроме вставки строк.

Sub filter_copy_paste()

 Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim whatToFind As String
Dim foundTwo As Range
Dim newSelectionRange As Range
Dim rowSelectionRange As Range
Dim Found_Row As Long
Dim num As Integer
'

Sheets("Sheet1").Select

    whatToFind = "Mean"
    
    Set foundTwo = Cells.Find(What:=whatToFind, After:=ActiveCell, LookIn:=xlFormulas2, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
'
Found_Row = foundTwo.row



    With Sheets("Main").Range("A12:S12").CurrentRegion
        .AutoFilter Field:=19, Criteria1: = "Yes"
        .SpecialCells(xlCellTypeVisible).EntireRow.Copy
        
        '_
           ' Destination:=Sheets("Sheet1").Range("A1")
'
' I added the following line to insert selection and shift down in Cells above mean
'
             Set rowSelectionRange = Rows(Found_Row - 1).Resize(1)
            rowSelectionRange.Select
             Selection.Insert Shift:=xlDown
    End With
    
'
'Following is added to clean up my previous worksheet
'
    Sheets("Main").Select
        If ActiveSheet.FilterMode = True Then
            ActiveSheet.ShowAllData
        End If
        
    Sheets("Main").Select
    Rows("3:11").Select
    Range("A11").Activate
    Selection.EntireRow.Hidden = True
    Application.CutCopyMode = False
    
    Sheets("Sheet1").Select
    
     Application.ScreenUpdating = True
Application.DisplayAlerts = True


End Sub

Я ожидаю, что скопированные строки будут вставлены в диапазон выше среднего

Что он делает вместо копирования? Примечание: вы хотите избегать использования Select в своем коде.

cybernetic.nomad 17.02.2023 21:45

Он вставляет новую пустую строку вместо вставки скопированных строк

ElRafa 17.02.2023 21:51

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

ElRafa 17.02.2023 21:58

Я думаю, вам нужно вставить

cybernetic.nomad 17.02.2023 23:04
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это должно делать то, что вам нужно:

Sub filter_copy_paste()
    
    Const FIND_THIS As String = "mean" 'use const for fixed values
    
    Dim f As Range, numRows As Long, wsSrc As Worksheet, wsDest As Worksheet
   
    Set wsSrc = ThisWorkbook.Worksheets("Main")    'source table
    Set wsDest = ThisWorkbook.Worksheets("Sheet2") 'copy to here
    
    Set f = wsDest.Cells.Find(What:=FIND_THIS, LookIn:=xlFormulas2, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
        
    If f Is Nothing Then
        MsgBox "'" & FIND_THIS & "' not found on " & wsDest.Name, vbExclamation
        Exit Sub
    End If

    With wsSrc.Range("A12:S12").CurrentRegion
        Debug.Print "Data", .Address()
        .AutoFilter Field:=19, Criteria1: = "Yes"
        'how many rows will be copied?
        numRows = .Columns(1).SpecialCells(xlCellTypeVisible).Count
        f.Resize(numRows).EntireRow.Insert shift:=xlDown 'insert the rows
        'copy visible rows
        .SpecialCells(xlCellTypeVisible).Copy wsDest.Cells(f.Row - numRows, "A")
    End With
    
    wsSrc.ShowAllData

End Sub

Работает правильно (по крайней мере, это то, к чему стремится мой код). Просто хотел спросить, как xlFormulas2 оказывается параметром LookIn? Я также видел это в нескольких других сообщениях.

VBasic2008 17.02.2023 23:41

@ VBasic2008 - я только что скопировал xlFormulas2 из кода ОП.... Похоже, так и должно быть xlFormulas, поскольку xlFormulas2 недействителен для LookIn

Tim Williams 17.02.2023 23:47
Вот ссылка чтобы вы не думали, что я наелась. Он распространяется как вирус.
VBasic2008 17.02.2023 23:55

@ VBasic2008 Когда я записал макрос, используя «поиск в формулах», он дал мне LookIn:=xlFormulas2, что, возможно, объясняет это. Похоже, что в версиях Excel, которые поддерживают «формулы динамического массива», xlFormulas2 заменил XlFormulas

Tim Williams 18.02.2023 00:06

Спасибо, Тим Уильям, в конце концов, твой маршрут оказался лучшим!

ElRafa 18.02.2023 04:55

Вставить отфильтрованные строки

Sub InsertFilteredRows()

    Application.ScreenUpdating = False
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    ' Source
    
    Dim sws As Worksheet: Set sws = wb.Sheets("Main")
    If sws.FilterMode Then sws.ShowAllData
    If sws.AutoFilterMode Then sws.AutoFilterMode = False
    
    Dim srg As Range: Set srg = sws.Range("A12").CurrentRegion
    srg.AutoFilter Field:=19, Criteria1: = "Yes"
        Dim svrg As Range: Set svrg = srg.SpecialCells(xlCellTypeVisible)
    sws.AutoFilterMode = False
    
    Dim sarg As Range, srCount As Long
    For Each sarg In svrg.Areas: srCount = srCount + sarg.Rows.Count: Next sarg
    
    'Debug.Print srg.Address, svrg.Address, srCount
    
    ' Destination
    
    Dim dws As Worksheet: Set dws = wb.Sheets("Sheet1")
    If dws.FilterMode Then dws.ShowAllData
    
    Dim durg As Range: Set durg = dws.UsedRange
    Dim dlCell As Range: Set dlCell = durg.Cells(durg.Cells.CountLarge)
    
    ' Starting with the first cell of the used range searching by rows,
    ' attempt to find the first cell that contains the search string.
    ' The search is by default case-insensitive ('A=a').
    Dim dfCell As Range: Set dfCell = dws.Cells.Find( _
        What: = "Mean", After:=dlCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows) ' the rest are default parameters
    If dfCell Is Nothing Then Exit Sub ' string not found
    Dim dirg As Range: Set dirg = Intersect(durg, dfCell.EntireRow) _
        .Resize(srCount) ' your code additionally suggests '.Offset(-1)' !?
    
    'Debug.Print svrg.Address, dfCell.Address, dirg.Address
    
    ' Insert and copy.
    
    dirg.Insert Shift:=xlShiftDown
    ' Cannot determine the 'CopyOrigin' parameter without seeing the data.
    
    ' Copy.
    svrg.Copy dirg.Columns(1).Offset(-srCount)
    
    ' Clean up!?
    
    sws.Rows("3:11").Hidden = True
    If Not wb Is ActiveWorkbook Then wb.Activate
    dws.Select
    
    Application.ScreenUpdating = True

    ' Inform.
    
    MsgBox "Filtered rows inserted.", vbInformation

End Sub

Другие вопросы по теме