VBA Word Создает объект модуля класса из normal.dotm

#vba #class #object #ms-word

#vba #класс #объект #ms-word

Вопрос:

Я настроил свою собственную библиотеку с функциями и вспомогательными элементами для VBA (Word) и хотел создать новый модуль класса. Но я не могу понять, как использовать этот новый класс с другими файлами.

Пример секундомера (Normal.dotm, модуль класса: Global_StopWatch)

 Private mlngStart As Long
Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long

Public Sub StartTimer()
    mlngStart = GetTickCount
End Sub
Public Function EndTimer() As Long    
    EndTimer = (GetTickCount - mlngStart)
End Function
 

Вызов секундомера (Document.dotm, module: Test)

 Sub swTest()
    Dim gSW As Global_StopWatch
    Set gSW = New Global_StopWatch
        
    gSW.StartTimer
    Debug.Print "That took " amp; gSW.EndTimer amp; " ms."
End Sub
 

Может кто-нибудь помочь с этим?

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

1. docs.microsoft.com/en-us/previous-versions/office/troubleshoot/…

2. @TimWilliams Спасибо, но учебник не сработал : Compile Error: User-defined type not defined . Я пробовал как раннее, так и позднее связывание.

3. При описании ошибки полезно указать, в какой строке находится проблема…

4. Я скопировал и вставил полный код из вашей ссылки, чтобы проверить, работает ли он. Я получаю Compile Error: User-defined type not defined on Dim anEmployee As ClassProvider.clsEmployee ( UseExportedClass_EarlyBinding() ). С UseExportedClass_LateBinding() помощью я получаю Runtime Error: -2147352573 (800200003) . Перезапуск Word, похоже, тоже не работает.

5. Извините, я думаю, что эта ссылка больше ориентирована на Excel. Смотрите Ответ ниже.

Ответ №1:

Normal.dotm — clsStopWatch (создание экземпляра = PublicNotCreatable)

 Option Explicit

Private mlngStart As Long
Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long

Public Sub StartTimer()
    mlngStart = GetTickCount
End Sub
Public Function EndTimer() As Long
    EndTimer = (GetTickCount - mlngStart)
End Function
 

Normal.dotm — Module1

 Public Function StopWatch() As clsStopWatch
    Set StopWatch = New clsStopWatch
End Function
 

Document1 — Module1

 Sub Tester()
    Dim sw As normal.clsStopWatch, i As Long
    Set sw = normal.stopwatch
    sw.StartTimer
    For i = 1 To 10000000#
        '
    Next i
    Debug.Print sw.endtimer
End Sub
 

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

1. Большое вам спасибо. Иногда я действительно ненавижу VBA..

2. Я нахожу Word VBA особенно сложным. Excel VBA FTW!