Asignar objeto de palabra a variante variable en VBA -- vba campo con object campo con ms-word campo con variant camp Relacionados El problema

Assign Word Object to Variant Variable in VBA


0
vote

problema

Español

Mi objetivo es crear una matriz de varias plantillas globales que definí en una tabla. Mi macro lee la mesa. Si el nombre especifica una plantilla disponible, mi matriz debe contener el objeto. Si la plantilla no se puede encontrar, la matriz debe mantener el nombre que no se podría procesar. este documento es de tipo DOCM. Está asignado a SFS (0) como predeterminado. Aquí hay un extracto de mi código.

  Private Sub TestSetSfs()     Dim Sfs() As Variant     SetSfs Sfs     Debug.Print Sfs(0).Name     Debug.Print VarType(Sfs(0))             ' returns vbString End Sub  Function SetSfs(Sfs() As Variant) As Long      Dim Tbl As Table      ReDim Sfs(20)                           ' max 20 references     Set Sfs(0) = ThisDocument      Debug.Print Sfs(0).Bookmarks.Count      ' works as expected     Debug.Print VarType(Sfs(0))             ' returns vbString     Debug.Print GetTextTbl(Tbl, Sfs(0), "SomeName") End Function  Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean     GetTextTbl = True End Function   

Mi problema es con la línea Set SFS (0) = este documento . En la siguiente línea del procedimiento de prueba, SFS (0) funciona correctamente como un objeto, lo que permite un marcador. Cuentas. También se muestra como un objeto en la ventana de los lugareños. Sin embargo, la función GetTextTBL lo rechaza como "desajuste del tipo de argumento byref" que no hace cuando se reemplaza con este documento en la llamada. Esto me pidió a mirar su Vartype que devuelve VBSTRING en lugar de vbobject.

Déjame agregar que ya tengo esta idea trabajando en Excel (con Addins), pero necesito un equivalente en la palabra donde creo que la plantilla global cumpliría con mis requisitos si pudiera asignar objetos a la variante SFS (). ¿Alguna idea de cómo hacer eso?

Original en ingles

My aim is to create an array of various global templates which I define in a table. My macro reads the table. If the name specifies an available template my array should hold the object. If the template can't be found the array should hold the name that couldn't be processed. ThisDocument is of docm type. It's assigned to Sfs(0) as the default. Here is an excerpt from my code.

Private Sub TestSetSfs()     Dim Sfs() As Variant     SetSfs Sfs     Debug.Print Sfs(0).Name     Debug.Print VarType(Sfs(0))             ' returns vbString End Sub  Function SetSfs(Sfs() As Variant) As Long      Dim Tbl As Table      ReDim Sfs(20)                           ' max 20 references     Set Sfs(0) = ThisDocument      Debug.Print Sfs(0).Bookmarks.Count      ' works as expected     Debug.Print VarType(Sfs(0))             ' returns vbString     Debug.Print GetTextTbl(Tbl, Sfs(0), "SomeName") End Function  Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean     GetTextTbl = True End Function 

My problem is with the line Set Sfs(0) = ThisDocument. In the next line of the test procedure Sfs(0) works correctly as an object, permitting a Bookmarks.Count. It's also shown as an object in the Locals window. However, the function GetTextTbl rejects it as "ByRef argument type mismatch" which it doesn't do when replaced with ThisDocument in the function call. This prompted me to look at its VarType which returns VbString instead of vbObject.

Let me add that I already have this idea working in Excel (with addins) but I need an equivalent in Word where I think the global template would meet my requirements if I could assign objects to the Sfs() variant. Any idea how to do that?

           
         
         

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Debería ser fundido de un Variant a un Object , pero todo lo que he leído sobre el tema en línea dice que no puede convertir un Variant < / Código> a un Object en VBA.

Sus alternativas deben seguir con el uso de un objeto Object4 Document ) o SITAR CON UN Object6 IN Todos los lugares, ya que ambos parecen proporcionar la funcionalidad que necesita en este ejemplo.

para cambiarlo a esto (para usar el método de variante):

  Function GetTextTbl(Tbl As Table, Doc As Variant, Tn As String) As Boolean   

o cambia ambos a esto (para usar el método de objeto):

  Dim Sfs() As Object   Function SetSfs(Sfs() As Object) As Long    

Uso de ello como un Object en todos los casos tiene más sentido para mí, ya que puede usar su declaración original de su función Object10 como:

  Object111  

y luego su intellisense funcionará dentro de esa función. Simplemente asegúrese de no pasar un objeto que sea algo que no sea un documento de Word o obtendrá un error.

 

It would need to be casted from a Variant to an Object, but everything I have read on the subject online says that you cannot convert a Variant to an Object in VBA.

Your alternatives are to stick with using a Variant in all places (instead of the Document object) or stick with using an Object in all places, as they both seem to provide the functionality you need in this example.

So either change it to this (to use the variant method):

Function GetTextTbl(Tbl As Table, Doc As Variant, Tn As String) As Boolean 

Or change both of these to this (to use the object method):

Dim Sfs() As Object   Function SetSfs(Sfs() As Object) As Long  

Using it as an Object in all cases makes the most sense to me, as then you can use your original declaration of your GetTextTbl function as:

Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean 

And then your intellisense will work inside of that function. Just make sure you do not pass an object to it that is something other than a Word Document or you will get an error.

 
 
 
 
2
 
vote

es un poco de respuesta tardía, pero la solución a su problema es usar una colección en lugar de una matriz. Las colecciones (o scripting.dictionarios) son una forma más natural de trabajar con objetos.

  Object2  
 

Its a bit of a late answer but the solution to your problem is to use a collection rather than an array. Collections (or Scripting.Dictionaries) are a more natural way to work with objects.

Private Sub TestSetSfs()     Dim Sfs As Collection     Set Sfs = New Collection     SetSfs Sfs     Debug.Print Sfs.Item(1).Name     Debug.Print VarType(Sfs.Item(1))             ' returns vbString End Sub  Function SetSfs(ByVal Sfs As Collection) As Long      Dim Tbl As Table           Sfs.Add ThisDocument      Debug.Print Sfs.Item(1).Bookmarks.Count      ' works as expected     Debug.Print VarType(Sfs.Item(1))             ' returns vbString     Debug.Print GetTextTbl(Tbl, Sfs.Item(1), "SomeName") End Function  Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean     GetTextTbl = True End Function  
 
 
 
 

Relacionados problema

2  Tipo de datos de rango denominado  ( Data type of named range ) 
Tengo un rango llamado en Excel llamado StartDates, por ejemplo. El rango con nombre solo contiene fechas. Código de ejemplo a continuación: Sub test2() Di...

1  Cómo establecer correctamente una variante de propiedad publicada  ( How to correctly set a variant published property ) 
Estoy escribiendo un componente que publica una propiedad variante llamada "valor". En la ventana del inspector de objetos puedo ver la propiedad y su tipo. ...

2  ¿Cómo comprobar la variante para NULL?  ( How to check variant for null ) 
Estoy recibiendo respuesta de DB y necesito verificar si no es float[] samples32array = samples32.ToArray(); using(BinaryWriter writer = new BinaryWr...

0  API de Spree - Crear variante de producto con cantidad inicial de stock  ( Spree api create product variant with initial stock quantity ) 
Estoy tratando de crear una variante con la cantidad de acciones iniciales, a través de la API en una aplicación. URL EJEMPLO: --post http://localhost:30...

10  Plantilla de visitante para BOOST :: VARIANT  ( Visitor template for boostvariant ) 
Me gustaría usar un boost.variant<T0,T1,T2> como un parámetro a una clase de "visitante" de la plantilla que proporcionaría a los operadores de visitantes s...

6  ¿Pasar la prueba de una variante de construcción específica en Android + Gratily?  ( Skip test for specific build variant in androidgradle ) 
Tengo una variante de construcción específica que solo se usa para las pruebas simuladas. Preferiría no dirigir las pruebas de unidad contra esta variante (pe...

0  Problema con combinación Boost :: Exception and Boost :: Variant  ( Problem with combination boostexception and boostvariant ) 
Tengo un problema extraño con la estructura variante de dos niveles cuando se incluye :: la excepción está incluida. Tengo el siguiente fragmento de código: ...

6  Boost Variante consigue fallar  ( Boost variant get fail ) 
Tengo dicho código: boost::variant<b2DistanceJointDef, b2FrictionJointDef, b2GearJointDef, b2MouseJointDef, b2PrismaticJointDef, b2PulleyJointDef, ...

0  ¿Es posible sobrescribir la variante estándar en SmartVarinermanagement?  ( Is it possible to overwrite the standard variant in smartvariantmanagement ) 
He creado una tabla inteligente utilizando las columnas proporcionadas por el servicio ODATA y los metadatos correspondientes. También agregué la gestión de l...

2  Limpieza adecuada de CcomsAfearray <Variant>  ( Proper cleanup of ccomsafearrayvariant ) 
DADA: { CComSafeArray<VARIANT> sa; CComVariant ccv(L"test"); sa.Add(ccv, TRUE); } Esperaba que el Dtor of Ccomsafearray llamara :: VariantC...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos