Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39

Обработка ошибок

22.01.2016, 19:49. Показов 1611. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю сумму разных листов (месяцев) за текущий год
Т.к. листы с начала года ещё не существуют, необходимо этот момент игнорировать.
Существующие (какие я знаю)) способы не помогают. Спасибо.
---------------
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub god()
 
On Error Resume Next            ' при ошибке продолжать
Dim lists As Byte
Dim rez As Single, sum As Single
'On Error GoTo jok            ' как вариант переход при ошибке
    For lists = 1 To 12
    MsgBox lists
  ' If Worksheets(lists) Is Nothing Then GoTo jok   ' И так пробовал
     rez = Worksheets(lists).cells(16, 3).Value        'Здесь останов, если индекс(lists) > существующих листов
    MsgBox rez
        sum = sum + rez
   '     MsgBox sum
    Next lists
    jok:
     MsgBox sum
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2016, 19:49
Ответы с готовыми решениями:

Обработка ошибок
Можно в одной процедуре использовать 2 раза On Error GoToсоответственно для одной части кода и для другой части кода? Если можно, то...

Обработка ошибок в ворде...
Вот код, который в каждой ячейке первого столбца делает левое поле равным 0 см. Если имеет место объединения ячеек, то возникает ошибка. ...

Обработка различных ошибок в программе.
Есть прога. Работает хорошо, НО: из-за всяких юзеров иногда возникают ошибки (разных категорий) можно ли сделать так чтобы программа...

19
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.01.2016, 20:27
Перебирайте только существующие листы
1
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
22.01.2016, 20:31
Visual Basic
1
2
3
4
Dim ws As Worksheet, sum#
For Each ws In Worksheets
    sum = sum + ws.[C16]
Next
1
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
23.01.2016, 11:06  [ТС]
Насчёт существующих листов всё понятно. Но в том то и фишка - год начался и листов заполнено(и, что важно, других даже пустых пока нет!) только часть. А цикл весь - на 12 месяцев.
И надо обработать только существующие, без остановов на ошибки.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
23.01.2016, 11:13
pashulka, Вам код рабочий, перебирающий только существующие листы, дал. Вы хоть проверяли?


Вот еще вариант.

