Visual Basic para Aplicaciones - Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 17/03/2022 13:49:08
Buenos dias. Tengo una plantilla docm con codigo vba dentro. Este codigo dispone de decenas de lineas que hacen referencia a bloques de contenido que he ido creando de este estilo:
1
2
3
4
Application.Templates( _
            "C:\Users\X041754\Desktop\IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert Where:=Selection.Range, RichText _
            :=True
El problema sucede cuando el usuario que utiliza esta plantilla y guarda su trabajo en otra ruta, cuando abre su copia desde esa ruta, el codigo ya no encuentra estos bloques de contenido.
Ayuda por favor.
No se como implementar un codigo para que, aunque cambie la ubicacion, sea capaz de seguir utilizando las macros y el codigo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Antoni Masana (498 intervenciones) el 17/03/2022 14:53:44
Segun veo este código toma la plantilla del escritorio del Usuario

1
2
3
4
Application.Templates("C:\Users\X041754\Desktop\IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True

Posibles soluciones:

Lo busca en el escritorio del Usuario:

1
2
3
4
Application.Templates(Environ("USERPROFILE") & "\Desktop\IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True

Lo busca en el directorio por defecto:

1
2
3
4
Application.Templates(CurDir() & "\IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True

Más o menos lo mismo que el anterior:

1
2
3
4
Application.Templates("IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 18/03/2022 15:52:37
Buenas tardes Antoni.

Mira, que te expongo mejor el problema.

La ruta del archivo original Informe Técnico.dotm es:

L:\06. Modelos de documentos\Plantilla\Informe Tecnico.dotm

Cada compañero se va guardando copia (.docm) en su carpeta:

L:\02.- Informes 2022\Expediente\AT-16977010401

Por ejemplo:

* Juan trabaja en su Informe Tecnico.dotm y lo guarda en la ruta L:\02.- Informes 2022\Expediente\AT-16977010401\Informe Tecnico.docm

* Pedro trabaja en su Informe Tecnico.dotm y lo guarda en la ruta L:\02.- Informes 2022\Expediente\AT-17439610802\Informe Tecnico.docm

Y así todos...
Arbol

La ruta en común es L:\02.- Informes 2022\Expediente\ pero luego cada uno se crea una carpeta (AT-1795643, AT-184...) para guardar lo que vaya trabajando en el Informe Técnico.dotm

De esta copia del archivo original, cuando intentan hacer uso de los buildingblock, éstos ya no funcionan, porque la ruta de los buildingblock es:

Application.Templates( _
"L:\06. Modelos de documentos\Plantilla\Informe Tecnico.dotm"). _
BuildingBlockEntries("VEH A CUADRO").Insert Where:=Selection.Range, RichText _
:=True

Podría poner para el mismo building block "VEH A CUADRO" varias rutas más con el ON ERROR RESUME NEXT:
1
2
3
4
5
6
7
8
9
On Error Resume Next
Application.Templates( _
"L:\06. Modelos de documentos\Plantilla\Informe Tecnico.dotm"). _
BuildingBlockEntries("VEH A CUADRO").Insert Where:=Selection.Range, RichText _
:=True
Application.Templates( _
"L:\02.- Informes 2022\Expediente\"). _
BuildingBlockEntries("VEH A CUADRO").Insert Where:=Selection.Range, RichText _
:=True

Pero el problema es que no sé que número le van a dar a la carpeta que "cuelga" después de la carpeta "Expediente".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 18/03/2022 17:18:27
¿Y si creamos un cuadro de dialogo que, tras pulsar el botón guardar, tenga el usuario que indicar la ruta donde lo va a dejar y, automáticamente esa ruta sustituya la que hay en el archivo fuente?¿Es posible esto?¿funcionaria?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Antoni Masana (498 intervenciones) el 18/03/2022 18:40:40
Este código puede funcionar así, con una variable con la ruta:

1
2
3
4
Application.Templates(Directorio & "\IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True

¿Y para que quieres una variable con la ruta? Pues para buscarla, me explico, el comando CurDir() te devuelve el directorio por defecto. La cuestión es ver que devuelve y moverse por los directorios y buscar el fichero.

Otra opción es y siempre si es compartible e igual para todos estar en una única ubicación, en este caso en lugar de estar en:

1
L:\02.- Informes 2022\Expediente\AT-16977010401\IT GATu.dotm

Tenerlo en:

1
L:\02.- Informes 2022\Expediente\IT GATu.dotm

Al ejecutar el comando CurDir() devuelve:

1
L:\02.- Informes 2022\Expediente\AT-16977010401

Entonces se hace la siguiente asignación a la variable:

1
2
3
4
5
Directorio = CurDir() + "\..\"
Application.Templates(Directorio & "IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True

Y listo. Vale que todo esto es pura teoría por que no lo he probado ni puedo hacerlo por que no tengo las mismas condiciones que tu y no se si funciona pero es lo que se me ocurre hacer.
A falta de mas información y las oportunas pruebas no se me ocurre otra solución.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 18/03/2022 19:32:09
Otra opción es y siempre si es compartible e igual para todos estar en una única ubicación, en este caso en lugar de estar en:

1
L:\02.- Informes 2022\Expediente\AT-16977010401\IT GATu.dotm


Tenerlo en:

1
L:\02.- Informes 2022\Expediente\IT GATu.dotm
Esto no puedo, porque la carpeta "AT-16977010401" es una, de decenas con numeraciones.

Al poner esto:
Este código puede funcionar así, con una variable con la ruta:

1
2
3
4
Application.Templates(Directorio & "\IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert _
            Where:=Selection.Range, _
            RichText:=True
Si creo un dialogo para el usuario, para que indique donde lo va a guardar, ¿no podemos asignarle a la variable Directorio, el directorio del fichero fuente para que funcionen los building block ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Antoni Masana (498 intervenciones) el 18/03/2022 20:25:45
No lo se, se podría probar.

Se podría hacer que lo pidiese la primera vez que abre el documento, el problema es ¿Donde se guarda? Se podría guardar en un fichero de texto que se llame igual que el documento pero terminado en .TXT en lugar de .DOC.

Podría pedirlo cada vez que se abre el documento. Puede resultar molesto para el usuario.

Se podrían hacer otras cosas pero se cual es la forma de trabajar, ni la organización, ni el sistema informático, ni estructura de los documentos. Es más creo que los ficheros DOTM son plantillas de Word y poco más.

Si hablasemos de Excel lo domino mucho mejor pero el Word no lo conozco tanto.

Siento no poder ayudarte más.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 18/03/2022 20:47:37
Antony, el fichero plantilla es .dotm y el boton que he programado dentro de la cinta de opciones para que tengan que guardar, guarda una copia en formato .docm. He comprobado que en esta copia se guarda todo, macros incluida. El problema es que esta copia tienen que cambiarla de ubicacion, y por eso ya no les funcionan los bloques de contenido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 21/03/2022 08:27:49
Buenos dias Antony. Anda a ver si puedes ayudarme. Que no logro poner Ruta en lugar de esta linea:
1
( _"\\Centcs01srv01\g01303010007\02.- ATESTADOS 2022\ATESTADOS TUDELA\2. ACCIDENTES CIRCULACIÓN\AT-PRUEBA-22\GATu - INFORME TÉCNICO.dotm")

He hecho este sencillo codigo:
1
2
3
4
5
6
7
8
9
10
11
Sub Ruta()
Dim InicioRuta As String
Dim FinalRuta As String
Dim Ruta As String
Dim NumeroAT As String
InicioRuta = "\\Centcs01srv01\g01303010007\02.- ATESTADOS 2022\ATESTADOS TUDELA\2. ACCIDENTES CIRCULACIÓN"
FinalRuta = "GATu - INFORME TÉCNICO.dotm"
NumeroAT = "\AT-12345678\"     'Aqui creare un dialogo para que el usuario indique que numero AT-xxx le va a dar.
Ruta = InicioRuta + NumeroAT + FinalRuta
MsgBox Ruta
End Sub
Este codigo, el mensaje devuelve la ruta que le indico. Creo que estamos a un pasito de lograr lo que pretendo. Sustituir toda la linea del principio por la variable Ruta.

Lo pongo tal cual pero me da "Error de compilacion: Se esperaba Function o una variable.
1
2
3
Application.Templates(Ruta). _
            BuildingBlockEntries("INICIO Y EXPOSICION DE HECHOS").Insert Where:=Selection.Range, RichText _
            :=True
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Antoni Masana (498 intervenciones) el 21/03/2022 09:39:33
Estudio lo que me envías y te cuento.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 21/03/2022 09:56:45
Gracias Antony.
A tener en cuenta lo siguiente, porque estoy probando los comandos tanto CurDir como ChDir y tras varias pruebas con otros ejemplos encontrados en internet, veo que el error lo da, supongo, porque la ruta no empieza por una unidad C:, D:, etc, ya ves que es una ruta a un servidor que tenemos "\\Centcs01srv01\g01303010007\02.- ATEST......"
He probado los comandos citados con salida de mensaje. Si asigno una variable Directorio = "C:" , salta bien el mensaje al invocar CurDir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 21/03/2022 11:29:42
No, esto no es el problema, porque he colocado la misma plantilla en local C: y da el mismo error. Hay que ver como colocar lo que te he comentado antes. Poner la variable Ruta en lugar de la ruta en si.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 21/03/2022 14:09:53
Si quito la linea de control de errores, "on error resume next" lanza el siguiente error.
Se ha producido el error '5941' en tiempo de ejecucion: El elemento del conjunto no existe.

1
2
3
4
5
6
Sub MacroDinicio()
'On Error Resume Next
 
Application.Templates("Ruta").BuildingBlockEntries("INICIO Y EXPOSICION DE HECHOS").Insert Where:=Selection.Range, RichText _
            :=True
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Antoni Masana (498 intervenciones) el 21/03/2022 15:11:25
Te pongo unos cambios en el código para ver si te funciona.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function FUNC_Ruta()
    Dim InicioRuta As String, FinalRuta As String, NumeroAT As String
 
    InicioRuta = "\\Centcs01srv01\g01303010007\02.- ATESTADOS 2022\ATESTADOS TUDELA\2. ACCIDENTES CIRCULACIÓN\"
    NumeroAT = "@@"
    FinalRuta = "\GATu - INFORME TÉCNICO.dotm"
 
    While Dir(InicioRuta + NumeroAT + FinalRuta) = ""
       IF NumeroAT <> "@@" Then
          MsgBox "El numero da AT-xxx no es correcto o no existe la plantilla")
       End If
       NumeroAT = "AT-" & InputBox("Indique que número AT-xxx le va a dar.")
    Wend
    FUNC_Ruta = InicioRuta + NumeroAT + FinalRuta
    MsgBox FUNC_Ruta
End Function
 
Sub MacroDinicio()
    Application.Templates(FUN_Ruta). _
                BuildingBlockEntries("INICIO Y EXPOSICION DE HECHOS").Insert _
                Where:=Selection.Range, _
                RichText:=True
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Bloques de contenido dejan de funcionar al cambiar la ruta de archivo.

Publicado por Gorka (42 intervenciones) el 23/03/2022 15:43:29
Antony, muchas gracias por tu ayuda. De un foro ingles me han resuelto el problema. No me marcho sin enseñarte lo que me han indicado, mira lo que habia que poner:
La plantilla con las macros hay que colocarla en la ruta Templates y este codigo detecta la plantilla personalizada.
1
2
3
4
5
Dim myTemplate As Template
Set myTemplate = Application.Templates(ActiveDocument.AttachedTemplate.FullName)
Application.Templates.LoadBuildingBlocks
Application.Templates(myTemplate.FullName).BuildingBlockEntries("INICIO Y EXPOSICION DE HECHOS").Insert Where:=Selection.Range, RichText _
            :=True
Ahora, este codigo va en cada una de los modulos y tengo muchisimos modulos relacionados con BuildingBlocks, de hecho en algun modulo tengo varios sub con el codigo repetido. Necesito reducir codigo, porque lo unico que cambia es el nombre entre comillas, que en este ejemplo es "INICIO Y EXPOSICION DE HECHOS".
¿Quiza algo asi?:
1
2
3
4
5
Sub FijarPlantilla
Dim myTemplate As Template
Set myTemplate = Application.Templates(ActiveDocument.AttachedTemplate.FullName)
Application.Templates.LoadBuildingBlocks
End sub
¿Y luego llamar como Call FijarPlantilla?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar