Страницы: 1
RSS
1004 runtime error Method visible of object worksheet failed только на определенном компьютере
 
Всем доброго времени суток!

Столкнулась с такой вот проблемой: ошибка 1004 Method visible of object worksheet failed выходит при открытии файла только на одном компьютере. Этот же файл на других компьютерах работает также. Везде стоит офис 2016. Надстройки и параметры макросов одинаковые. В чем может быть причина? Причем даже кнопка debug не нажимается, чтобы посмотреть где конкретно сидит причина ошибки...
Сталкивался кто-нибудь в таким?

Заранее благодарю всех на любые ответы!
 
пример приложите.
Инженер не тот, кто все знает, а тот кто знает где найти ответ.
 
Irbis_evs,
Ох, это несколько проблематично. Нужно новый файл создать, оригинал содержит в себе коммерческую тайну :D
Пока выкладываю код, файл позже выложу. Спасибо)))
Этот код на листах, которые либо нужно, либо не нужно скрывать.
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub


Этот в книге:
Код
Private Sub Workbook_Open()
Dim sh As Worksheet 'назначает переменную для листа
For Each sh In ActiveWorkbook.Worksheets
sh.Unprotect "password"
sh.Visible = True
Next sh
    'ищем последнюю занятую строчку в логах
    lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row
    'заносим имя пользователя и дату-время входа в файл
    Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME")
    Worksheets("Лог").Cells(lastrow + 1, 2) = Now
    'отображаем все листы

Dim a As Range
For Each sh In ActiveWorkbook.Worksheets
Set Rng = sh.Range("d10:bt10") 'строка дат
' ниже в списке указываем администраторов файла, то есть Финансистов
    If UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
        UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
        UCase(Environ("USERNAME")) = UCase("1") Then
            For Each a In Rng
                a.EntireColumn.Hidden = False
            Next a
' Ниже указываем вторичных пользователей HR, Director
    ElseIf UCase(Environ("USERNAME")) = UCase("3") Or _
        UCase(Environ("USERNAME")) = UCase("2") Or _
        UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
        UCase(Environ("USERNAME")) = UCase("2") Or _
        UCase(Environ("USERNAME")) = UCase("1") Then
            For Each a In Rng
                    a.EntireColumn.Hidden = False
                Next a
                sh.Cells.Locked = True
    ElseIf UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
           UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
           UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
           UCase(Environ("USERNAME")) = UCase("Name.Surname") Then
            sh.Range("A17:BM133").Locked = False
            sh.Range("D11:BM11").Locked = False
            For Each a In Rng
                    a.EntireColumn.Hidden = False
                Next a
    Else
            sh.Cells.Locked = True
            sh.Range("A17:C133").Locked = False 'снимает защиту с ФИО и Должности
            sh.Range("A17:A31").Locked = True 'ставим защиту на список людей
            sh.Range("D11:BM11").Locked = False 'снимаем защиту со строки выпуска продукции
            For Each a In Rng
            If a = Date Or a = Date + 1 Or a = Date - 1 Then
                a.Rows("8:124").Locked = False 'указать начиная с какой строки после проверяемого диапазона Rng снять защиту с ячеек (первая ячейка ссылается на диапазон)
                a.EntireColumn.Hidden = False 'открываем дни: тек день, -1 день, +1день
            Else
                a.EntireColumn.Hidden = True
            End If
            Next a
    End If
Next sh

If UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _
UCase(Environ("USERNAME")) = UCase("Name.Surname") Then
Else
        For Each sh In ActiveWorkbook.Worksheets
            sh.Protect Password:="password"
            If Worksheets("Parameters").Range("B3") = sh.Name Or Worksheets("Parameters").Range("B4") = sh.Name Then
            Else
            sh.Visible = xlSheetVeryHidden
            End If
        Next sh
    'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ
   'Worksheets("Предупреждение").Visible = xlSheetVeryHidden
   'Worksheets("Лог").Visible = xlSheetVeryHidden
End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'ищем последнюю занятую строчку в логах
    Worksheets("Лог").Unprotect "password"
    lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row
    'заносим дату-время выхода из файла
    If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now
    
    'скрываем все листы, кроме листа ПРЕДУПРЕЖДЕНИЕ
    Worksheets("Предупреждение").Visible = True
    For Each sh In ActiveWorkbook.Worksheets
        If sh.Name = "Предупреждение" Then
            sh.Visible = True
        Else
            sh.Visible = xlSheetVeryHidden
        End If
    Next sh
    
    'сохраняемся перед выходом
    'ActiveWorkbook.Save
End Sub


Воооть...
 
Скорее всего проблема в том, что для этого пользователя скрываются все листы до того, как код дойдет до нужного. Создайте еще один лист для служебных нужд. Назовите его "main". В коде Workbook_Open первой строкой отображайте этот лист ВСЕГДА. Далее идет Ваш код. И последней строкой просто скрываете этот служебный лист, проверив, отображен ли помимо него еще хотя бы один лист.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
Спасибо сейчас попробую.

А почему такая проблема возникает только у одного пользователя? Раньше у него был другой компьютер и все работало отлично. А после замены (новый купили) все пошло не так...

Этот же пользователь заходит в учетку через мой комп - и все снова работает...
Изменено: Honey - 22.06.2017 08:56:28
 
Я выше написал почему такое может быть: для этого ПК(пользователя) Ваш код не оставляет ни одного видимого листа. А это запрещено в книгах, вот и получаете ошибку при попытке скрыть последний видимый лист. Почему происходит именно у Вас - не скажу 100%. Может еще в чем проблема.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Honey написал:
почему такая проблема возникает только у одного пользователя
Такое бывает, у меня тоже были примеры, когда код работал неделями на одном компьютере, но выдавал ошибку на другом.
В вашем случае он может ругаться на попытку скрыть уже скрытый лист, попробуйте поставить проверку на видимость перед скрытием.
 
Цитата
Vetermsk написал:
ругаться на попытку скрыть уже скрытый лист
нет. Попробуйте скрыть лист кодом, а потом попробуйте скрыть его кодом повторно. Ничего не случится. Видимость - это всего лишь свойство листа и если дважды назначить этому свойству одно значение - ничего не измениться и ошибки не вызовет.

Озвученная в теме ошибка как правило возникает в двух случаях:
1. Это единственный видимый лист в книге. Нельзя скрыть все листы книги.
2. Структура книги защищена.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
нет.
Именно такой случай у меня был. Когда на нескольких компьютерах работало нормально, а на одном вылетала ошибка. И причина была - именно в попытке скрыть скрытый лист. Что-то на том компьютере мешало повторно применить свойство. При всех одинаковых остальных параметрах. Когда поставил проверку, ошибка ушла.

Почему так было - понятия не имею, но случай запомнился.
Изменено: Vetermsk - 22.06.2017 09:18:38
 
Цитата
Vetermsk написал:
может ругаться на попытку скрыть уже скрытый лист,
Не будет - проверьте сами.
 
Вот подобие файла оригинала...
https://cloud.mail.ru/public/HGBd/syfx4JEmr
 
Ой, я только увидела все сообщения)))

В общем, с попыткой листа Мэйн мало что вышло. Я не особо дружу с макросами, хоть и приходиться с ними работать. Видимо что-то не так делаю... Сейчас попробую проверить на видимость.
О результатах отпишусь
 
Что-то совсем не то... :sceptic:
If sh=visible then sh=verryhidden end if
Так?
 
Код
If sh.Visible = True Then
    sh.Visible = xlSheetVeryHidden
End If
Это надо вставить вместо 87-й строчки в вашем примере.
 
Vetermsk, спасибо! =)
 
