Страницы: 1
RSS
Работа по оптимизации кода, Ускорение работы макроса сборки данных
 
Жители "планеты Excel "? приветствую Вас!
Есть работающий макрос. Составлен из кучи решений и подсказок разных авторов Планеты Excel из разных времён.
Макрос работает.
При загрузке небольших массивов данных всё было хорошо (терпимо).
Но  при загрузке больших объёмов данных (50-60 листов) макрос тормозит.
Я никогда не занимался "оптимизацией кода" и предполагаю что специалистам на "мой" код смотреть будет больно.
Тем не менее, передо мной задача стоит и решать её как-то надо.
Файл примера  (только один макрос и только шапка таблицы, которую собственно макрос заполняет, данными из файлов (прописан путь)) данный ресурс не принимает, поскольку видимо только текст макроса (там более нет ничего)  весит 971 КБ.
Готов выслать сам файл и при необходимости, пару файлов с данными, тому кто возьмётся за данную задачку.
Не хочу обидеть специалистов низкой суммой, но но так, навскидку скажу, что мне не жалко будет заплатить 1 000 руб. за реальную помощь в существенном ускорении работы макроса (с комментариями по тексту кода).
       
 
Konstanta, здравствуйте
    Пишу в личку
Изменено: Jack Famous - 31.08.2023 18:18:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Option Private Module




Sub Удалить_Пустоты() ' перебор ячеек диапазона в поисках значения "ТекстДляПоиска"

    Dim cell As Range, delra As Range, ТекстДляПоиска As String
    Application.ScreenUpdating = False
 
    ТекстДляПоиска = ""
 
    For Each cell In Range("C1:C50000").Cells
        If cell = ТекстДляПоиска Then
            If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
        End If
    Next

'Это если подходящие строки найдены - удаляем их
    If Not delra Is Nothing Then delra.EntireRow.Delete
    End Sub
Sub дубли()
'

   Range("A2:N50000").Select
    ActiveSheet.Range("$A$3:$N$50000").RemoveDuplicates Columns:=3, Header:= _
        xlYes
End Sub

Private Sub CommandButton1_Click()
  If MsgBox("Напечатать загруженный диапазон?", vbYesNo) = vbNo Then
     Exit Sub
  Else
 ' Шрифт белый
    Nav = [Строк] + 2
    Range("L3", Cells(Nav, 14)).Select
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
'

  Application.Goto Reference:="Загружен"
  Selection.PrintOut 'печать выделенного диапазона
   

' ' Шрифт чёрный
    Nav = [Строк] + 2
    Range("L3", Cells(Nav, 14)).Select
    With Selection.Font
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
    End With
  End If
End Sub


Sub Загрузить_остатки()
 
 If Dir("C:\Ревизия\Импорт\*.*xls") = "" Then
MsgBox "нет файла"
 Exit Sub
Else
    
  Application.ScreenUpdating = False ' True
  Sheets("Инвентаризационная_ведомость").Select
  

  Columns("L:L").Select
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
    
    Range("L2").Select
    With Selection.Font
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
    End With
'--------------------------

'' форматируем наименование, цену МХ


'---------------------
  
  Const TargDir$ = "C:\Ревизия\Импорт\", Sht& = 1
  Dim wb As Workbook, fn$
'  Application.ScreenUpdating = False
  With Workbooks.Add.Worksheets(1)
    .Cells(1) = 1: fn = Dir(TargDir & "*.xls*")
    Do While fn <> ""
      Set wb = Workbooks.Open(TargDir & fn)
      If wb.Worksheets.Count >= Sht Then _
        wb.Worksheets(Sht).UsedRange.Copy .Cells(.UsedRange.Rows.Count + 1, 1)
        wb.Close False: fn = Dir
    Loop
    
  End With
   
 
   ' УдалениеСтрокПо_Значению_в_диапазоне() ' перебор ячеек диапазона в поисках значения "da"
    Dim cell As Range, delra As Range, ТекстДляПоиска As String
    Application.ScreenUpdating = False

    ТекстДляПоиска = ""
    For Each cell In Range("F1:F30000").Cells
        If cell = ТекстДляПоиска Then
            If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
        End If
    Next
    ТекстДляПоиска1 = "Ед."
    For Each cell In Range("F1:F30000").Cells
        If cell = ТекстДляПоиска1 Then
            If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
        End If
    Next
    If Not delra Is Nothing Then delra.EntireRow.Delete