Visual Basic
1
2
3
4
5
6
   For Each sh In ThisWorkbook.Sheets
       rez = sh.Cells(16, 3).Value 
       MsgBox rez
       sum = sum + rez
   Next sh
   MsgBox sum
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
23.01.2016, 11:14  [ТС]
pashulka, Спасибо, идею проверил, но так же на строке 3 (Вашего примера) "Run-time error '9': Subscript out of range" (( при достижении несуществующего пока листа.
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,937
Записей в блоге: 4
23.01.2016, 11:18
как минимум
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
dim sh as worksheet
dim sum,rez
sum=0
on error resume next
For Each sh In ThisWorkbook.Sheets
       rez=0
       rez = sh.Cells(16, 3).Value 
       debug.print sh.name,rez
       sum = sum + rez
Next sh
MsgBox sum
1
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
23.01.2016, 11:20
Цитата Сообщение от Disilly Посмотреть сообщение
но так же на строке 3 (Вашего примера) "Run-time error '9': Subscript
Прикрепите свой документ, посмотрим.
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
23.01.2016, 11:26  [ТС]
SoftIce, и Вам спасибо, но это по сути то же самое.
Поясню подробнее: в моей существующей Workbook уже 85 листов(за несколько лет). Последний №85 - Янв2016
На текущий год будет цикл от 85 до (85+11). Но(!) Листов Дальше 85 пока нет. Хочется оставить цикл на весь год, чтобы не корректировать код ежемесячно, но цикл вылетает в error при попытке взять данные из несуществующего (пока!) листа. Желательно, хотя бы получить в таком случае "0" . Я не профи в VBA, тут и заморочка. За помощь спасибо.

Добавлено через 1 минуту
Документ огромный, веду его несколько лет - домашняя бухгалтерия, "украшая" по мере развития, всякими графиками-расчётами. Суть я изложил выше.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
23.01.2016, 11:30
Цитата Сообщение от Disilly Посмотреть сообщение
в моей существующей Workbook уже 85 листов(за несколько лет). Последний №85 - Янв2016
И Вы хотите перебирать с 85 листа по последний существующий?
А откуда программе знать, что начинать надо с 85 листа?
Или это 12 х 7 = 84 + 1 ? А когда появится февральский? В начале февраля или конце января?
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,937
Записей в блоге: 4
23.01.2016, 11:31
тогда может так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dim sh as worksheet
dim sum,rez,sname
sum=0
on error resume next
For Each sh In ThisWorkbook.Sheets
       rez=0
       sname=sh.name
if sname like "*2016" then
       rez = sh.Cells(16, 3).Value 
       debug.print sh.name,rez
       sum = sum + rez
endif
Next sh
MsgBox sum
0
Эксперт NIX
3305 / 933 / 201
Регистрация: 14.01.2013
Сообщений: 4,769
23.01.2016, 11:39
Цитата Сообщение от Disilly Посмотреть сообщение
For lists = 1 To 12
Visual Basic
1
For lists = 1 To Worksheets.Count
Такой вариант не подходит?
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
23.01.2016, 11:54  [ТС]
Я пишу цикл For n=85 to (85+11)
...
Next n
В цикле получение и суммирование данных по одной и той же ячейке с каждого листа.
С существующих листов (как все подсказывают) это даже для меня не проблема. Но, цикл рассчитан вперёд на год,
с учётом несуществующих (пока!- потом появятся) листов. переменную цикла менять ежемесячно - не хочется, да и забыть можно. Так вот, при запросе несуществующих пока данных - цикл в Error. Хочется, чтобы он отмотал положенное, не останавливая весь код, пусть данных и не возьмёт из несуществующих (пока!) листов.

Добавлено через 1 минуту
For Kubuntovod:
Опять же получение количества листов и сумма существующих(!) данных (
Спасибо.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
23.01.2016, 11:56
Тогда For n=85 to Worksheets.Count чем не устраивает?
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,937
Записей в блоге: 4
23.01.2016, 12:04
я не использую числовую индексацию --только отбор по имени, у вас это месяц ГОД , что равнозначно *2016
а год можно запрашивать или поместить в ячейку на главном листе
Visual Basic
1
if sname like "*2016" then
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
23.01.2016, 13:07  [ТС]
Наверное, я плохо объясняю. Суть не в том чтобы как то перебрать существующие листы в книге - это просто и по имени и по индексу, а сделать цикл перебора (12 проходов) вперёд на год, на несуществующие пока листы. То есть, по мере появления листа (в феврале 2016 появится второй лист цикла, в марте - 3-й итд). Не изменяя каждый раз сам цикл и его переменные. Не правя код
В этом случае программа отрабатывает только уже сформированные листы ( у меня они сами формируются по окончании месяца на следующий, сохраняя, что важно структуру) и натыкается на error при попытке взять данные с несуществующего листа -будущего месяца. Все способы "On Error" всё-равно стопорят код.
Вам спасибо за участие.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
23.01.2016, 13:13
Цитата Сообщение от SoftIce Посмотреть сообщение
Тогда For n=85 to Worksheets.Count чем не устраивает?


Объясните, чем, допустим, этот код вас не устроит ? Это перебор с 85 по 85 сейчас. Когда добавится еще один лист в феврале, то будет перебор с 85 по 86, в марте с 85 по 87 ... и т.д.

Что не так?


Зачем перебирать листы, которых заведомо нет?
1
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
23.01.2016, 14:22  [ТС]
Спасибо, я понял это сразу. Просто и понятно и, наверное, на этом варианте и придётся остановиться. Правда, я хотел ограничиться 12 выборками, и получить нули вместо несуществующих данных (график) а здесь бесконечно.
Но, СПАСИБО.
Похоже, тему закрываем...

Добавлено через 13 минут
Действительно, лучший способ решить проблему - не создавать её!
0
 Аватар для pashulka
4139 / 2243 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
23.01.2016, 14:26
Цитата Сообщение от Disilly Посмотреть сообщение
идею проверил, но так же на строке 3 (Вашего примера) "Run-time error '9': Subscript out of range" (( при достижении несуществующего пока листа
Нельзя достичь того, чего пока не существует.

A вот ошибку получить можно, если в ячейке C16 будет текст, но даже в этом случае - это будет несоответствие типов, но никак не Subscript out of range

P.S. Если очень хочется решить задачу через ...

Visual Basic
1
2
3
4
5
6
7
8
9
On Error Resume Next
For i = 1 To 12
    Set ws = Worksheets(i)
    If Err.Number = 0 Then
       res = ws.[C13]: MsgBox res
    Else
       res = 0: MsgBox res
    End If
Next
0
1 / 1 / 0
Регистрация: 22.01.2016
Сообщений: 39
24.01.2016, 12:53  [ТС]
Кому интересно: проблему 12-ти листов(год) "объехал на кривой козе" - вставил счётчик на 12 внутрь цикла и соответствующий выход Всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2016, 12:53
Помогаю со студенческими работами здесь

Обработка ошибок в циклических массивах
Доброго времени дня. Друзья, столкнулся с такой проблемой: В ниже приведенном коде обработчик ошибок отсылает к строке 123, происходит...

Обработка ошибок в каждом WorkSheet
Здравствуйте, такая ситуация обрабатываются данные в каждом WorkSheet в цикле по их количеству, возникают ошибки при обработке некоторых...

Обработка ошибок в функции с возвратом результата
В функции делаю обратоку ошбок. Хочу в случае определенной ошибки вернуть заданный результат. Например, если у нас не выделенно ни одной...

Обработка ошибок в VBA. Run-time error 58 (File already exists)
Здравствуйте уважаемые завсегдатаи данного форума!))) Я новичок потому прошу не слишком критично относиться к моему вопросу. А вот и...

Глобальный обработчик ошибок. Если отключить обработчик ошибок в одной из процедур, будет ли он работать в других?
Есть какой то код Sub main On error goto ErrorLine 'тут какой-то код call fng_1 'тут вызывается новая процедура 'тут какой-то...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru