2012-09-24 38 views
7

Estoy tratando de acercarme lo más posible a los punteros de función/clases abstractas en VBA.¿Qué es un módulo de objeto público en VBA?

Tengo una clase llamada VerificationManager y comprueba un montón de celdas en un par de hojas de cálculo coinciden. Esto se hará de diferentes maneras dependiendo de la información y las hojas de cálculo que se usen con ella.

Me gustaría poder hacer que el código sea reutilizable especificando un método para llamar en una cadena usando la función Application.Run. Entonces puedo reescribir la función que cambia.

Ahora, si estuviera usando Java o C#, podría extender una clase abstracta y volver a escribir las partes internas de la función. Si estuviese usando JavaScript, podría almacenar una función en una variable y pasar la variable a la clase y llamarla desde allí.

Dentro de mi clase tengo una propiedad pública llamada "verificationModule" que configuro para el nombre de la función que quiero que llame.

Sub VerifyWorkLocations(empLoc As EmployerLocation) 
... 
    For i = 0 To empLoc.numOfEmp 
     Application.Run verificationModule, empLoc.taxdescmatch, empLoc.employees(i) 
    Next i 
... 
End Sub 

Sin embargo, cuando intento llamar Application.Run recibo el siguiente error:

Compile Error:

"Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions"

Ya he intentado hacer mi Definido por el usuario Tipos en un Class Module pero básicamente dice que un módulo de clase fue el mal lugar para un tipo.

Respuesta

-2

Para añadir un módulo a una aplicación de VBA, pruebe los siguientes pasos (suponiendo que ya ha introducido el IDE VBA):

  1. Desde el Explorador de proyectos, haga clic en su proyecto.
  2. Haga clic en "Insertar ..."
  3. Seleccione "Módulo".
  4. Si no hay módulos, se creará una nueva carpeta dentro del proyecto VBA/Excel, denominada "Módulos", y se creará un módulo con un nombre predeterminado de "Módulo1".
  5. Haga doble clic en el módulo para abrirlo en el editor de origen.

Aquí es donde debe colocar UDT. Creo que esto es debido a la diferencia en la forma en que estos tipos se almacenan internamente por VBA relación a la estructura de estilo COM de elementos/objetos declarados/manipulada como clases ...

enter image description here

+0

Me parece que eso es lo que hice cuando creé todos los módulos para el proyecto. ¿Hay algo más aquí me estoy perdiendo? – leeand00

+0

¿Dónde pusiste el UDT? Como prueba, simplemente puse un UDT de muestra en la parte superior de un módulo creado como se describió anteriormente, y parece haber funcionado bien ... –

+0

¿O no entiendo bien el problema y quieres migrar tus UDT a uno completo? ¿Clases tituladas en VBA? –

8

El error proviene de VB de pleno derecho, donde puedes crear un proyecto dll de ActiveX, crear una clase pública allí y poner un UDT en esa clase.

En VBA, utiliza clases en lugar de UDT cuando necesita forzar desde o hacia una variante.

Así que solo declare una clase con todos los campos que tiene en su UDT, y elimine el UDT.

O bien, cree una DLL en VB6 que solo contenga la declaración del tipo y haga referencia a esa dll desde VBA. O, si te sientes cómodo con IDL, simplemente crea un archivo TLB directamente.

Cuestiones relacionadas