Страницы: 1
RSS
Ошибка формирования диапазона в цикле.
 
Мяв!
Имеется код для создания КП. Из книги с расчетами копируется 4 листа, удаляются лишние формулы, строки и т.д.
При запуске этого кода в цикле, первая итерация отрабатывает без проблем, а вот далее код встает на строке 2260
При нажатии F5 код совершенно спокойно, и корректно продолжает выполняться.
Пр нажатии F8 delRange из Nothing превращается в Range
Адрес собран правильно, до этой строки аналогичные команды на других листах выполняются не однократно. Нужный лист активен.
В какую сторону покопать?
PS Код расположен в надстройке.

Код
Sub KomPred(wbold As Workbook, load_pic As String)
 ....
                        ', vbc As VBComponent
190 Set wbKP = ActiveWorkbook

200 With wbKP
220     With .Worksheets(gsMAIN_NAME)            '!!!
.....
280     End With
290     With .Worksheets(gsABOUT_NAME)           ' О НАС
...
430     End With
440     With .Worksheets(gsSMETA_NAME)           ' СМЕТА

 большая куча кода, в том числе удаление строк и столбцов
 
2100    End With

2110    With .Worksheets(gsOPTION_NAME)          ' ОПЦИИ
собираем адреса удаляемых строк
2250        s = Mid(s, 2)
на строке 2260 ошибка, диапазон Nothing
2260        Set delRange = .Range(s).EntireRow 
2261        delRange.Delete
....
2330    End With
2340    With .Worksheets(gsMAIN_NAME)           
...
2630    End With
2640 End With                                    'wbKP
 ...
End Sub
Изменено: RAN - 03.01.2021 14:09:14
 
RAN, Когда валерьянка закончится, взгляни на пост. что можно предположить по огрызку кода без данных, без ....?
Цитата
RAN написал:
В какую сторону покопать?
Единственно е что могу предположить что не поспевает приложение за ходом кошачий мысли.
А что все ж копится в S?
По вопросам из тем форума, личку не читаю.
 
Код
2130        For Each shp In .Shapes
2140            If TypeName(shp.DrawingObject) = "CheckBox" Then
2150                If InStr(sOptions, Mid(shp.DrawingObject.LinkedCell, InStr(shp.DrawingObject.LinkedCell, "!") + 1)) = 0 Then
2160                    s = s & "," & shp.TopLeftCell.Address
2170                    shp.Delete
2180                End If
2190            Else

В итоге имеем примерно следующее
Код
s = "$C$10,$C$15,$C$20"
Изменено: RAN - 03.01.2021 18:40:16
 
брррр. зачем так копить если потом Mid(s, 2). но это наверно не корневая причина.
теперь понятно.
Изменено: БМВ - 03.01.2021 19:00:15
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
без данных, без ....?
Калькулятор я выложить не могу, а ежели выложу код целиком, то с учетом его размера, количество жаждущих его вычитать будет обратно пропорционально его длине.
Поэтому я условно обозначил, что делает код.
Он исправно работает при создании единичного КП, а также всегда исправно срабатывает в цикле для первого файла.
Ошибка возникает со второго.
 
Андрей, попробуй отдать приложению управление через DoEvents
По вопросам из тем форума, личку не читаю.
 
В какой момент?
 
Да в любой, попробуй перед
Код
Set delRange = .Range(s).EntireRow
.   Если в отладчике все проходит, то что-то на уровне приложения не готово. я об этом и писал
Цитата
БМВ написал:
не поспевает приложение за ходом кошачий мысли.
По вопросам из тем форума, личку не читаю.
 
Индейская хижина.
Изменено: RAN - 03.01.2021 19:30:20
 
и в отладчике следующий шаг идет нормально?
По вопросам из тем форума, личку не читаю.
 
да
 
Код
Application.Wait (Now + TimeValue("0:00:05"))

тоже не помогло
 
Версия Excel?
По вопросам из тем форума, личку не читаю.
 
2010 у меня, 2019 у клиента
монопенисуально
 
Добрый день, коллеги!

А какова длина значения переменной s?
Изменено: sokol92 - 03.01.2021 20:20:07
Владимир
 
В пределах
Гоняю две копии файла с разным именем.
Первая работает полностью, на второй затык.
К тому-же, если проблема в переменной, то она нажатием F(5/8) не лечится.
Изменено: RAN - 03.01.2021 20:25:08
 
