Как инициализировать модуль класса - PullRequest
0 голосов
/ 12 апреля 2019

Я написал модуль класса appWord_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean) для сохранения документа на SD-карте в качестве резервной копии перед закрытием документа.

По данным MS Site, следующий код был написан в модуле

Dim appWord_DocumentBeforeClose As New EventClassModule
Sub Register_Event_Handler()
 Set appWord_DocumentBeforeClose.App = Word.Application
End Sub

Вот код в модуле CLASS

Public oFSO As Scripting.FileSystemObject

Public WithEvents appWord As Word.Application

Private Sub appWord_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)


    Dim myPath As String, myFileName As String, fileName As String  ', driveLtr As String
    myPath = "e:\stamboom\"
    If CheckDrive(Left(myPath, 1)) = True Then
        fileName = ActiveDocument.Name
        myFileName = myPath & Left(ActiveDocument.Name, Len(fileName) - 20) & " " & Format(Now, "yy-mm-dd hhmmss") & ".docm"
        ActiveDocument.SaveAs fileName:=myFileName
        MsgBox "document saved on " & myPath
    Else
        MsgBox "drive E doesn't exist"
    End If
End Sub

Function CheckDrive(driveLtr As String) As Boolean
Set oFSO = New Scripting.FileSystemObject
If oFSO.DriveExists("E") Then
    If oFSO.GetDrive("E").VolumeName = "MY SD" Then
        CheckDrive = True
    End If
    Else
    CheckDrive = False
End If
End Function

Когда я запускаю код в модуле, сообщение компиляции VBA на Dim appWord_DocumentBeforeClose As New EventClassModule говорит мне, что

пользовательский тип не определен.

Может кто-нибудь помочь мне решить проблему?

1 Ответ

0 голосов
/ 12 апреля 2019

Кажется, что не хватает ясности относительно того, где использовать какие термины / имена / идентификаторы ...

Я предполагаю, что имя модуля класса EventClassModule. В довершение всего есть объявление

Public WithEvents appWord As Word.Application

В обычном модуле не используйте имя события (DocumentBeforeClose), используйте только имя модуля класса для объявления в верхней части обычного модуля. Plus , назначьте другое, другое имя для идентификации класса в этом модуле. Например

Dim MyEvents As New EventClassModule

Затем, чтобы запустить перехват обработчика событий:

Sub Register_Event_Handler()
  Set MyEvents.appWord = Word.Application
End Sub

appWord_DocumentBeforeClose сработает автоматически при попытке закрыть документ. Если бы вы добавили событие Open или New, они бы также автоматически запускались, пока активен обработчик события.

Для того чтобы обработчик событий автоматически запускался при открытии документа, можно вызвать процедуру регистрации из макроса с именем AutoOpen. Например

Sub AutoOpen()
  Register_Event_Handler
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...