Как иметь Range быть Nothing изначально? - PullRequest
0 голосов
/ 21 октября 2019

РЕДАКТИРОВАТЬ: это работает, если у меня есть это в верхней части ThisWorkbook, но не, если оно находится ниже другого Workbook_SheetChange события

Я пытаюсь сделать комментарии, когда у меня выбрана ячейка, поэтому я неНужно схватить мышь и навести курсор на клетку. У меня есть несколько рабочих листов, поэтому этот код является рабочей книгой:

Public FRg As Range
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   'Update 20140909
    If Not FRg Is Nothing Then
        FRg.Comment.Visible = False
    End If
    If Not Target.Comment Is Nothing Then
        Target.Comment.Visible = True
    End If

End Sub

Я получаю сообщение об ошибке при первом if сообщении Object Required

Я думаю, что FRg в основном отслеживаетпоследний комментарий, так что я не останавливаюсь на комментариях, оставаясь после того, как ухожу из ячейки, но, возможно, это должно быть что-то изначально?

ОБНОВЛЕНИЕ:

Я изменилслегка код:

Public FRg As Range

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   'Update 20140909
    If Not FRg Is Nothing Then
        If Not FRg.Comment Is Nothing Then
            'MsgBox "Hiding comment in cell w text: " & FRg.Value
            FRg.Comment.Visible = False
            Set FRg = Nothing
            'MsgBox "previous comment turned off"
        End If
    End If
    If Not Target.Comment Is Nothing Then
        Target.Comment.Visible = True
        Set FRg = Target
        Again = True
    End If

End Sub

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Ваше объявление:

Public FRg As Range

всегда должно быть вверху страницы, над всеми остальными подпрограммами в этом листе / книге / модуле.

Остальная часть кода может сидетьгде угодно, но ваши объявления на уровне листа / книги / модуля должны стоять первыми. Причина, по которой вы получаете ошибку, состоит в том, что, когда вы помещаете другой код над объявлением, Excel игнорирует ваше ошибочное объявление, расположенное между подпрограммами, и устанавливает необъявленную переменную «Frg» в качестве варианта (который не является объектом), и именно поэтому вы получаетеошибка.

1 голос
/ 22 октября 2019

Стратегия должна заключаться в использовании FRg для отслеживания последнего показанного комментария и Target для отображения комментария, если он существует.

Поскольку вы хотите, чтобы он был шириной рабочей книги, вы такженужно обработать событие смены листа тоже.

Примерно так

Dim LastSh As Object
Dim FRg As Range

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Not (LastSh Is Sh) Then
        If Not FRg Is Nothing Then
            FRg.Comment.Visible = False
        End If
        If Not ActiveCell.Comment Is Nothing Then
            ActiveCell.Comment.Visible = True
            Set LastSh = Sh
            Set FRg = ActiveCell
        End If
    End If
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Not FRg Is Nothing Then
        FRg.Comment.Visible = False
    End If

    If Not Target.Comment Is Nothing Then
        Target.Comment.Visible = True
        Set FRg = Target
    End If
End Sub
0 голосов
/ 22 октября 2019

Проблема: Строка If Not FRg Is Nothing Then генерирует ошибку: Object Required

Тем не менее, я мог воспроизвести ошибку 424, только когда вместо FRg определен variantдиапазона (см. Требуемый объект (ошибка 424) )

enter image description here

Когда FRg определен как диапазон, линияFRg.Comment.Visible = False может привести к ошибке 91, если у диапазона нет комментария.

Цель : переключение видимости комментариев ячеек, когда ячейки выбраны \ не выбраны.

Решение: Это предлагаемое решение инициируется событием рабочей книги: Workbook_SheetSelectionChange. Помните, что целевой диапазон, используемый этим событием, может включать несколько областей, а также несколько ячеек (другой альтернативой является применение процедуры только к ActiveCell)

Процедура: ЭтоПроцедура выполняет следующие шаги:
1. Скрывает комментарии для ранее выбранного диапазона (rPrior), независимо от того, активен родительский лист или нет.
2. Отображает комментарии, если они есть, ячейкив выбранном диапазоне.
3. Создает статический диапазон с ячейкой с комментариями для каждого прогона, чтобы применить шаг 1 в следующем прогоне (см. Статический оператор ).

Скопируйте эту процедуру в модуль ThisWorkbook:

Private Sub Cells_Toggle_Comments(ByVal rTrg As Range)
Static rPrior As Range
Dim blShow As Boolean
Dim rTemp As Range, rArea As Range, rCll As Range

    Rem Hide comments from prior event
    blShow = False
    If Not (rPrior Is Nothing) Then
        Set rTemp = rPrior
        GoSub Rng_Comments_Toggle
        Set rTemp = Nothing
        Set rPrior = Nothing
    End If

    blShow = True
    Set rTemp = rTrg
    GoSub Rng_Comments_Toggle
    Set rTemp = Nothing

Exit Sub

Rng_Comments_Toggle:
    For Each rArea In rTemp.Areas
        For Each rCll In rArea.Cells
            With rCll
                If Not (.Comment Is Nothing) Then
                    .Comment.Visible = blShow
                    If blShow Then
                        If rPrior Is Nothing Then
                            Set rPrior = rCll
                        Else
                            Set rPrior = Union(rPrior, rCll)
    End If: End If: End If: End With: Next: Next
    Return

    End Sub

Процедура должна вызываться таким образом из события рабочей книги Workbook_SheetSelectionChange

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Call Cells_Toggle_Comments(Target)
    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...