Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
4 / 4 / 4
Регистрация: 01.11.2009
Сообщений: 555
1

Зависает макрос наглухо

07.07.2016, 10:38. Просмотров 2635. Ответов 7
Метки нет (Все метки)

Добрый день.
с утра написал - работал быстро, буквально пару секунд.
сейчас же висит на полминуты и проц на 100% гасит.
Как вычленить проблему?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Public Sub Report()
    '   Очищаем диапазон от предыдущих сотрудников
        ActiveWorkbook.Worksheets("Досье").Range("C6:N14").ClearContents
    '   Получаем имя ФИО сотрудника
       Dim User As String
       User = ActiveWorkbook.Worksheets("Досье").Range("C3").Value
 
    '   Обходим листы
        For i = 1 To 12
 
            '   Последняя строка
            lLastRow = Worksheets(CStr(i)).UsedRange.Row + Worksheets(CStr(i)).UsedRange.Rows.Count - 1
        '   Обходим строки листа
            For k = 1 To lLastRow
                'arrRep(i, k) = ActiveWorkbook.Worksheets("Досье").Cell("C3").Value
                Dim U_name
                U_name = ActiveWorkbook.Worksheets(CStr(i)).Cells(k, 1).Value
            '   Если ФИО совпало
                If U_name = User Then
               Dim ii
               ii = i - 1
                    For f = 0 To 9
                    Dim ff
                    ff = f + 2
                       '   Пишем сразу на лист
                        Dim i2, f2
                        i2 = i + 2
                        f20 = f + 6
                        ActiveWorkbook.Worksheets("Досье").Cells(f20, i2) = ActiveWorkbook.Worksheets(CStr(i)).Cells(k, ff).Value
                    Next
 
                End If
            Next
        Next
End Sub
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2016, 10:38
Ответы с готовыми решениями:

Зависает макрос на выделение диапазона ячеек
Создала макрос на выделение ячеек через одну. Тестировала на таблице с 20-ю строками - все...

Макрос вставки файлов в листы-Необходимо изменить ниже приведённый макрос
Необходимо изменить ниже приведённый макрос, взятый с форума. Необходима помощь. Буду признателен....

Макрос: Написать макрос по сравнению двух таблиц для нахождения несоответствий...
знатоки, прошу помощи в еще одном деле: есть два листа, --в одном список: яблоко, груша, слива, ...

Макрос: из PowerPoint развернуть Exel и вызвать уже в нём макрос
Собственно сабж. Работая в презентации PowerPoint нужно по клику на кнопку с прикреплённым макросом...

7
6617 / 2636 / 488
Регистрация: 19.10.2012
Сообщений: 7,954
07.07.2016, 10:54 2
зачем внутри цикла объявлять

Visual Basic
1
2
3
               Dim ii
                    Dim ff
                        Dim i2, f2
И что там за f20?
А вообще если оно 12 раз гоняет по миллиону ячеек, а там внутри ещё копирования, и может каждый чих вызывает пересчёт кучи формул - вполне может долго работать.
Выводите статусбар чтоб контролировать что происходит, если конечно это нормально.
А вычленить можно пройдя пошагово.
И пересчёт бывает полезно отключать, если конечно не нужен в процессе.
И обновление экрана.
1
5334 / 1400 / 330
Регистрация: 23.12.2010
Сообщений: 2,073
Записей в блоге: 1
07.07.2016, 11:21 3
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Public Sub Report()
    Dim i&, k&, F&, ff&, i2&, f20&, lLastRow&, User As String, Ar
'   Очищаем диапазон от предыдущих сотрудников
    ActiveWorkbook.Worksheets("Досье").Range("C6:N14").ClearContents
'   Получаем имя ФИО сотрудника
    User = ActiveWorkbook.Worksheets("Досье").Range("C3").Value
    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With
    '   Обходим листы
    For i = 1 To 12
        With Worksheets(CStr(i))
             '   Последняя строка
            lLastRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
            Ar = .Range("A1:K" & lLastRow).Value
            '   Обходим строки  массива
            For k = 1 To lLastRow
                '   Если ФИО совпало
                If Ar(k, 1) = User Then
                    'ii = i - 1
                    For F = 0 To 9
                        ff = F + 2
                        '  Пишем сразу на лист
                        i2 = i + 2
                        f20 = F + 6
                        ActiveWorkbook.Worksheets("Досье").Cells(f20, i2) = Ar(k, ff)
                    Next
                End If
            Next
        End With
    Next
    With Application
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
End Sub
Множество CStr(i) гасит.
Скорее всего появились данные, хоть пробел, где-то далеко внизу.

Добавлено через 11 минут
Вычленить на каком листе появились лишние пустые строки, активировать каждый лист, потом из окна Immediate запускать команду:
Visual Basic
1
Activesheet.UsedRange.select
и смотреть
или поставить остановку F9 на строке 16 (Ar = ..) и при отладке смотреть значение lLastRow.
0
4 / 4 / 4
Регистрация: 01.11.2009
Сообщений: 555
07.07.2016, 11:35  [ТС] 4
Лучший ответ Сообщение было отмечено Sasha_Smirnov как решение

Решение

Цитата Сообщение от Hugo121 Посмотреть сообщение
пересчёт бывает полезно отключать
Спасибо, были такие подозрения, сделал так и все ОК:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
'Ускоряем Excel путём отключения всего "тормозящего"
 Public Sub AccelerateExcel()
 
  'Больше не обновляем страницы после каждого действия
  Application.ScreenUpdating = False
 
  'Расчёты переводим в ручной режим
  Application.Calculation = xlCalculationManual
 
  'Отключаем события
  Application.EnableEvents = False
 
  'Не отображаем границы ячеек
  If Workbooks.Count Then
      ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
  End If
 
  'Отключаем статусную строку
  Application.DisplayStatusBar = False
 
  'Отключаем сообщения Excel
  Application.DisplayAlerts = False
 
 End Sub
'Включаем всё то что выключили процедурой AccelerateExcel
Public Sub disAccelerateExcel()
 
  'Включаем обновление экрана после каждого события
  Application.ScreenUpdating = True
 
  'Расчёты формул - снова в автоматическом режиме
  Application.Calculation = xlCalculationAutomatic
 
  'Включаем события
  Application.EnableEvents = True
 
  'Показываем границы ячеек
'  If Workbooks.Count Then
'      ActiveWorkbook.ActiveSheet.DisplayPageBreaks = True
'  End If
 
  'Возвращаем статусную строку
  Application.DisplayStatusBar = True
 
  'Разрешаем сообшения Excel
  Application.DisplayAlerts = True
 
End Sub
1
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
09.07.2016, 12:35 5
Немного не по теме, но еще в циклах бывает полезно вставлять команду DoEvent...
0
6617 / 2636 / 488
Регистрация: 19.10.2012
Сообщений: 7,954
09.07.2016, 23:57 6
DoEvents ничем цикл не ускорит, полезно может быть только другим задачам.
1
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
11.07.2016, 13:07 7
Я и не говорил, что ускорит, просто иногда не придется убивать процесс через диспетчер задач
0
6617 / 2636 / 488
Регистрация: 19.10.2012
Сообщений: 7,954
11.07.2016, 13:12 8
Ну если процесс зависнет - то убивать всё равно придётся. Другое дело что такой процесс хоть как-то даст возможность делать системе что-то ещё.

Не по теме:

А что, можно свой пост отмечать как лучший ответ? Не знал, нужно попробовать хоть раз открыть тему :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2016, 13:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Макрос делает копию листа и сохраняет в новую книгу, но макрос в новой не работает
Есть макрос в книге. Он копирует текущий лист, создает новую книгу и копирует в новую книгу лист. ...

Макрос, чтобы другой макрос распихал сам по N файлам
Может эта тема уже тут звучала, да поиск не помог... Просто проблема в том, что макрос постоянно...

Макрос, запускающий макрос из другого закрытого файла
Здравствуйте. Использую Office 2007. Поискал на форуме, не нашел ответа. Опишу подробно...

Сделать макрос в Word, вводишь строку и макрос произвольно меняет шрифт, цвет и размер для каждого слова из этого активного вордовского документа.
Началось VBA - лекций нет, только практика. Препод категоричеки отказывается что-нить объяснять,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.