Страницы: 1
RSS
Проблема с Is Nothing
 
Есть переменная Ws связанное с листом книги  Set Ws=activesheet , потом возможно книга с листом Ws будет закрыто что я и пытаюсь определить через If Ws is Nothing Then bla-bla-bla но это условие не срабатывает(((  
А почему?  
А как?
 
>> возможно книга с листом Ws будет закрыто  
Расшифруйте это - что будет "закрыто"? Скрыт лист? Тогда как он может быть активным?
 
Активность листа не имеет значения,это было просто обьевления переменной Ws, что она связанна с каким-то там листом. После этого идёт куча манипуляцый в ходе которых Книга с листом Ws возможна будет закрыта.  
Книга будет закрыта полностью, соответственно вроде как её лист Ws станет nothing ?
 
>> вроде как её лист Ws станет nothing ?  
Не станет - переменная ещё жива.
 
Логично, а как выяснить что обьект связанный с переменой перестал жить ? пробовал например такое : If Ws.name Is empty Then - выдаёт обшибку(((
 
If Ws is nothing then
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, читаем первое сообщение автора.
 
{quote}{login=Владислав Столбенко}{date=16.10.2012 08:33}{thema=}{post}Логично, а как выяснить что обьект связанный с переменой перестал жить ?{/post}{/quote}Как-то странно Вы формулируете :-) Проверить - открыта ли книга?
 
{quote}{login=Юрий М}{date=16.10.2012 08:39}{thema=}{post}Алекс, читаем первое сообщение автора.{/post}{/quote}  
Юрий, первое-то сообщение я прочёл... Но также я прочёл и его же третье:  
>> а как выяснить что обьект связанный с переменой перестал жить ?    
На него я и ответил, решив, что у автора склероз :)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
The_Prist  
>>If Ws is Nothing Then не будет в описанном случае выдавать ошибку  
?  
Public Sub Test()  
   Dim pSheet As Worksheet, pBook As Workbook  
   Set pBook = Workbooks.Add  
   Debug.Print "Books count " & Workbooks.Count  
   Set pSheet = pBook.ActiveSheet  
   Debug.Print pSheet.Name & "-" & pBook.Name  
   pBook.Close False: Set pBook = Nothing  
   Debug.Print "Books count " & Workbooks.Count  
   If Not pSheet Is Nothing Then Debug.Print "pSheet is Nothing"  
End Sub  
Простейший костыль  
Public Function CheckRef(ByVal this As Worksheet) As Worksheet  
On Error GoTo errHandle  
   Call this.Name  
   Set CheckRef = this  
Exit Function  
errHandle:  
   Set CheckRef = Nothing  
End Function  
Set Ws = CheckRef(Ws)  
If Ws Is Nothing Then  
Хотя, конечно, изящнее через обработку BeforeColse для книги этого листа
 
Обращаем внимание на строку :)  
If Not pSheet Is Nothing Then Debug.Print "pSheet is Nothing"
 
Строка непонятна: или Not лишнее, или сообщение неверное. Получается по аналогии так:  
Если ИСТИНА, то печатаем ЛОЖЬ.
 
ТС написал  
>>Есть переменная Ws связанное с листом книги Set Ws=activesheet , потом возможно книга с листом Ws будет закрыто что я и пытаюсь определить через If Ws is Nothing Then bla-bla-bla но это условие не срабатывает(((<<  
 
Макросом я смоделировал эту ситуацию. Думаю моя описка, написал pSheet Is Nothing, вместо pSheet Is Not Nothing, не меняяет смысла этой ситуации.  
 
Не думаю, что столь уважаемые люди The_Prist, Юрий М не видят, что ТС прав.  
То есть в макросе создаётся книга. Устанавливается переменная pSheet  на активный лист этой книги. Далее, книга закрывается, но VBA не устанавливает эту переменную в Nothing. Следовательно, используя If pSheet Is Nothing, нельзя установить дейстительна ли ссылка на лист или нет. И утверждение "If Ws is Nothing Then не будет в описанном случае выдавать ошибку" является неверным.
 
Для примера просто замените злосчастную строку  
If Not pSheet Is Nothing Then Debug.Print "pSheet is Nothing"  
на  
If pSheet Is Nothing Then  
Debug.Print "Sheet Is Nothing"  
Else  
Debug.Print "Sheet Is Not Nothing"  
Debug.Print pSheet.Name  
End If
 
Дело в том, что строка автора не приводит к ошибке. Переменная существует. А вот проверять, как мне кажется, нужно не жива ли переменная, а открыта ли книга.
 
тоже самое, что предложил anvg, но без обертки:  
 
Public Sub Test()  
On Error Resume Next  
Dim pSheet As Worksheet, pBook As Workbook, x  
Set pBook = Workbooks.Add  
Debug.Print "Books count " & Workbooks.Count  
Set pSheet = pBook.ActiveSheet  
Debug.Print pSheet.Name & "-" & pBook.Name  
pBook.Close False: Set pBook = Nothing  
Debug.Print "Books count " & Workbooks.Count  
If Not pSheet Is Nothing Then Debug.Print "pSheet is Nothing"  
If pSheet.Name = "" Then  
Debug.Print "psheet пуст"  
End If  
End Sub
Живи и дай жить..
 
Юрий М  
>>Дело в том, что строка автора не приводит к ошибке  
Вы о проверке If Ws Is Nothing Then?  
Если после закрытия книги вызвать, например, Ws.Name, то как раз и получим сообщение об ошибке.  
Вот и слэн как раз об этом    
>>On Error Resume Next' что бы ошибки не было  
А вариант с проверкой книги, точнее в коде модуля книги, где расположен код создать  
Public WithEvents MyBook As Workbook  
Public Ws As Worksheet  
И по событию MyBook_BeforeClose устанавливать Ws в Nothing  
без сомнения изящнее костыля, предложенного мною выше
 
Я понимаю, о чём сейчас разговор, но, мне кажется, что мы отклонились от первоначальной задачи: автор хотел выполнить проверку, скажем так,- состояния здоровья переменной (лист), когда книга с этим листом закрывается. Вот я и говорю: не проще ли проверить - открыта книга или нет? :-)
 
Юрий М  
Да не вопрос. Точнее вопрос, а как? Особенно если "забыть" сделать Set pBook = Nothing после закрытия книги. Через коллекцию Workbooks - такой же будет костыль, как и предложенный мной вариант.  
И, увлёкшись тонкостями приготовления кошек, меня не покидает вопрос - а в какой ситуации я смог бы так написать код, чтобы нужно было проверять состояние существования объектов Excel?
 
{quote}{login=anvg}{date=18.10.2012 02:36}{thema=}{post}а в какой ситуации я смог бы так написать код, чтобы нужно было проверять состояние существования объектов Excel?{/post}{/quote}:-) Вот в этой: "потом возможно книга с листом Ws будет закрыто" - автор пишет, что "возможно" :-) Я не знаю, для чего требуется эта проверка.
 
а по-моему понятно - макрос видимо интерактивный, позволяет во время работы пользователю совершать действия. книгу может закрыть пользователь..
Живи и дай жить..
 
{quote}{login=слэн}{date=18.10.2012 01:27}{thema=}{post}а по-моему понятно - макрос видимо интерактивный, позволяет во время работы пользователю совершать действия. книгу может закрыть пользователь..{/post}{/quote}  
 
Именно так и есть, смысл манипуляций такой: есть "лист-шаблон"  в книге с программным модулем.Для пользователя создаётся посредством Worksheets("лист-шаблон").Copy книга где он заполняет этот шаблон и с которым взаимодействуют из модуля "книги-родителя"-поэтому книгу "потомка" необходимо контролировать.  эту книгу он может сохранить и тем самым изменить название и Workbook.name уже не поможет контролировать состояние книги, количество книг может поменятся, и workbooks(index) уже не айс. События приложения использовать я не хочу, у событий приложения есть внешние неприятные проявления, причём в рамках всего приложения (замедляется работа).  
Вот как-то так...  
Как я понял тема поучилась преинтересная, но к моему удивлению и сожалению костылеобразная(увы). Я лично отдаю предпочтение костылю с обработкой ошибок.
Страницы: 1
Читают тему
Наверх