ну справедливости ради убрать баксы не сложно , но это  не поясняет возможность продолжения
Цитата
RAN написал:
При нажатии F5 код совершенно спокойно, и корректно продолжает выполняться.
По вопросам из тем форума, личку не читаю.
 
Так бывает, когда ошибка возникла где-то ранее. При отладке поведение может измениться. Для начала надо отключить все On error (если есть).
Владимир
 
Владимир, я написал код, потестили. Вроде все справно. А потом я обнаружил не отключенный On Error Resume Next.
Вот тут и понеслось! :(
 
Цитата
RAN написал:
не отключенный On Error Resume Next
в той же процедуре?
По вопросам из тем форума, личку не читаю.
 
Да, при обработке предыдущего листа.
Миш, мне не жалко, вот весь код КП. Ежели нать, могу и вызывающую процедуру показать
Скрытый текст

Код дополнялся в течение энного количества лет по принципу "не ломай то, что работает", так что на изящество не претендует
 
Андрей, я только уточнял где был  этот оператор. но  ....
Цитата
RAN написал:
по принципу "не ломай то, что работает",
похоже пора ломать декомпозировать и .....
По вопросам из тем форума, личку не читаю.
 
Для того, чтобы делать работающее новое, сначала нужно понять, почему не работает старое. Нет?
Сейчас имеется совершенно нормальная, и вполне корректно работающая строка кода. Но при каких-то условиях она перестает работать. При каких? На что ее менять?
 
для прикола, вынеси в отдельую процедуру удаление, в качестве параметра S.
По вопросам из тем форума, личку не читаю.
 
Для прикола работать не будет.
Нужно еще в качестве параметра книгу и лист. Тогда, может, и сработает.
 
Цитата
RAN написал:
Тогда, может, и сработает.
да я написал и про них, но опять не отправить было, а восстановил не полностью текст.
По вопросам из тем форума, личку не читаю.
 
Может попробовать собрать s по образу и подобию sOptions, добавить название листа перед ссылкой.
PS пишу с телефона
Изменено: msi2102 - 04.01.2021 10:25:46
 
янв 2021 13:55:50
Заставил я все-же сей код работать, но каким способом... :cry:
Перефразируя немного подпись Ігор Гончаренко,
Программисты - это люди, решающие проблемы, о существовании которых ОНИ не подозревали, методами, которых ОНИ не понимают

Заменил такой кусок кода
Код
2130        For Each shp In .Shapes
2140            If TypeName(shp.DrawingObject) = "CheckBox" Then
2150                If InStr(sOptions, Mid(shp.DrawingObject.LinkedCell, InStr(shp.DrawingObject.LinkedCell, "!") + 1)) = 0 Then
2160                    s = s & "," & shp.TopLeftCell.Address
2170                    shp.Delete
2180                End If
2190            Else
2200                If shp.Type <> msoComment Then
2210                    shp.Delete
2220                End If
2230            End If
2240        Next
2250        s = Mid(s, 2)
2260        Set delRange = .Range(s) 'Nothing
22600        Set delRange = delRange.EntireRow 'Nothing
2261        delRange.Delete

На такой
Код
            Dim t1
            On Error Resume Next
2130        For Each shp In .Shapes
                t1 = shp.Type
                If Err Then
                    Err.Clear
                Else
2140                If TypeName(shp.DrawingObject) = "CheckBox" Then
2150                    If InStr(sOptions, Mid(shp.DrawingObject.LinkedCell, InStr(shp.DrawingObject.LinkedCell, "!") + 1)) = 0 Then
                            s = shp.TopLeftCell.Address(0, 0)
2170                        shp.Delete
2260                        .Range(s).EntireRow.Delete
2180                    End If
2190                Else
2200                    If shp.Type <> msoComment Then
2210                        shp.Delete
2220                    End If
2230                End If
                End If
2240        Next
               On Error GoTo 0

Но вот почему при обращении к комментарию вместо t1 = msoComment получаю ошибку, так и не понял.
 
в старом коде длина s набиралась более 255 символов.  Range(s) - не работает с строками такой длины((

если комментарий Is Nothing ни смысла, ни возможности к нему обратиться нет
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,
1 Не набиралась
2 Not Is Nothing
Все это я перепроверил в первую очередь.
Страницы: 1
Наверх