'
    Range("A" & Rows.Count).End(xlUp).Offset(0).Select  'Последняя строка +0
    ActiveCell.Offset(0, 11).Select 'Перейти на X шагов вниз и на Y вправо
    ActiveCell.FormulaR1C1 = "0"
    ActiveCell.Offset(0, 2).Select
    ActiveCell.FormulaR1C1 = "0"
    Range("L1").FormulaR1C1 = "=RC[-5]"
    Range("L1").Select
    Selection.Copy
    Range(Selection, Selection.End(xlDown)).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
   


    book = ActiveWorkbook.Name
    Columns("L:L").Select
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With

    Range("L2").Select
    With Selection.Font
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
    End With


    ActiveSheet.UsedRange.Select 'Выделяет заполненную таблицу

    Selection.Copy
    ThisWorkbook.Activate
    Sheets("Инвентаризационная_ведомость").Select
    Range("A" & Rows.Count).End(xlUp).Offset(1).Select  'Последняя строка +1
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
    ' Создать_диапазон()
    ActiveWorkbook.Names.Add Name:="Загружен", RefersToR1C1:="=" & Selection.Parent.Name & "!" & Selection.Address(ReferenceStyle:=xlR1C1)
    Calculate
    


    Windows(book).Activate
    Application.CutCopyMode = False ' Очистить буфер памяти
    ActiveWindow.Close False 'закрыть без запроса на сохранение

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
'    Перемещаем файлы в другую папку
    fso.MoveFile "C:\Ревизия\Импорт\*.xls", "C:\Ревизия\Загруженные\"

    ThisWorkbook.Activate
    Sheets("Инвентаризационная_ведомость").Select

    End If


    Range("A3:M3").Copy
    Range("A4", Cells(Nav, 13)).Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False

    Nav = [Строк] + 2
    Range("N3").FormulaR1C1 = "=RC[-2]-RC[-7]"

    Range("N3").Copy
    Range("N4", Cells(Nav, 14)).Select
    ActiveSheet.Paste

    Application.CutCopyMode = False ' Очистить буфер памяти
'


    Call дубли
    Call Удалить_Пустоты

    Nav3 = [Строк] + 2
    Range("A3", Cells(Nav3, 3)).Value = Range("A3", Cells(Nav3, 3)).Value ' Весь массив заменяем значениями
    Columns("L:L").Select
    With Selection.Font
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
    End With
    Range("L2").Select
    ActiveSheet.Range("$A$3:$N$50000").RemoveDuplicates Columns:=3, Header:= _
        xlYes
    
    ' форматируем границы таблицы
    Cells.Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

   
    Range("Загружен").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlHairline
    End With
    
   ' Место хранения вправо
  Nav = [Строк] + 2
  Range("B2", Cells(Nav, 1)).Select
  With Selection
        .HorizontalAlignment = xlRight
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    
    ' Цена с копейками
'
    Nav = [Строк] + 2
    Range("H3", Cells(Nav, 8)).Select
    Selection.NumberFormat = "0.00"
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    
    ' Наименование переносить по словам
'
  Nav = [Строк] + 2
    Range("E3", Cells(Nav, 5)).Select
  With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    
    ' Формат вправо
'
  Nav = [Строк] + 2
    Range("C3", Cells(Nav, 3)).Select
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    
  Nav = [Строк] + 2
    Range("G3", Cells(Nav, 14)).Select
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With

    
    Calculate
      
'    Application.Goto Reference:="Загружен"
'    Call CommandButton1_Click
    
    
    ' Удалить_диапазон()
   Application.Goto Reference:="Загружен"
   ActiveWorkbook.Names("Загружен").Delete
'    Call Valid



    ActiveSheet.DisplayPageBreaks = False ' устраняет мерцание кнопок
    Application.ScreenUpdating = True 'False ' True
''
'     End If
End Sub



Sub Очистить_Рукописку()
'


'
    Application.ScreenUpdating = False 'False ' True
    Sheets("Инвентаризационная_ведомость").Select
    
    If [Строк] < 2# Then
    Exit Sub
    End If
    Nav = [Строк] + 3
   

    Range("A3", Cells(Nav, 15)).Select
    Selection.Delete Shift:=xlUp
    Range("A3:N3").ClearContents
    Range("A3").Select
'    Call Valid
    
    Application.ScreenUpdating = True 'False ' True
    

End Sub


Вот сам код:
Всем Спасибо !
 
Заказ свободен. ТС хочет именно исправить существующий код (я предложил написать заново).
    Как можно, переставляя доски в телеге получить на выходе феррари — я не понимаю  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Давайте я попробую. Пишу в личку
Изменено: New - 31.08.2023 19:08:13
 
Цитата
Jack Famous написал:
Как можно, переставляя доски в телеге получить на выходе феррари
обработать напильником 😁
 
Цитата
написал:
обработать напильником 😁
мало. тут без синей изоленты не обойтись  :(  
Вполне такой нормальный кинжальчик. Процентов на 100
 
Обменялись
 
Огромное спасибо автору "New".
Задача успешно решена и все договорённости состоялись.
Всем удачи и процветания!  
Страницы: 1
Наверх