Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Office Новый топик    Ответить
 Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Сын вождя
Member

Откуда: mtdmacro.ru
Сообщений: 160
Здравствуйте.

Столкнулся с тем, что на листе макросов xlExcel4MacroSheet (может еще где):
ActiveCell.Worksheet is ActiveSheet = False

То есть, таким макаром проверить, что ячейка находится на листе не выйдет. А она там есть :)

Как еще можно проверить, что Range находится на Worksheet?

Придумал только сравнивать полные Address. Intersect это уже перегиб, по-моему.
6 сен 17, 13:56    [20775594]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16311
Если активное окно содержит НЕ рабочий лист, то ActiveCell даёт ошибку.
Если активное окно содержит рабочий лист, то ActiveCell без указания конкретного листа всегда указывает на активную ячейку активного листа.

Иными словами, показанная проверка не имеет смысла.
6 сен 17, 14:04    [20775624]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Сын вождя
Member

Откуда: mtdmacro.ru
Сообщений: 160
Akina
Если активное окно содержит НЕ рабочий лист, то ActiveCell даёт ошибку

Никакой ошибки мне не выдает, на листе макросов. Спокойно читаются и ячейка, и значение.

Вопрос не про активное, а про Range на Worksheet.
6 сен 17, 14:15    [20775651]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16311
Сын вождя
Никакой ошибки мне не выдает

А вот встроенная документация полагает, что
Excel Developer Reference
Application.ActiveCell Property
Returns a Range object that represents the active cell in the active window (the window on top) or in the specified window. If the window isn't displaying a worksheet, this property fails. Read-only.

Абсолютно тот же текст - и в Window.ActiveCell Property.

А если не выдаётся ошибка - то, скорее всего, Вы отключили обработчик ошибок каким-нибудь многозначительным OnError Resume Next...
6 сен 17, 15:09    [20775869]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Сын вождя
Member

Откуда: mtdmacro.ru
Сообщений: 160
[quot Akina]
Сын вождя
...А вот встроенная документация полагает, что...

При чем тут скрытые листы? Нажали кнопку [+] и создали лист макросов. Заметили, о не скрыт :) Смотрим его ActiveCell...

Да, зря я упомянул Active всякие. Повторюсь, вопрос о способах проверки нахождения Range на Worksheet. Ну или что Worksheet1 это Worksheet2. Считаем что Worksheet1 is Worksheet2 не работает. А оно и не работает, иногда.
6 сен 17, 15:49    [20775994]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16311
Сын вождя
вопрос о способах проверки нахождения Range на Worksheet. Ну или что Worksheet1 это Worksheet2. Считаем что Worksheet1 is Worksheet2 не работает. А оно и не работает, иногда.

Имена листов в пределах книги уникальны. Так что
If Range1.Worksheet.Name = WorkSheet2.Name Then
6 сен 17, 16:23    [20776100]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
The_Prist
Member

Откуда: www.excel-vba.ru
Сообщений: 1610
Сын вождя
При чем тут скрытые листы?
Не при чем. Откуда Вы их вообще взяли? Нигде про них намека нет. А вот отличие типа Worksheet от MacroSheet очень даже есть. Поэтому сравнение Worksheet(даже если оно пляшет от ActiveCell) всегда будет давать False, т.к. типы-то разные.
Создайте не лист макросов, а обычный лист и проверьте там. Все будет работать как предполагалось. Именно на это Вам так упорно намекает Akina.
То, что ошибки нет - это может и косяк, но Microsoft упорно вещает, что использование листов макросов более не актуально и оставлено исключительно для совместимости(притом сразу после появления встроенного VBA).
6 сен 17, 16:29    [20776119]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Сын вождя
Member

Откуда: mtdmacro.ru
Сообщений: 160
The_Prist
...отличие типа Worksheet от MacroSheet...типы-то разные...

В дебаггере, я их всех вижу как Worksheet. И работает лист макроса как Worksheet. Как только я учел глюк из первого поста, все макросы заработали. Больше ни одной ошибки. Листа макросов, по всему моему коду, обрабатывается как Worksheet.

The_Prist
...То, что ошибки нет - это может и косяк...

Так я и хочу учесть этот косяк :) Оптимальным способом. Главное - чтобы работало. А оно НЕ РАБОТАЛО!

Пока, мы только обсуждаем, почему же оно не работает :)
6 сен 17, 16:49    [20776219]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
The_Prist
Member

Откуда: www.excel-vba.ru
Сообщений: 1610
Сын вождя
В дебаггере, я их всех вижу как Worksheet
Я с этим не спорю. Дебаггер порой и не такое может показать, однако это не мешает появляться ошибкам :)
Akina выше показал, как можно произвести сравнение без учета типа листов: по имени. Это вполне приемлемый вариант.
6 сен 17, 17:04    [20776269]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ActiveCell.Worksheet is ActiveSheet  [new]
Сын вождя
Member

Откуда: mtdmacro.ru
Сообщений: 160
The_Prist
...произвести сравнение без учета типа листов: по имени...

Имена уникальны только в пределах книги. Написал такое:
Function WORKSHEET_IsSome(ByRef WSH1 As Worksheet, ByRef WSH2 As Worksheet) As Boolean
    If WSH1.Type = xlWorksheet Then
        If WSH1 Is WSH2 Then WORKSHEET_IsSome = True
    ElseIf StrComp(WSH1.Cells(1).Address(External:=True), WSH2.Cells(1).Address(External:=True), vbBinaryCompare) = 0 Then
        WORKSHEET_IsSome = True
    End If
End Function
7 сен 17, 05:11    [20777035]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Office Ответить