Добрый день! Буду очень рад, если поможете мне решить вопрос. День уже потерял
Имеется исправный код, спокойно отрабатывающийся в моем Office 365. Код большой - 1500 строк, но элементарный. Например:
Код
If Sheets("Info С").Range("E47") = "1" Then
Sheets("1").Visible = True
Else
Sheets("1").Visible = False
End If
У всех моих коллег установлены Office 2016 (редко 2013).
Когда запускаешь файл у них, сначала выдает ошибку на ровном месте: не может скрыть существующий лист или скрыть столбик диаграммы На второе исполнение макроса - все работает. И так по кругу.
С чем это может быть связано? Как преодолеть данную проблему?
Я не смог подгрузить файл, так как он весит 3,4 мб. Может быть у Вас получится его глянуть? Могу дать управление в Skype или отправить файл на почту. Может быть есть какие-нибудь идеи, с чем это может быть связано?
Проблема в том, что макрос абсолютно исправен. Работает без нареканий в новой 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")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Спасибо, что помогаете мне разобраться с вопросом!
И так, что я успел проверить: Это не глюк листа - я пересоздал листы заново - проблема остается Я использовал предложения по написанию кода выше от 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, у многих (большинства?) участников форума есть указанные Вами версии Excel. Сократите свой файл до приемлемых размеров (удалив все ненужное) - или выложите на него ссылку. Самое главное: четко опишите последовательность действий, приводящую к ошибке - у Вас же ошибка возникает "через раз".
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 защита снимается без проблем.
Юрий М написал: но у меня снятие защиты не срабатывает
а причина известна?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Юрий М написал: В книге есть процедуры установки/снятия защиты
А там с паролем или нет? Может с кодировкой чего путается. Поэтому и обращение к листам с ошибкой появляется.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Тогда может в цикл ожидания загнать это отображение с проверкой. Может чего-то думает там.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Нет: когда книга защищена - изменение структуры невозможно. Даже если пытаться в редакторе в свойствах листа вручную отобразить ранее скрытый лист. А сама проверка работает - там всё нормально )
Юрий М, вы всё на корню рубите Проблема есть и с ней надо разбираться я так понимаю. Хотя с последними офисами глюки странные порой. У меня например очень часто белеет вся лента и ничего не выделяется и не нажимается, пока не свернёшь и не развернёшь окно. Это на 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
With Лист1
If Лист2.Cells(45, 5) = "1" Then
.Visible = xlSheetVisible
Else
.Visible = xlSheetHidden
End If
End With
И так, мы убрали защиту структуры книги полностью и переписали проблемные части кода на другой лад. Нажимаем на кнопку, к которой привязан большой макрос, и.. На Office 365 все ок, а Office 2013 и 2016 вылетают . РЕШЕНИЕ: снести нафиг все кнопки, реализовать их через выпадающий список ячейки (On/Off) и условное форматирование.
И наконец - мой вопрос решен, за что еще раз хочу сказать большое спасибо каждому, кто принял участие в решении моего вопроса!!!
Также я сделал для себя несколько важных умозаключений: 1. Вовремя выполняй просьбы админа, иначе vikttur закроет твой вопрос и ты никогда не узнаешь своего решения 2. Вместе - мы сила! Поэтому, я теперь также буду временами появляться на форуме и помогать другим с решением их вопросов. 3. Если Вам нужно разработать среднее или сложное приложение на большое количество компьютеров с разнашерстным Office - задумайтесь о создании универсального WEB приложения
Еще раз ВСЕМ спасибо! Желаю безошибочного исполнения всех макросов!!