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

Tengo una plantilla docm con código vba dentro. Este código dispone de decenas de líneas que hacen referencia a bloques de contenido que he ido creando de este estilo:

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 código ya no encuentra estos bloques de contenido.
Ayuda por favor.
No se como implementar un código para que, aunque cambie la ubicación, sea capaz de seguir utilizando las macros y el código.

Respuesta
1

Revisa si lo siguiente te puede ayudar.

Pide que guarden los archivos en su escritorio.

Con la siguiente línea: ruta = Environ("USERPROFILE") & "\Desktop\"

Podrás obtener el nombre de la carpeta "escritorio", no importa la máquina donde se encuentre.

Entonces quedaría así:

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

Gracias por tu pronta respuesta Dante. ¿Es posible ir añadiendo más carpetas a esa línea? Imagina que unos se lo guardan en su escritorio, otros en una carpeta común llamada "informes", otros dentro de esa carpeta informes, en subcarpetas numeradas,... y así.

Por ejemplo: 

ruta = Environ("USERPROFILE") & "\Desktop\" & "\informes\" & "\carpeta numerada\"
Application.Templates( _
            ruta & "IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert Where:=Selection.Range, RichText _
            :=True

¿Y de esta manera ir añadiendo posibles localizaciones del archivo donde se encuentran los BuildingBlock? Yo no se donde van a alojar esas copias del archivo.

Debes homologar y definir dónde deben guardar los archivos.

Ninguna macro va a adivinar en dónde está el archivo.

En los sistemas siempre existen normas y reglas que deben seguir para que funcionen los sistemas.

Vale Dante. Es que no se como explicarlo.

Si la ruta final donde van a ir guardando sus respectivas copias al archivo "fuente" es L:\Informes pero dentro de esta carpeta "Informe", José guardara su copia en una carpeta llamada 142 (L:\Informes\142), Luis en una carpeta llamada 583 (L:\Informes\583) y así (no hay orden en la numeración eh), ¿encontrara la ruta?

Otra posible salida al problema ¿No hay alguna forma de guardar copia y que funcione como si fuera un acceso directo y así no tengo que reescribir las rutas?

Debo insistir en que debes poner reglas.

Así funcionan todos los sistemas.

Debes indicarle a todos los usuarios del sistema en dónde deben guardar el archivo.

---

Otra opción es que lo guarden en la misma carpeta donde tienes la macro, por ejemplo:

ruta = thisworkbook.path & "\"
Application.Templates( _
            ruta & "IT GATu.dotm"). _
            BuildingBlockEntries("IT VEH LIGERO").Insert Where:=Selection.Range, RichText _
            :=True

De esa manera no importa en cuál carpeta guarden el archivo.

¡Gracias! 

[Si en algo te ayudan las respuestas, no olvides valorarlas.

Mañana pruebo en la oficina y te digo ¿vale? 

Buenas tardes Dante.

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...

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:

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".

¿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?

Podrías agregar una hoja de configuración al archivo con la macro que se llame "Configuracion", en la celda A2 que pongan la ruta donde guardaron el archivo.

En la celda A2 tendrán algo como esto:

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

Ya con tu cuadro de diálogo, guardarás la carpeta en la hoja "configuracion", celda "A2"

Entonces en el código utiliza esto:

ruta = ThisWorkbook.Sheets("configuracion").Range("A2")
Application.Templates(ruta & "Informe Tecnico.dotm"). _
  BuildingBlockEntries("VEH A CUADRO").Insert Where:=Selection.Range, RichText _
  :=True

Es Word.

Algo así me imaginé, pero tu pregunta está en el tema de excel.

Entonces, al inicio de la macro, abrir un cuadro de diálogo para que seleccione la carpeta donde se encuentran los archivos de bloques.

Y así los pueden guardar donde quieran, pero al inicio de la macro deberán seleccionar la carpeta para que funcione.

En tu código reemplazas la carpeta seleccionada por el cuadro de diálogo.

¿Cómo hago eso? Tengo un nivel básico

Prueba así:

  Dim ruta As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Selecciona la carpeta con los template"
    .AllowMultiSelect = False
    If .Show <> -1 Then Exit Sub
    ruta = .SelectedItems(1) & "\"
  End With
  '
  Application.Templates(ruta & "Informe Tecnico.dotm"). _
    BuildingBlockEntries("VEH A CUADRO").Insert Where:=Selection.Range, RichText:=True

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas