Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Использование массива, ускорить работу excel - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Использование массива, ускорить работу excel (Макросы/Sub)
Использование массива, ускорить работу excel
makc1985 Дата: Пятница, 03.10.2014, 08:55 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Здравствуйте!
Подскажите пожалуйста как мне ускорить работу следующего кода
Есть два файла СД_Договоры и Журнал синхронизации, из файла СД_Договоры копируются ячейки с датой изменения больше последней даты синхронизации
Это делается в цикле
Но строк в документе примерно 1500, и он уж че то медленно отрабатывает.
Подскажите как здесь можно использовать массив, чтобы он не каждую строку копировал-вставлял, а скопировал строки в массив, а из него в файл Журнал синхронизации вставил
Ведь это же намного ускорит отработку.

[vba]
Код

Dim otdel, dateS As String
    Dim WS, WS1 As Worksheet
    Dim lRow, fRow, i As Integer
      
fRow = Sheets("Договоры").Cells(Sheets("Договоры").Rows.Count, 3).End(xlUp).Row + 1
      
Set WS = ActiveWorkbook.Worksheets("Договоры")
Set WS1 = ActiveWorkbook.Worksheets("Реквизиты")
otdel = ActiveWorkbook.Worksheets("Реквизиты").Range("C9").Value
dateS = WS1.Range("E4:E1000000").SpecialCells(xlCellTypeBlanks)(0) 'Находим последнюю дату синхронизации СД_Договоры

  Call OpenedBook("СД_Договоры") ' открываем файл СД_договоры
  Workbooks.Item("СД_Договоры.xlsm").Sheets(1).Activate ' Активируем лист1 в СД_договоры
     ' В этом месте берется каждая ячейка из СД_Договоры и копируется в файл Журнал синхронизации  
         With ActiveSheet
         lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
         For i = 2 To lRow
             If (.Cells(i, "AF") > CDate(dateS)) Then
                 WS.Cells(fRow, "B") = otdel
                 .Cells(i, "A").Resize(1, 33).Copy: WS.Cells(fRow, "C").PasteSpecial xlPasteValues
                 .Cells(i, "AF").Copy: WS.Cells(fRow, "A").PasteSpecial xlPasteValues
                  
                 fRow = fRow + 1
             End If
         Next i
     End With

[/vba]
 
Ответить
СообщениеЗдравствуйте!
Подскажите пожалуйста как мне ускорить работу следующего кода
Есть два файла СД_Договоры и Журнал синхронизации, из файла СД_Договоры копируются ячейки с датой изменения больше последней даты синхронизации
Это делается в цикле
Но строк в документе примерно 1500, и он уж че то медленно отрабатывает.
Подскажите как здесь можно использовать массив, чтобы он не каждую строку копировал-вставлял, а скопировал строки в массив, а из него в файл Журнал синхронизации вставил
Ведь это же намного ускорит отработку.

[vba]
Код

Dim otdel, dateS As String
    Dim WS, WS1 As Worksheet
    Dim lRow, fRow, i As Integer
      
fRow = Sheets("Договоры").Cells(Sheets("Договоры").Rows.Count, 3).End(xlUp).Row + 1
      
Set WS = ActiveWorkbook.Worksheets("Договоры")
Set WS1 = ActiveWorkbook.Worksheets("Реквизиты")
otdel = ActiveWorkbook.Worksheets("Реквизиты").Range("C9").Value
dateS = WS1.Range("E4:E1000000").SpecialCells(xlCellTypeBlanks)(0) 'Находим последнюю дату синхронизации СД_Договоры

  Call OpenedBook("СД_Договоры") ' открываем файл СД_договоры
  Workbooks.Item("СД_Договоры.xlsm").Sheets(1).Activate ' Активируем лист1 в СД_договоры
     ' В этом месте берется каждая ячейка из СД_Договоры и копируется в файл Журнал синхронизации  
         With ActiveSheet
         lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
         For i = 2 To lRow
             If (.Cells(i, "AF") > CDate(dateS)) Then
                 WS.Cells(fRow, "B") = otdel
                 .Cells(i, "A").Resize(1, 33).Copy: WS.Cells(fRow, "C").PasteSpecial xlPasteValues
                 .Cells(i, "AF").Copy: WS.Cells(fRow, "A").PasteSpecial xlPasteValues
                  
                 fRow = fRow + 1
             End If
         Next i
     End With

[/vba]

Автор - makc1985
Дата добавления - 03.10.2014 в 08:55
Alex_ST Дата: Пятница, 03.10.2014, 09:56 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Разбираться в Вашем фрагменте кода, извините, лень...
Попробуйте тупо перед началом цикла отключить все возможные "тормоза"[vba]
Код
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
[/vba]
а после окончания - обратно включить[vba]
Код
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Пятница, 03.10.2014, 09:58
 
Ответить
СообщениеРазбираться в Вашем фрагменте кода, извините, лень...
Попробуйте тупо перед началом цикла отключить все возможные "тормоза"[vba]
Код
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
[/vba]
а после окончания - обратно включить[vba]
Код
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
[/vba]

Автор - Alex_ST
Дата добавления - 03.10.2014 в 09:56
makc1985 Дата: Пятница, 03.10.2014, 10:52 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Попробуйте тупо перед началом цикла отключить все возможные "тормоза"

Ох ты ! Сработало быстрее намного!
 
Ответить
Сообщение
Попробуйте тупо перед началом цикла отключить все возможные "тормоза"

Ох ты ! Сработало быстрее намного!

Автор - makc1985
Дата добавления - 03.10.2014 в 10:52
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Использование массива, ускорить работу excel (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!