Страницы: 1
RSS
Макрос переноса части данных таблицы на другой лист(файл) по нескольким условиям
 
Добрый день.
Я новичок в макросах, но стараюсь и изучаю, ибо интересно и очень нужно.
Помогите упростить и ускорить код.
История такая: из программы выгружается файл с данными, в файле десятки листов и по несколько тысяч строк на каждом листе.
Необходимо часть данных с ненулевыми показателями перегружать в новый рабочий файл.
Макрос написала. Получилось только путём создания нового листа и копирования туда данных по условию, а затем переносом в нужный файл.
Макрос работает, но с учётом того, что в выгрузке десятки листов и по несколько тысяч строк на каждом, работает он очень и очень долго и тяжело.
Понимаю, что перемудрила с действиями, но упростить никак не получается.
Прошу помощи у знатоков.
Малюсенькая часть данных с примером во вложенном файле.

Изменено: Songbird - 28.11.2022 15:21:28
 
Код
Sub OneMoreProba()
    Dim wb As Workbook
    Set wb = ActiveWorkbook
    
    Dim arr As Variant
    arr = GetArr(wb)
    If IsEmpty(arr) Then Exit Sub
    
    Dim shRaschet As Worksheet
    On Error Resume Next
    Set shRaschet = Sheets("расчет")
    On Error GoTo 0
    If shRaschet Is Nothing Then Set shRaschet = Workbooks.Add(1).Sheets(1)
    
    With shRaschet.Cells(6, 1).Resize(UBound(arr, 1), UBound(arr, 2))
        .Value = arr
    End With
End Sub

Private Function GetArr(wb) As Variant
    ReDim arr(0 To 0)
    Dim sh As Worksheet
    For Each sh In wb.Worksheets
        If sh.Name <> "расчёт" Then
            JobSheet sh, arr
        End If
    Next
    If UBound(arr) > 0 Then
        Dim brr As Variant
        ReDim brr(1 To UBound(arr), 1 To UBound(arr(1)) + 1)
        Dim yy As Long
        Dim xx As Long
        For yy = 1 To UBound(brr, 1)
            For xx = 1 To UBound(brr, 2)
                brr(yy, xx) = arr(yy)(xx - 1)
            Next
        Next
        GetArr = brr
    End If
End Function

Private Sub JobSheet(sh As Worksheet, arr As Variant)
    With sh
        Dim yy As Long
        yy = .UsedRange.Row + .UsedRange.Rows.Count - 1
        If yy < 4 Then Exit Sub
        Dim brr As Variant
        brr = .Cells(1, 3).Resize(yy, 4)
    End With
    For yy = 4 To UBound(brr, 1)
        If brr(yy, 3) > 0 Or brr(yy, 4) > 0 Then
            ReDim Preserve arr(0 To UBound(arr) + 1)
            arr(UBound(arr)) = Array(brr(yy, 1), brr(yy, 2), brr(yy, 3), brr(yy, 4))
        End If
    Next
End Sub
PS Знаете почему Вам долго не отвечали? Чтоб прочесть маленький шрифт нужна лупа, ведь за лупой буквы кажутся больше )))
 
МатросНаЗебре, спасибо большое.    :D
Вы даже не мой макрос поправили, а совсем другой прислали)
Пойду проверять и разбираться).
PS  шрифт в сообщении исправила
Страницы: 1
Наверх