Ошибка не ушла...(((
Main тоже не помог(((
Изменено: Honey - 22.06.2017 11:20:10
 
На какой строке ошибка? У Вас есть две процедуры, где идет скрытие листов. В какой из них появляется эта ошибка? При открытии файла или при закрытии?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
при открытии файла. А кнопка Debug не работает...

Хочу еще добавить: если заходить через этого пользователя на мой ноут (1)-все работает. Через мою учетку на тот ноут (2), где не работало-опять-таки все работает. А через учетку конкретного пользователя на тот самый ноут (2) не работает. Словно это конфликт учетки с ноутом. Знаю звучит странно...
Изменено: Honey - 22.06.2017 11:47:13
 
Цитата
Honey написал:
кнопка Debug не работает.
А Вы снимите сначала пароль с проекта VBA и запустите книгу на проблемном ноутбуке без защиты проекта.
Получите ошибку, кнопка Debug будет активна.
До кучи. Вот у Вас есть код:
Код
If UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _UCase(Environ("USERNAME")) = UCase("Name.Surname") Then
Else
        For Each sh In ActiveWorkbook.Worksheets
            sh.Protect Password:="password"
            If Worksheets("Parameters").Range("B3") = sh.Name Or Worksheets("Parameters").Range("B4") = sh.Name Then
            Else
            sh.Visible = xlSheetVeryHidden
            End If
        Next sh
    'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ
   'Worksheets("Предупреждение").Visible = xlSheetVeryHidden
   'Worksheets("Лог").Visible = xlSheetVeryHidden
End If
добавьте лист main и измените кусок кода так:
Код
dim lsh_cnt as long
Worksheets("main").Visible = xlSheetVisible
If UCase(Environ("USERNAME")) = UCase("Name.Surname") Or _UCase(Environ("USERNAME")) = UCase("Name.Surname") Then
Else
        For Each sh In ActiveWorkbook.Worksheets
            if sh.name <> "main" then 'лист main не проверяем - он должен оставаться видимым
            sh.Protect Password:="password"
            If Worksheets("Parameters").Range("B3") = sh.Name Or Worksheets("Parameters").Range("B4") = sh.Name Then
            Else
            sh.Visible = xlSheetVeryHidden
            lsh_cnt=lsh_cnt+1
            End If
          end if
        Next sh
if lsh_cnt < ActiveWorkbook.Worksheets.count-1 then
Worksheets("main").Visible = xlSheetVeryHidden
end if
    'скрываем листы ПРЕДУПРЕЖДЕНИЕ и ЛОГ
   'Worksheets("Предупреждение").Visible = xlSheetVeryHidden
   'Worksheets("Лог").Visible = xlSheetVeryHidden
End If
Изменено: The_Prist - 22.06.2017 12:03:08
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
87 строка ошибка

С Вашим кодом у меня только лист main и открыт. А нужно чтобы открывался лист месяца текущего+листы на которые вообще нет когда виден-невиден...
Изменено: Honey - 22.06.2017 12:16:54
 
На самом деле надо:
Код
If sh.Visible = xlSheetVisible Then
    sh.Visible = xlSheetVeryHidden
End If
А то мало ли,чему там True равно  :D  
 
AndreTM,
Спасибо)) Но проблема все та же...
 
Уважаемые,
всем спасибо большое, что помогаете!! Просто хотела написать всем это :)
А пока пытаюсь найти различия в ноутах)))

Если есть еще идеи, буду очень признательна!
 
Цитата
Honey написал:
С Вашим кодом у меня только лист main и открыт.
Но ошибки нет? Значит вопрос очевиден - ищите различия в названиях учетной записи. Если мой код оставляет открытым только лист main, значит ни одно из условий для отображения других листов не выполняется.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
ошибка в конце возникает, но там ошибка 1004 неверный пароль.
И разве если бы была ошибка в имени учетки, на других ноутах тоже бы не открывалось. Но везде кроме этого злополучного ноута не работает((
 
ну я уже не знаю как объяснить. Копайтесь сами и думайте, что дело в чем-то другом. Убеждать в очевидном уже надоело.
Проверьте что там в ячейках на листах для сверки получается на этом ПК. Дело-то явно в нем. Говорю последний раз: первоначальная ошибка в том, что ни одно из условий для отображения хоть одного листа для пользователя - НЕТ.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
Возможно мы действительно не понимаем друг друга. С этой учетки но уже на другом ноуте все работает... То есть на другом ноуте условия для отображения листов для этого пользователя есть-соблюдаются...

Простите, если я где-то не так объясняю...
 
Цитата
Honey написал:
условия для отображения листов для этого пользователя есть-соблюдаются
Но вывод-то какой? Вывод прост - на этом ноуте условия НЕ СОБЛЮДАЮТСЯ. Значит Ваша задача найти ПОЧЕМУ. И сделать это можно элементарно: пройтись через Debug по всему коду Workbook_Open. ВСЕ. Мы тут обсуждаем воздух сейчас. Кроме Вас никто причину не найдет, т.к. нет у нас Вашего ноута проблемного.

Вы спрашивали почему ошибка появляется - ответ получен.
Кнопка Debug не активна? Я написал, что надо сделать, чтобы она была активна.
Дальше все только от Вас зависит.
Изменено: The_Prist - 22.06.2017 12:54:50
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо за все ответы!
Я думала может есть еще кто сталкивался с таким...
Всем большое спасибо!)))
Страницы: 1
Наверх