Я пишу код события в personal.xlsb для проверки орфографии внутри ячейки

#vba

#vba

Вопрос:

Коды добавлены в модуль класса ‘CAppEventHandler’

 Option Explicit

Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Call CheckSpelling1   
End Sub
  

Коды добавлены в модуль «ThisWorkbook» personal.xlsb

 Option Explicit

Private OurEventHandler As CAppEventHandler


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     Set OurEventHandler = New CAppEventHandler
End Sub
  

Код для проверки орфографии в ячейке

 Sub CheckSpelling1(r As Range)
Dim rng As Range
Dim ar() As String
Dim i As Long
Dim j As Long

With Application.SpellingOptions
    .IgnoreCaps = True
    .IgnoreFileNames = True
    .IgnoreMixedDigits = True
End With
 
    For Each rng In r
        If Not rng.HasFormula And VarType(rng.Value) = vbString Then
            ar = Split(Replace(rng.Value, Chr(160), " "), " ")
            j = 1
            rng.Font.ColorIndex = xlColorIndexAutomatic
            For i = 0 To UBound(ar)
                If Not Application.CheckSpelling(Word:=ar(i)) Then
                    rng.Characters(j, Len(ar(i))).Font.ColorIndex = 3
                End If
                j = j   1   Len(ar(i))
            Next i
        End If
    Next rng
End Sub
  

Я проверил много сообщений о том, как обрабатывать события, предназначенные для всех книг. Но, поскольку я новичок в VBA, не могу заставить его работать. Спасибо за вашу помощь.

Ответ №1:

Пожалуйста, попробуйте инициализировать класс в Open событии:

1.

 Private Sub Workbook_Open()
    Set OurEventHandler = New CAppEventHandler
End Sub
  

Будучи скрытой рабочей книгой, Workbook_SheetChange событие никогда не будет запущено.
В любом случае, если Personal.xlsb он уже открыт, вы можете / должны вручную запустить событие, вместо того, чтобы закрывать и повторно открывать его. Класс должен быть инициализирован, чтобы можно было использовать созданное событие.

Только после этого SheetChange событие всех открытых книг вызовет событие, определенное в классе.

  1. Затем CheckSpelling1 необходимо вызвать sub, используя его Range аргумент ():
 Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    CheckSpelling1 Target
End Sub
  

Комментарии:

1. @Surendra Mishra: Рад, что смог помочь!