Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134

Почему при Do - Loop приложение зависает

26.11.2012, 17:08. Показов 3926. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Нашел у J. Walkenbach листинг, которым хотел воспользоваться, но при выполнении (в части Do....Loop), комп зависает. Пожалуйста, подскажите причину.

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
49
50
51
Private Sub SelectByFormat()
    Dim FirstCell As Range, FoundCell As Range
    Dim AllCells As Range
 
    If Val(Application.Version) < 10 Then
        MsgBox "Нужен Excel 2002 и выше"
        Exit Sub
    End If
'    ActiveWindow.DisplayGridlines = Not _
                    ActiveWindow.DisplayGridlines
    
    ActiveSheet.Cells.Delete
 
    Randomize Timer
    For i = 1 To 20
        For j = 1 To 10
            Cells(i, j).Value = Int((100 * Rnd()) + 1)
        Next j
    Next i
 
    [a3] = "aple": [b2] = "dog": [c5] = "floor"
    [d9] = "tobacco"
    Union([a3], [b2], [c5], [d9]).Font.Italic = True
 
    With Application.FindFormat
        .Interior.ColorIndex = xlNone '
        .Font.Bold = False
        .Font.Italic = True
    End With
    
    Set FirstCell = Cells.Find(What:="", SearchFormat:=True)
    
    If FirstCell Is Nothing Then
        MsgBox "Не найдено."
        Exit Sub
    End If
 
    Set AllCells = FirstCell
    Set FoundCell = FirstCell
 
    Do
        Set FoundCell = Cells.FindNext(After:=FoundCell)
        Set AllCells = Union(FoundCell, AllCells)
            If FoundCell.Address = _
                        FirstCell.Address Then Exit Do
    Loop
 
    AllCells.Select
        MsgBox " Нашли:    " & AllCells.Count
        
End Sub
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2012, 17:08
Ответы с готовыми решениями:

Почему зависает программа при бесконечном цикле Do - Loop
Вот собственно программа которую я делал. Но почему-то зависает при старте действий. Public Class Form1 Private Sub...

Почему зависает приложение?
Создал WindowsFormsApplication, далее в форме создал кнопку, которая вызывает void в котором присутствует цикл. void работает но...

Зависает при выходе приложение
Доброй ночи. Имеется консольное приложение, которое убивает процессы всех открытых файлов. Проблема состоит в том что при выходе оно...

22
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
26.11.2012, 18:23
У меня тоже не работает (использую Excel 2007). Верней при работе находятся ячейки листа, включая пустые, за пределами заполненного массива без учета форматирования. Так и неразобрался пока, как это исправить. А ещё меня немного огорчает, что даже пример из книги Уокенбаха не имеет полного объявления переменных (i, j).

P.S. Чтобы понять причину подвисания пробуйте отладку программы в пошаговом режиме выполнения, запуск с точками останова, консоль Immediate и окно Locals.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 18:39  [ТС]
to mc-black. Извиняюсь, но при переносе листинга взял только часть от sub .... до...End sub., a Dim i%, j as Integer было выше, под Option Explicit. А так - пробовал я и Stop, и F8, и... И ничего.
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 18:55
немного поправил:
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
49
50
51
52
53
Private Sub SelectByFormat()
    Dim FirstCell As Range, FoundCell As Range
    Dim AllCells As Range
 
    If Val(Application.Version) < 10 Then
        MsgBox "Нужен Excel 2002 и выше"
        Exit Sub
    End If
'    ActiveWindow.DisplayGridlines = Not _
                    ActiveWindow.DisplayGridlines
    Dim StrSearsh As String
    StrSearsh = InputBox("Введите значение", "", "floor")
    If StrSearsh = "" Then MsgBox "Нет значения поиска": Exit Sub
    ActiveSheet.Cells.Delete
 
    Randomize Timer
    For i = 1 To 20
        For j = 1 To 10
            Cells(i, j).Value = Int((100 * Rnd()) + 1)
        Next j
    Next i
 
    [a3] = "aple": [b2] = "dog": [c5] = "floor"
    [d9] = "tobacco"
    Union([a3], [b2], [c5], [d9]).Font.Italic = True
 
    With Application.FindFormat
        .Interior.ColorIndex = xlNone '
        .Font.Bold = False
        .Font.Italic = True
    End With
    
    Set FirstCell = Cells.Find(What:=StrSearsh, SearchFormat:=True)
    
    If FirstCell Is Nothing Then
        MsgBox "Выражение   " & StrSearsh & "   не найдено."
        Exit Sub
    End If
 
    Set AllCells = FirstCell
    Set FoundCell = FirstCell
 
    Do
        Set FoundCell = Cells.FindNext(After:=FoundCell)
        Set AllCells = Union(FoundCell, AllCells)
            If FoundCell.Address = _
                        FirstCell.Address Then Exit Do
    Loop
 
    AllCells.Select
        MsgBox " Нашли:    " & AllCells.Count
        
End Sub
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 19:05  [ТС]
To Romas654. Спасибо, конечно, но значение "floor" можно найти гораздо легче и проще. Тут идея в том, что листинг, как я это понимаю, должен выделить все ячейки листа с определенным форматированием (в даном случае - Font.Italic = True ....), как не смежные диапазоны, для возможности групповой обработки.
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 19:39
А, это про поиск форматов... не разглядел сперва Тогда строку 42 в исходном коде заменить на:
Visual Basic
1
Set FoundCell = Cells.Find(What:="", After:=ActiveCell, SearchFormat:=True)
т.е. как бы новый поиск но с параметром "после"
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 20:12  [ТС]
To Romas654. еще раз спасибо. Но в моем первом посте указано, что это - творчество J. Walkenbach "Профессиональное программирование на VBA в Excel 2003". И у меня оно не работает. ПОЧЕМУУУУ??? Разобраться хочу. Там есть пару выражений, которые я не понимаю до конца. А конкретно - вот это:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
    Set AllCells = FirstCell
    Set FoundCell = FirstCell
 
    Do
        Set FoundCell = Cells.FindNext(After:=FoundCell)
        Set AllCells = Union(FoundCell, AllCells)
            If FoundCell.Address = _
                        FirstCell.Address Then Exit Do
    Loop
 
    AllCells.Select
        MsgBox " Нашли:    " & AllCells.Count
Добавлено через 24 минуты
to Romas654. Так, на быструю руку накидал, все работает, но вопрос остался: "Почему сачкует Уокенбах?"
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
Private Sub SelectByFormat()
    Dim FirstCell As Range, FoundCell As Range
    Dim AllCells As Range, mRng As Range
    Dim i%, j%
    Dim s1$, s2$
    Dim aCell As Object
 
    If Val(Application.Version) < 10 Then
        MsgBox "Íåîáõ³äíèé Excel 2002 ³ âèùå"
        Exit Sub
    End If
'    ActiveWindow.DisplayGridlines = Not _
                    ActiveWindow.DisplayGridlines
    Application.FindFormat.Clear
                    
    
    ActiveSheet.Cells.Delete
 
    Randomize Timer
    For i = 1 To 20
        For j = 1 To 10
            Cells(i, j).Value = Int((100 * Rnd()) + 1)
        Next j
    Next i
 
    [a3] = "aple": [b2] = "dog": [c5] = "floor"
    [d9] = "tobacco"
    Union([a3], [b2], [c5], [d9]).Font.Italic = True
 
    Set mRng = Range([a1], [j20])
     With Application.FindFormat
        .Clear
'        .Interior.ColorIndex = xlNone ' íåìàº
        .Font.Bold = False
        .Font.Italic = True
    End With
    Set FirstCell = mRng.Find(What:="", SearchFormat:=True)
        FirstCell.Select
    For Each aCell In mRng.Cells
            If aCell.Font.Bold = False And _
                aCell.Font.Italic = True Then
                Union(Selection, aCell).Select
            End If
    Nex
end sub
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 20:23
Не работает потому что в 5 строке (в коде из последнего сообщения) findnext в упор не хочет понимать заданные ранее параметры поиска, т.е. поиск именно форматирования, вместо этого ф-ция тупо ищет ячейки с пустым значениям игнорируя заданные ранее параметры. Возможно, это работало правильно в прежних версиях офиса, но в моей 2010 нет. как видимо и в вашей.

Как я понял, что происходит в коде:
AllCells это все найденные, FoundCell найденная в текущий момент.
присваивается обеим этим диапазонам значение ранее найденного первого элемента (он уже подходит по параметрам поиска). далее, в цикле, в диапазон с помощью поиска помещается следующая найденная ячейка, причем найденная после последней подходящей After:=FoundCell. С помощью Union к имеющимся диапазонам добавляется найденный. Цикл заканчивается, когда поиск возвращается к первой найденной (проверяется по адресу, т.е. B2). Диапазоны выделяются для наглядности и выводится их кол-во...
Вот такая сказка американского программиста на русский лад
1
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
26.11.2012, 20:29
Цитата Сообщение от Romas654 Посмотреть сообщение
Тогда строку 42 в исходном коде заменить на:
Спасибо, Romas654!

Igor_Tr, Ну по поводу Дж.Уокенбаха - он ведь книгу для Excel 2002 писал, в нем вы этот код наверняка не проверяли, не исключено что там оно бы сработало. А потом, пример построен на небольшой модификации примера метода .FindNext из справочной системы Excel - там поиск ведется конечно без форматирования, но в общем-то следовало ожидать работоспособности кода от Excel. Кто ж знает, может пример нормально не потестировал. Еще один момент - работоспособности кода Уокенбаха следовало бы ожидать, на мой взгяд MS здесь метод .FindNext реализовали не до конца (и поэтому нелогично).
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 20:31  [ТС]
Больше всего у меня было вопросов к этому - Set FoundCell = FirstCell. Со всем, что Вы написали, я согласен. Действительно, бегает по пустым ячейкам
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 20:34
Цитата Сообщение от mc-black Посмотреть сообщение
MS здесь метод .FindNext реализовали не до конца (и поэтому нелогично).
Видимо так. Я о том и написал, что проведя эксперимент выяснил, что FindNext ищет только значение без учета форматирования. Завтра на работе попробую в 2003 офисе
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
26.11.2012, 20:41
Может обратиться в тех. поддержку Microsoft, чтобы в Office 2012 это поправили ближайшим патчем?

Добавлено через 5 минут
Только что проверил в 2003 - баг один-в-один повторяется. Есть смысл проверить только в 2002. Тогда, если что, привет Дж.Уокенбаху)))
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 20:41
Ага... А они такие в ответ:
Мы, конечно, примем вашу жалобу, только сперва назовите вашу фамилию, адрес и номер лицензии вашего продукта
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 20:47  [ТС]
Кому-то смешно, а мне - грусно. Просто подсказать выход именно в листинге J. Walkenbach? to Romas654: поменял в посте 1 Set FoundCell = FirstCell на Set FoundCell = Cells.Find(What:="", After:=ActiveCell, SearchFormat:=True). Мертвому - припарки, к сожалению.
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 20:50
Не понял, не работает что ли?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 20:52  [ТС]
Нет. Виснет, зараза. Конкретизирую. В моем посте #1 изменил строку 40.
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 20:54
Странно. Вот пример. Попробуйте.
Какая версия офиса?
Вложения
Тип файла: xls выделение формата.xls (41.0 Кб, 7 просмотров)
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.11.2012, 21:04  [ТС]
2003. На ноутбуке.

Добавлено через 6 минут
Заработало!!!!! После строки 32 в посте #1 нужно было добавить (по Вашему, т.е. Romas654) предложению - FirstCell.Activate. Спасибо!!!!
0
117 / 31 / 2
Регистрация: 16.11.2012
Сообщений: 65
26.11.2012, 21:08
А, точно. это я не исправил после экспериментов.
Вот так работает и без выделения ячеек.
Visual Basic
1
Set FoundCell = Cells.Find(What:="", After:=FoundCell, SearchFormat:=True)
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
26.11.2012, 21:10
Цитата Сообщение от Romas654 Посмотреть сообщение
Ага... А они такие в ответ:
Мы, конечно, примем вашу жалобу, только сперва назовите вашу фамилию, адрес и номер лицензии вашего продукта
Я пользуюсь только лицензионными продуктами, что касается Windows и Office. Так что это не вопрос.


Цитата Сообщение от Igor_Tr Посмотреть сообщение
Нет. Виснет, зараза. Конкретизирую. В моем посте #1 изменил строку 40.
Примените 6-й пост к вашему коду в топике и будет Вам счастье. Менять надо строку с FindNext на Find с теми параметрами, которые Вам написали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2012, 21:10
Помогаю со студенческими работами здесь

Зависает приложение при отладке
Здравствуйте. Пробую на зуб события C#. Идея приложения - таймер выключения компьютера, содержащий 2 поля NumericUpDown, 1 label для вывода...

Зависает приложение при копировании
у меня есть приложение который копирует файлы вот этом цикле взывается метод копирование: foreach (FileInfo dir in file) ...

Зависает приложение при обращении к IdHTTP1.Get
Ниже описанная функция проверяет подключение к Интернету - возвращает True, если доступ к Интернету есть, иначе False. Всё проходит...

Зависает приложение при нажатии на кнопку
Почему висит окошко при нажатии на кнопку?помогите!новичок в этом совсем. не могу разобраться from dialog2 import * import sys ...

При обращении к процедуре приложение зависает
При обращении к процедуре программа зависает! Помогите разобраться! вот обращение к ней: MiN2(S, S / 5.3, S / 50); А вот код...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru