Establecer ruta para guardar carpeta desde botón de comando

Me gustaría saber cómo establecer una ruta para guardar carpetas desde un botón de comando. El archivo Access lo tengo en un pen drive y dependiendo del ordenador en el que lo utilice, las rutas varían. Es decir, en unos casos la ruta seria por ejemplo E:\.....  ó F:\..... Etc. Lo fácil seria establecer la ruta para que guarde las carpetas en el disco duro (C:), pero por motivos de mi trabajo necesito utilizar diferentes ordenadores y la ruta C:\..... No me sirve, ya que las carpetas tengo que guardarlas en el pendrive.

El código que tengo en el botón de comando es el siguiente:

Private Sub Comando38_Click()
Dim MiFso As Object
Dim Ruta As String

Ruta = "J:\Aula conecta BD\Archivos\" & Me.id

Set MiFso = CreateObject("Scripting.FileSystemObject")

DoCmd.SetWarnings False

On Error GoTo nocrear

MiFso.CreateFolder Ruta

MsgBox "Carpeta creada con éxito"

nocrear:

DoCmd.SetWarnings True

DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
Application.FollowHyperlink Application.CurrentProject.Path & "\Archivos\" & Me.id
End Sub

3 Respuestas

Respuesta
1

Puede crear la carpeta o establecer una ya existente con la librería "Microsoft Office 16.0 Object Library" o la que tenga su PC.

FORMULARIO

Hago clic en el botón Crear Carpeta.

Puedo seleccionar la unidad, moverme y crear carpeta como muestran los recuadros rojos.

En este ejemplo seleccioné mi unidad D: y como "Nueva Carpeta" e ingresado DemoCarpeta. Por último, hago clic en Carpeta seleccionada y me queda el nombre de la nueva carpeta en el formulario.

CÓDIGO DEL BOTÓN

Private Sub btnCrear_Click()
  Me.ctlCarpeta = selectCarpeta
End Sub

Grabe este código en un módulo.

(Tiene que hacer referencia a la libreria "Microsoft Office x.y Object Library" en donde x.y depende de la versión de su pc)

Public Function selectCarpeta() As String
   'Requiere registro de la referencia "Microsoft Office x.y Object Library"
    'Creamos un control de errores
    On Error GoTo sol_err
    'Declaramos las variables
    Dim vFD As Object 'vFD=FileDialog
    Dim vRutaIni As String
    'Difinimos la ruta inicial
    vRutaIni = Application.CurrentProject.Path
    'Creamos el objeto FileDialog
    Set vFD = Application.FileDialog(msoFileDialogFolderPicker)
    'Configuramos las características de nuestra ventana de dialogo
    With vFD
        .Title = "Seleccionar o crear carpeta"
        .ButtonName = "Carpeta seleccionada"
        .InitialView = msoFileDialogViewList
        .InitialFileName = vRutaIni
        'Detectamos el boton pulsado por el usuario
        If .Show = -1 Then
            'Asignamos a la función la carpeta seleccionada, convirtiendola a un valor de tipo String
            selectCarpeta = CStr(.SelectedItems.Item(1))
        Else
            'Si se pulsa cancelar avisamos y salimos
            MsgBox "Ha cancelado la selección", vbOKCancel Or vbExclamation Or vbMsgBoxSetForeground, "TodoExpertos"
            Exit Function
        End If
    End With
Salida:
    Exit Function
sol_err:
    MsgBox "Se ha producido un error: " & Err.Number & " - " & Err.Description
    Resume Salida
End Function
Respuesta
1

No sé si te he entendido, creo que quieres crear una carpeta en una ruta que tu decidas. Si es así, por ejemplo, tengo el formulario con dos cuadros de texto, uno donde pongo la ruta donde quiero crear la carpeta con el nombre del segundo cuadro de texto

Cuando pulso el botón

Ya me la ha creado donde quería.

El código del evento Al hacer clic del botón es simplemente

Private Sub Comando292_Click()
MkDir "" & Me.Ruta & "" & "\" & Me.Tramite & ""
End Sub

Y ahora con tu permiso me voy a dar un baño en La Cortina.

Hola Julián, gracias por tu respuesta. 

En realidad, lo que me hace el código del botón de comando, es crear una carpeta para cada registro que lo necesite, dentro de la carpeta archivos, esta carpeta está dentro de otra que se llama Aula conecta BD. Lo que quiero es que sea donde sea que pinche el pendrive, me guarde la carpeta en su lugar correcto, independientemente de la ruta donde ponga el pendrive. 

No se si me explico. Disfruta el baño en La Cortina :)

Pues, más o menos, es lo que te decía. Cuando pongas en cualquier ordenador el USB, la base la abres desde él, independientemente de que en un ordenador esté en

J:\users....

en otro ordenador estaría en

D:\.....

Cuando abres la base, en ese formulario le pones la ruta del, digamos, disco duro de ese ordenador donde quieres guardarlo y te crea la carpeta.

¿Qué el formulario es continuo?. En vista diseño del formulario le añades en la sección Detalle un botón y en sus propiedades-Eventos-Al hacer clic le pones lo mismo, pero por ejemplo

MkDir "" & Me.Ruta & "" & "\" & Me.NombreCliente & ""

Así, cuando estés en un registro y pulses el botón, te creara la subcarpeta

........................\Pedro Lopez

Si pulsas el botón de otro registro te crearía

...................\María Pérez

Etc.

No sé si es eso a lo que te refieres.

P.D. El agua estaba buenísima.

La opción que me propones es buena, pero le veo el inconveniente de tener que estar escribiendo la ruta en el campo "ruta donde guardar".

La idea que yo tenía en un principio era asignar el código de VB adecuado, en el evento al hacer clic del botón de comando, para que me crease la carpeta en el pendrive, independientemente del PC que esté utilizando. 

La opción propuesta por Enrique Feijóo, me da errores. 

P.D. Me lo puedo imaginar, La Cortina es especial para los que somos de CT.

Yo tenía entendido que la base estaba en el pendrive y lo que querías era crear una carpeta en cualquier ordenador al que lo conectaras.

Perdona, es que seguramente no me explique suficientemente bien. Es que no entiendo mucho de programación etc. y la aplicación que hice hace un tiempo fue gracias a tu impagable ayuda. De lo que te estoy muy agradecido. 
Dicho esto, trataré de explicarme de otro modo. Se trata de crear carpetas para archivar documentos en word, pdf etc. Estos documentos se guardarán en la carpeta que deseo crear desde la aplicación. Cada registro tendría su carpeta que se crea con el botón de comando y son nombradas con el campo id (que es auto numérico). Es decir, las carpetas que se crean con el botón de comando son únicas para cada registro. Estas carpetas a su vez se guardan en una carpeta genérica llamada Archivos, y esta última junto con la aplicación está en una carpeta llamada Aula conecta BD, la cual se encuentra en un pendrive. 
El problema surge cuando cambio de PC por que las rutas cambian y no me crea la carpeta correctamente. 
A ver si ahora se me entiende un poco mejor. 
Saludos

Creo que la idea que te da Enrique es buena.

Respuesta
1

Si la aplicación esta en el Pen y se ejecuta desde el (por ello los datos han de permanecer en el), conocida la estructura del pen (es una constante), crear la ruta es sencillo.

Partiendo del supuesto de que en el pen (le han 'prestado' la letra 'H') la ruta a la carpeta con los datos es :

H:\Datos_Aplicacion\Empresa_00\Fotos\.......

Para cada empresa se puede considerar constante: ==> Datos_Aplicacion\Empresa_00 y dado que se conoce la estructura del PEN, se puede recrear la ruta adecuada.

¿Deseamos crear la carpeta 'Correos' en la empresa_00?

En una variable (Ruta_Datos, de tipo String) creamos la ruta:

Obtenemos la raíz
Ruta_Datos = Left(Ruta_Datos ,Instr(Ruta_Datos,"\"))

Se la adjudicamos a la constante antes mencionada y añadimos la carpeta a crear
Ruta_Datos = Ruta_Datos & "Datos_Aplicacion\Empresa_00\" & "correos"

Solo queda ejecutar el comando:
MkDir Ruta_datos

La secuencia correcta, (en la anterior falta la línea para obtener el Path )

Dim Ruta_datos$
Ruta_datos = Left(CurrentProject.Path, InStr(CurrentProject.Path, "\"))
Ruta_datos = Ruta_datos & "Archivos\Empresa_00\"
Ruta_datos = Ruta_datos & "correos"
MkDir Ruta_datos

En una línea:
MkDir Left(CurrentProject.Path, InStr(CurrentProject.Path, "\")) & "Archivos\Empresa_00\" & "correos"

Muchas gracias Enrique por tu respuesta. 
esta noche haré la prueba a ver si me puedo aclarar y veré si funciona. 

Funcionará tomando como 'Raíz' la de la aplicación desde la que se ejecute y que en el primer mensaje has publicado que es el pendrive (puede ser cualquier ubicación):

El archivo Access lo tengo en un pen drive y dependiendo del ordenador en el que lo utilice, las rutas varían

He asumido que el 'archivo' es la aplicación.

Exactamente. Tengo en un pen drive una carpeta llamada “Aula conecta BD”, dentro de ella tengo el archivo access y otras dos carpetas, una de ellas con fotos y la otra llamada “Archivos”. Cuando yo hago click en el botón de comando de un formulario me crea una carpeta con el nombre del registro correspondiente. Me la crea dentro de la carpeta “Archivos”. Hasta hay todo correcto, pero si pincho el pen drive en otro PC la ruta es diferente y no me crea la carpeta. La intención es intención es adaptar el código del botón de comando para que me cree la carpeta, independientemente del PC que esté utilizando.

Si. El archivo access es la aplicación 

Buenos días Enrique, he estado probando con los códigos que me has proporcionado y me da errores. Seguiré intentándolo. Voy a borrar todo el código que tengo en el botón y le pondré únicamente el que me has facilitado. 

Saludos

Por simple curiosidad:

¿Podías publicar lo que has creado y el error que te aparece?

En la primera respuesta no copie la primera asignacion a Ruta_datos, una línea:

Ruta_datos  = CurrentProject.Path

En ella se obtiene la ruta a la aplicación y de ella se obtiene la letra asignada a la unidad, solo se tiene que sustituir en tu línea original (Ruta = "J:\Aula conecta BD\Archivos\" & Me.id) la letra de la unidad (J)  que se puede hacer asi:

Ruta = Left(CurrentProject.Path,1) & Mid (Ruta,2)

Paso a paso para obtener el resultado (en la ventana de inmediato)

Ruta = "J:\Aula conecta BD\Archivos\" & "ABCD"
?ruta
J:\Aula conecta BD\Archivos\ABCD
?Mid (Ruta,2)
:\Aula conecta BD\Archivos\ABCD


? CurrentProject. Path
E:\Aplicaciones
? Left(CurrentProject. Path, 1)
E


Ruta = Left(CurrentProject.Path,1) & Mid (Ruta,2)
?ruta
E:\Aula conecta BD\Archivos\ABCD

En el código primitivo se sustituyen los tres primeros caracteres (no siempre la ruta es una unidad de disco como en este caso)

Pon especial atención (al construir la ruta) en que se ajuste a las reglas (la barra invertida como separador, espacios que se cuelan ...), el mínimo error y la ruta será incorrecta

(La ventana de inmediato es útil para detectar estos detalles en tiempo de ejecución)

Gracias por tu ayuda, antes de nada. 

Este es el código que he ido poniendo en el botón de comando. No entiendo nada de programación y estoy intentando adaptar el código que me has facilitado, pero me salen errores. Actualmente tengo el código como muestra la imagen y me da error en la última fila.

Saludos

Si esa línea no diese error, se estaría creando una carpeta que 'colgaría' de la carpeta en que esta la aplicación, supongo que 'el error' lo da porque no existe la carpeta 'archivos' en esa ruta (tiene que existir para crear en ella el objeto Me. ID)

Siendo H la letra que le asigna el ordenador al Pen

Se desea crear una carpeta en H:\Aula conecta BD\Archivos\" & Me.id

Suponiendo que la aplicación activa esta en: H:\Aplicaciones\Mi_Aplicacion.accdb 
.... Application.CurrentProject.Path & "\Archivos\" & Me.Id
Devolverá: H:\Aplicaciones\Archivos\" & Me.Id

H:\Aula conecta BD\Archivos\" & Me.id no es lo mismo que: H:\Aplicaciones\Archivos\" & Me.Id

Mi consejo:

Decídete por el método que entiendas y aplícalo (las mezclas solo dan dolor de cabeza)
Mi propuesta:
Borra todo y si en Ruta esta la ruta (real) del objeto (con letra incluida), algo como 
Dim Ruta As String
(también funciona Dim Ruta$)

Y se le da como contenido (xx = una letra cualquiera, Me.ID ="Fotos"): 
Ruta = "xx:\Aula conecta BD\Archivos\" & "Fotos"

Con: Ruta = Left(CurrentProject.Path,1) & Mid (Ruta,2)

Se obtendrá: H:\Aula conecta BD\Archivos\Fotos
.......................
Si Ruta = "\Aula conecta BD\Archivos\" & "Fotos"
Con: Ruta = Left(CurrentProject.Path,1) & Ruta
Se obtendrá: H:\Aula conecta BD\Archivos\Fotos
...............................

Solo falta:
MKDIR Ruta

Y la carpeta esta creada en su destino

Resumiendo:
Private Sub Comando_38_Click ()
Dim Ruta As String
Ruta = Left(CurrentProject.Path, 1) & "\Aula conecta BD\Archivos\" & Me.Id
MKDIR Ruta
End Sub

Coloréalo a tu gusto (por ejemplo, verificar que ID tiene un valor, poner un mensaje de que se creó para obligar a cerrar una ventana emergente ... etc.).

Muchas gracias por la ayuda. Esta noche lo probaré a ver qué tal va. 
Saludos. 

Algo que evitara un posible mensaje de error es la verificación de que hay 'algo' en Me. ID, si no lo hay (o por ejemplo: no es válido por ser solo espacios) se aborta el proceso (y sí, aquí un mensaje de que 'algo raro pasa' tiene sentido).
Lo anterior (ampliado y a la vez concentrado):

Private Sub Comando_38_Click ()
IF Len (Trim(Me.Id)) = 0 Then Msgbox "no hay nombre para crear la carpeta" : Exit Sub
MKDIR Left(CurrentProject.Path, 1) & "\Aula conecta BD\Archivos\" & Me.Id
End Sub

Aceptará cualquier nombre para la carpeta que respete las reglas que impone el sistema operativo

Hola Enrique, buenas noches. No consigo que funcione, me sigue dando error

Necesito un dato

En esa ventana (la de VBA) pusa la combinación de teclas CTRL + G (o en el menú 'ver' la ventana de inmediato).
En esa ventana (la de inmediato) y con el error (tal como está en la imagen ) escribe
? Ruta
Y a continuación un 'Intro', mostrar el contenido de la variable en la siguiente línea ...
¿Puedes copiarlo y pegarlo en tu respuesta? (Una imagen también vale, pero pesa más para la misma información)

Buenos días Enrique, 

Al poner Ruta y darle Intro me sale este mensaje:

 ?ruta
J\Aula conecta BD\Archivos\2

El número 2, imagino que es porque el registro activo en ese momento era el 2. He probado con el registro número 1 el resultado es:

?ruta
J\Aula conecta BD\Archivos\1

Gracias por tu ayuda!!

Lo único que se me ocurre es que la carpeta ya existe (algo que tendrás que verificar en el Pen),
pero el error no es de Access, es del sistema operativo que no permite duplicar carpetas (si lo permitiese sería un caos).

Las carpetas pueden existir porque (en los controles anteriores) en que se utilizó MKDIR y no dio error ... se crearon las carpetas (verifica el PEN y antes de borrar algo, lee el final del mensaje).

Esta situación se puede controlar, basta una verificación previa de que la carpeta existe:

If Dir(Ruta, vbDirectory) = Me.Id  ==>  Si se cumple la igualdad es que existe (y .... error)
If Dir(Ruta, vbDirectory) = "" Si se cumple la igualdad es que NO existe

Se puede mandar un mensaje y abortar la creación de la carpeta (es innecesario, ya existe), pero eso solo vale para frustrar al usuario y obligarle a cerrar un mensaje emergente (y si se hace de forma automatizada puede ser catastrófico).

Si se desea crear y ya está creada lo más practico es 'no crearla y continuar' (se cumplen las condiciones para poder hacerlo).

Basándome en que si no existe devuelve una cadena vacía, propongo:
If Dir(Ruta, vbDirectory) = "" Then MKDir Ruta

Espero acertar en el diagnóstico y que puedas alcanzar tu objetivo

Buenos dias Enrique, pues a pesar de los intentos aún no he conseguido que funcione. 

Actualmente tengo este código en el botón de comando.

Private Sub Comando38_Click()
Dim Ruta As String
Ruta = Left(CurrentProject.Path, 1) & "\Aula conecta BD\Archivos\" & Me.id
If Dir(Ruta, vbDirectory) = "" Then MkDir Ruta
End Sub

Me muestra el error (marcado en amarillo) en MKDir Ruta

La ruta sería algo así: 

Pendrive = J:\

        Aula conecta BD - Esto es una carpeta (dentro de ésta, lo siguiente)

                 Aula conecta BD - Esto es la aplicación

                 Fotos - Esto es una carpeta

                 Archivos - Esta es otra carpeta (dentro de ésta se crearían las carpetas nuevas)

                             1- Estas serian las carpetas que pretendo crear con el botón de comando

                             2 - etc (una carpeta para cada registro de la aplicación)

Perdóname Enrique, pero es que de programación no entiendo nada. Te agradezco mucho la ayuda que me aportas, pero no consigo que funcione. 

Saludos

Mis disculpas, no me fije que lo que devolvía 'Ruta' era incorrecto (le faltan los dos puntos) creía haberlos añadido al inicio de la parte fija.

Dos opciones: (aplicar una de ellas)
A.-  Ruta = Left(CurrentProject.Path, 2) & "\Aula conecta BD\Archivos\" & Me.id
B.- Ruta = Left(CurrentProject.Path, 1) & ":\Aula conecta BD\Archivos\" & Me.id

?Ruta debería devolver (para la unidad 'J' y Me.Id= 1) ==> J:\Aula conecta BD\Archivos\1
En un rato (obligaciones familiares) desglosare la funcion completa paso a paso para que puedas utilizarla como base para otras cosas.

Muchísimas gracias. 
Cuando puedas, no hay prisa. Yo también tengo obligaciones familiares este fin de semana. 
Más tarde probaré las opciones que me propones. 
Gracias!!!

---- Numerando las líneas ----


1  Private Sub Comando38_Click()
2  IF Len(Trim(Me.Id )) = 0 Then Exit Sub
3  Dim Ruta As String
4  Ruta = Left(CurrentProject.Path,3) & “Aula conecta BD\” & Me.ID
5  IF Dir(Ruta, VbDirectory) =”” Then MKdir Ruta
6  End Sub

Línea 1, se define una acción
Private
Sub Comando38_Click(): es el entorno donde puede utilizarse normalmente el formulario/ informe.
Private Sub Comando38_Click(): Sub (de Sub-Function) las subfunciones no retornan nada, las funciones sí.
Private Sub Comando38_Click(): es el nombre del objeto al que está asociado
Private Sub Comando38_Click(): el evento del objeto que lo activara
Private Sub Comando38_Click(): este caso vacíos, puede contener datos (parámetros),  utilizables como variables internas del Sub (o función)

Línea 2, en ella se verifica que existe un valor (es un dato indispensable) si no lo hay se aborta al instante
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: (el inicio de una condición clásica IF ... Then ... Else ....End IF)
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: Función integrada, devuelve la longitud del texto pasado como parámetro
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: Función integrada, elimina los espacios anteriores y posteriores
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: El parámetro (un texto), el dato con el que se interactúa.
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: La condición a cumplir.
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: lo que hace si se cumple la condición.
IF Len(Trim(Me.Id )) = 0 Then Exit Sub: da por finalizado el proceso en curso ( Sub Comando38_Click)
Nota: Si se recortan los espacios (los números no los tienen, pero los textos sí) se obtiene un dato ‘limpio’, se calcula la longitud del texto obtenido. Si es cero: no tiene sentido continuar y finaliza.

Línea 3, Se dimensiona una variable de texto para usos posteriores
Dim
Ruta As String: inicio de la declaración de variables (una o más si se separan por coma simple)
Dim Ruta As String: el nombre de la variable
Dim Ruta As String: el tipo de variable, las de texto ‘nacen’ vacías (””), las numéricas a cero (0)

Línea 4, Se le asigna valor a la variable
Ruta
= Left(CurrentProject.Path,3) & “Aula conecta BD\” & Me.ID: la variable
Ruta = Left(CurrentProject.Path,3) & “Aula conecta BD\” & Me.ID:  la asignación del valor
Ruta = Left(CurrentProject.Path,3) & “Aula conecta BD\” & Me.ID:  Función integrada, tiene dos parámetros, retorna todo o parte del texto (primer parámetro) ,  el segundo parámetro: el número de caracteres –comenzando por la izquierda- que retornara (cero = ninguno, si supera la longitud del texto: todo el texto)

Línea 5 verificamos que ‘Ruta’ no exista y si se cumple podemos crear el objeto
IF
Dir(Ruta, VbDirectory) =”” Then MKdir Ruta: comienzo de la condición
IF Dir(Ruta, VbDirectory) =”” Then MKdir Ruta: Función integrada, verifica si existe el dato que se le pasa como primer parámetro, el segundo parámetro define el tipo de dato, si existe devuelve el nombre del objeto
IF Dir(Ruta, VbDirectory) =”” Then MKdir Ruta: La condición a cumplir (no lo localizo= cadena vacía)
IF Dir(Ruta, VbDirectory) =”” Then MKdir Ruta: lo que se ejecutara si se cumple la condición
IF Dir(Ruta, VbDirectory) =”” Then MKdir Ruta: un comando –de tiempos del MS-DOS- que crea una carpeta (el parámetro que le sigue)
IF Dir(Ruta, VbDirectory) =”” Then MKdir Ruta: variable con ‘la carpeta’ que tras verificar que no existe se crea

Línea 6 El final de la Sub(función) definida
End Sub:  aquí finaliza la subfunción


Si queda alguna laguna, puedo intentar resolverla

Hola Enrique, buenas noches. Retomo la tarea. 

He probado con el código que me has facilitado y me sigue dando error. Te adjunto imagen

No sé si he puesto algo mal y por eso da el error. 

Saludos

Ni tan siquiera has copiado textualmente la respuesta, la parte constante es diferente, si quieres conservar la que tiene los dos puntos y la barra, (solo le falta la letra) has de modificar en esa misma línea el tres (3) por un uno (1).

Si vuelves a leer la funcionalidad de LEFT, entenderás porque que con el tres se obtiene "J:\" y con el uno "J"

El error que marca se generó en el foro, se alteró la doble comilla inicial (quizás a causa del paso de Word al foro), bórrala y reescríbela de nuevo.
Escribir ese texto en el foro y después unificar el estilo era más tedioso que hacerlo en Word y pegarlo (no logre la compatibilidad que esperaba)

Buenos días Enrique, además de agradecerte la ayuda que me estas dando, también quería agradecerte la paciencia que estas teniendo conmigo.

He probado a cambiar el (3) por el (1) y también me da error. 

Te adjunto imagen. 

Saludos

Ahora  me sale otro error diferente.

Con la línea 

 Ruta = Left(CurrentProject.Path, 1) & ":\Aula conecta BD\Archivos\" & Me.id

El mismo error que en la línea cuatro y la comilla doble (travesuras de Word)

Buenas noches Enrique, haciendo un par de cambios, el código por fin ha funcionado.

Actualmente lo tengo así:

Private Sub Comando38_Click()
If Len(Trim(Me.id)) = 0 Then Exit Sub
Dim Ruta As String
Ruta = Left(CurrentProject.Path, 1) & ":\Aula conecta BD\Archivos\" & Me.id
If Dir(Ruta, vbDirectory) = "" Then
MkDir Ruta
End If
End Sub

De la línea 5 he bajado a la línea 6 "MkDir Ruta" y he añadido "End If". No se si es correcto, pero me ha funcionado. Pero, al probar el pendrive en el ordenador portátil me ha vuelto a dar un error. Algo si como que faltaba una referencia, la cual no recuero cual era.

Mañana por al mañana si tengo un ratito veré que referencia da el error.

Saludos Enrique.

Si en la misma línea del IF tras el Then tiene la acción a ejecutar (ver la línea 2), el 'End IF' es el final de la propia línea.
(Verificarlo añadiendo un End IF como línea 2.5, al compilar encontrara un End IF sin su IF)

Segmentar de la forma clásica los IF no les da ninguna ventaja, si acaso pierde más tiempo al tener que localizar el End IF a través de las líneas y en el otro caso lo tiene en la línea siguiente (nanosegundos que no se apreciaran).

El que ejecuta todo (el motor de Access) está en la maquina anfitrión, si en la aplicación se utilizan recursos que la maquina anfitrión no tiene ... esos recursos no estarán disponibles.
Si este fuera el caso, verifica si esos recursos los necesitas o simplemente los copio por estar instalados en el ordenador en que se diseñó la aplicación.
Si son prescindibles, e interfieren un normal funcionamiento: elimínalos de tu aplicación.

Perdona Enrique por no haber respondido antes, he estado muy liado, trabajo, familia etc. Quería darte las gracias por tu ayuda y por tu paciencia conmigo. Finalmente dejaré el código con el End If, porque funciona bien y es lo que quería. A demás no entiendo nada de programar. 

Lo dicho Enrique, muchísimas gracias por todo

Saludos, un abrazo. 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas