Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Периодическая ошибка при обращении к листу из VBA, исправный код работает через раз. Office 365, 2016, 2013
 
Добрый день! Буду очень рад, если поможете мне решить вопрос. День уже потерял :(

Имеется исправный код, спокойно отрабатывающийся в моем Office 365. Код большой - 1500 строк, но элементарный. Например:
Код
If Sheets("Info С").Range("E47") = "1" Then
Sheets("1").Visible = True
Else
Sheets("1").Visible = False
End If
У всех моих коллег установлены Office 2016 (редко 2013).

Когда запускаешь файл у них, сначала выдает ошибку на ровном месте: не может скрыть существующий лист или скрыть столбик диаграммы
На второе исполнение макроса - все работает. И так по кругу.

С чем это может быть связано? Как преодолеть данную проблему?
 
Цитата
a.ibragimov.f написал:
Когда запускаешь файл
у нас нет такой возможности
Каждому For свой Next
 
Я не смог подгрузить файл, так как он весит 3,4 мб. Может быть у Вас получится его глянуть? Могу дать управление в Skype или отправить файл на почту.
Может быть есть какие-нибудь идеи, с чем это может быть связано?
 
Если не работает представленный код, попробуйте так
Код
    With Sheets("Info С")
        If .[E47].Value = "1" Then .Visible = xlSheetVisible Else .Visible = xlSheetHidden
    End With
Изменено: Nordheim - 22 Авг 2019 20:52:08
"Все гениальное просто, а все простое гениально!!!"
 
Проблема в том, что макрос абсолютно исправен. Работает без нареканий в новой office 365. Но при запуске в Office 2016 и младше, работает через раз: то не видит лист, который нужно скрыть, то все ок.
Поэтому, мне очень нужна помощь участника форума с иным Excel (не 365), чтобы он просмотрел и нашел решение.

Макрос работает в Office 365, а в Excel 2016 работает через раз: то спокойно скрывает нужную строку, то ее не может скрыть и выдает ошибку.
При этом код большой, я предполагаю, что какая-нибудь внутренняя ошибка исполнения.

Если кто-нибудь попробует открыть файл - думаю, встанет все на свои места :)

Помогите люди добрые :)
 
Текст ошибки какой выдает? На какой строке останавливается выполнение процедуры?
"Все гениальное просто, а все простое гениально!!!"
 
Код
Sub beforeprintPP()
'powerpoint sheets


If Sheets("Go!").Cells(6, 57).Value = "On" Then

If Sheets("Go!").Range("E35") = "1" Then
Sheets("II").Visible = True
Else
End If


If Sheets("Go!").Range("E36") = "1" Then
Sheets("ll").Visible = True
Else
End If

If Sheets("Go!").Cells(8, 57).Value = "On" Then
If Sheets("Go!").Range("E38") = "1" Then
Sheets("П-1").Visible = True
Else
End If
Else
End If

If Sheets("Go!").Cells(10, 57).Value = "On" Then
If Sheets("Go!").Range("E39") = "1" Then
Sheets("П-2").Visible = True
Else
End If
Else
End If

If Sheets("Go!").Range("E43") = "1" Then
Sheets("Serv").Visible = True
Else
End If

If Sheets("Go!").Range("E44") = "1" Then
Sheets("Sеrv").Visible = True
Else
End If

If Sheets("Go!").Range("E47") = "1" Then
Sheets("SL").Visible = True
Else
End If

If Sheets("Go!").Range("E48") = "1" Then
Sheets("SyL").Visible = True
Else
End If

If Sheets("Go!").Range("E56") = "1" Then
Sheets("AFH").Visible = True
Else
End If

If Sheets("Go!").Range("E57") = "1" Then
Sheets("АFH").Visible = True
Else
End If

If Sheets("Go!").Range("E60") = "1" Then
If Sheets("Info М").Range("T30") = "1" Then
Sheets("Зак М").Visible = True
Else
End If
Else
End If

If Sheets("Go!").Range("AE35") = "1" Then
Sheets("$").Visible = True
Else
End If

If Sheets("Go!").Range("AE42") = "1" Then
Sheets("TOC2").Visible = True
Else
End If



Else
End If


End Sub
Часто ошибка появляется на II (две буквы i) или ll (две буквы LL)
 
Тема: периодическая ошибка при обращении к листу из VBA
Решение: скорее всего дело в том, что открыт не один файл. В 2016 крайне неудачно организовано обращение к окнам и оно все же периодически глючит. Поэтому лучше ВСЕГДА указывать к листу КАКОЙ КНИГИ идет обращение. Что-то типа того:
Код
If ThisWorkbook.Sheets("Info С").Range("E47") = "1" Then
ThisWorkbook.Sheets("1").Visible = True
Else
ThisWorkbook.Sheets("1").Visible = False
End If
Здесь использовано обращение по ThisWorkbook(т.е. к той книге, в которой код). Но может быть надо обращаться к некоей конкретной книге и тогда вместо ThisWorkbook может быть такое: Workbooks("Книга3.xlsm")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
a.ibragimov.f написал:
исправный код работает через раз.
Вы ошибаетесь - исправный код работает ВСЕГДА
код работающий через раз - УЖЕ неисправный
Цитата
a.ibragimov.f написал:
Как преодолеть данную проблему?
нужно исправлять код пока он не начнет работать стабильно. каждый раз!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо, что помогаете мне разобраться с вопросом!

И так, что я успел проверить:
Это не глюк листа - я пересоздал листы заново - проблема остается
Я использовал предложения по написанию кода выше от Nordheim и Дмитрий(The_Prist) Щербаков, на моем office 365 работает все ок, на office 2016 опять через раз выдает ошибку уже на данном абзаце:
Код
With ThisWorkbook.Sheets("Зак")
        If ThisWorkbook.Sheets("Info С").[E45].Value = "1" Then .Visible = xlSheetVisible Else .Visible = xlSheetHidden
    End With
Ігор Гончаренко, согласен, что пока код работающий назвать нельзя.

Дорогие форумчане, подскажите пожалуйста, в чем может быть еще дело?
 
Цитата
a.ibragimov.f написал:
выдает ошибку уже на данном абзаце
текст ошибки тот же или нам его угадать? Имейте ввиду, если в книге для скрытия листа остается только один видимый лист, то его уже нельзя скрыть.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков текст ошибки тот же:
Run time error '-2147417848 (80010108)':
Method 'visible' of project '_Worksheet' failed
Цитата
Имейте ввиду, если в книге для скрытия листа остается только один видимый лист, то его уже нельзя скрыть.

Знаю данную особенность, в книге всегда не затрагивается 1 лист.

Дмитрий(The_Prist) Щербаков у Вас случайно нет Office 2016 - 2013, чтобы глянуть?
Я был бы очень признателен :))
 
Уважаемый a.ibragimov.f, у многих (большинства?) участников форума есть указанные Вами версии Excel.
Сократите свой файл до приемлемых размеров (удалив все ненужное) - или выложите на него ссылку.
Самое главное: четко опишите последовательность действий, приводящую к ошибке - у Вас же ошибка возникает "через раз".
Владимир
 
Цитата
a.ibragimov.f написал:
у Вас случайно нет Office 2016 - 2013, чтобы глянуть?
нет, у меня 365. А судя по описанию с ним все в порядке.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
a.ibragimov.f, а Вы лист в ручную не переименовываете перед тем как макрос выполнить?
Смотрите, то что хранится у вас тут это число, причём по умолчанию тип берётся Double или Single.
Цитата
ThisWorkbook.Sheets("Info С").[E45].Value
А то, что вы тут производите сравнение
Цитата
ThisWorkbook.Sheets("Info С").[E45].Value = "1"
то "1" - это строка, текст.
Вы сравниваете текст с числом.
Если вы напишите без кавычек 1
Код
ThisWorkbook.Sheets("Info С").[E45].Value = 1

то код примет это как тип Integer
Но это так мелочи. Опишите по нормальному переменные.
Лично я люблю записи в которых встречается Else записывать так
Код
With ThisWorkbook.Sheets("Зак")
    If ThisWorkbook.Sheets("Info С").[E45].Value = "1" Then
        .Visible = xlSheetVisible
    Else
        .Visible = xlSheetHidden
    End If
End With

Ну и если у вас теряется фокус книги и он не может найти лист попробуйте обращаться не через ThisWorkbook, а непосредственно через внутреннее имя листа, например
Код
With Лист1
    If Лист2.Cells(45, 5) = "1" Then
        .Visible = xlSheetVisible
    Else
        .Visible = xlSheetHidden
    End If
End With

Так вам не надо ссылаться на книгу.
Знания и технологии принадлежат человечеству, и каждый сам решает делиться ими или исчезнуть вместе с ними.
 
Автор обратился лично - провели исследование на моей версии Excel 2013.
Книга защищена. При снятой вручную защите листы скрываются/отображаются без проблем. В книге есть процедуры установки/снятия защиты, но у меня снятие защиты не срабатывает. А на машинах с 365 защита снимается без проблем.
 
Цитата
Юрий М написал:
но у меня снятие защиты не срабатывает
а причина известна?
Знания и технологии принадлежат человечеству, и каждый сам решает делиться ими или исчезнуть вместе с ними.
 
Нет )  
 
Цитата
Юрий М написал:
В книге есть процедуры установки/снятия защиты
А там с паролем или нет? Может с кодировкой чего путается. Поэтому и обращение к листам с ошибкой появляется.
Знания и технологии принадлежат человечеству, и каждый сам решает делиться ими или исчезнуть вместе с ними.
 
Цитата
Alemox написал:
Поэтому и обращение к листам с ошибкой появляется.
при этом через раз :-)
Цитата
a.ibragimov.f написал:
На второе исполнение макроса - все работает. И так по кругу.
 
В самих процедурах установки/снятия защиты пароль не указан. Сами процедуры ошибку не вызывают.
 
Цитата
Alemox написал:
Поэтому и обращение к листам с ошибкой появляется.
Ошибка не связана с обращением к листу, а именно с невозможностью отображения.
 
Тогда может в цикл ожидания загнать это отображение с проверкой. Может чего-то думает там.  ;)
Знания и технологии принадлежат человечеству, и каждый сам решает делиться ими или исчезнуть вместе с ними.
 
Нет: когда книга защищена - изменение структуры невозможно. Даже если пытаться в редакторе в свойствах листа вручную отобразить ранее скрытый лист.
А сама проверка работает - там всё нормально )
 
Юрий М, вы всё на корню рубите  :D
Проблема есть и с ней надо разбираться я так понимаю. Хотя с последними офисами глюки странные порой. У меня например очень часто белеет вся лента и ничего не выделяется и не нажимается, пока не свернёшь и не развернёшь окно. Это на 2013 офисе.
Дома на 2010 вообще никаких проблем.
Знания и технологии принадлежат человечеству, и каждый сам решает делиться ими или исчезнуть вместе с ними.
 
Дорогие форумчане!

Искренне хочу поблагодарить каждого участника нашей дискуссии! Благодаря коллаборации общих усилий, нам наконец-таки удалось запустить мою "программку" в Excel 2016 и 2013!

Ниже хочу выделить предложения следующих пользователей, которые в купе решили вопрос:

Юрий М вышел на Skype конференцию и совместно со мной протестировал файл на его Office 2013! Нам удалось выяснить, что даже когда Excel самостоятельно снимает защиту структуры книги, возможна ошибка, когда некоторые вкладки не видят, что защита снята.
РЕШЕНИЕ: не блокировать структуру книги, если ты работаешь со свойством скрытности вкладок через макрос.
П.С.: был решен вопрос с адаптацией к Office 2013, однако в Office 2016 продолжилась ошибка.

В Office 2016 Excel ругался, что не может присвоить свойство Hidden для 4 листов (из 60). Я их и переименовывал, и создал новые такие-же и удалил старые - все равно он ругался на именно эти 4 листа. Рабочее решение в моем случае предложил Alemox! (Nordheim был как никогда близок в своем предложении решения вопроса.)
РЕШЕНИЕ: если Excel не любит, как ты в коде обращаешься к переменной, найди другие слова.
Пример:
Не работает: (мой код)
Код
If Sheets("Info С").Range("E47") = "1" ThenSheets("1").Visible = True
Else
Sheets("1").Visible = False
End If
Не работает: (код Nordheim)
Код
With Sheets("Info С")        
If .[E47].Value = "1" Then .Visible = xlSheetVisible Else .Visible = xlSheetHidden
End With
Работает!!!: (код Alemox)
Код
With Лист1
    If Лист2.Cells(45, 5) = "1" Then
        .Visible = xlSheetVisible
    Else
        .Visible = xlSheetHidden
    End If
End With

И так, мы убрали защиту структуры книги полностью и переписали проблемные части кода на другой лад. Нажимаем на кнопку, к которой привязан большой макрос, и.. На Office 365 все ок, а Office 2013 и 2016 вылетают  :evil:  .
РЕШЕНИЕ: снести нафиг все кнопки, реализовать их через выпадающий список ячейки (On/Off) и условное форматирование.



И наконец - мой вопрос решен, за что еще раз хочу сказать большое спасибо каждому, кто принял участие в решении моего вопроса!!!

Также я сделал для себя несколько важных умозаключений:
1. Вовремя выполняй просьбы админа, иначе vikttur закроет твой вопрос и ты никогда не узнаешь своего решения  :D
2. Вместе - мы сила! Поэтому, я теперь также буду временами появляться на форуме и помогать другим с решением их вопросов.
3. Если Вам нужно разработать среднее или сложное приложение на большое количество компьютеров с разнашерстным Office - задумайтесь о создании универсального WEB приложения  :D

Еще раз ВСЕМ спасибо! Желаю безошибочного исполнения всех макросов!!
 
и Вам спасибо, что позволили блеснуть знаниями
Цитата
a.ibragimov.f написал:
Желаю безошибочного исполнения всех макросов!!
макрос, который выполняется  с ошибками это гав...-макрос (по умолчанию))
если Вы готовы пользоваться такими макросами - пожелаю Вам удачи
Изменено: Ігор Гончаренко - 24 Авг 2019 02:24:17
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Читают тему (гостей: 1)
Наверх