Saltar al contenido

Si el Libro esta solo lectura que no se jecute la Macro


Recommended Posts

publicado

Buenas Noches Amigos del Foro

Una ves mas acudo a los genios de la programacion en VBA

mi situacion es la siguiente:

ya he buscadotemas relacionados "Si el Libro esta solo lectura que no se jecute la Macro" en el foro pero lo que he encontrado no me ha funcionado o no se como aplicarlo, hay usuarios de este foro que han planteado inquitud similar a la mia

tengo dos libros en Red:

Libro A = alli se encuentran los formularios y codigos de VBA, este libro estacompartido para que varios usuarios ingresen a el y puedan utilizar el mismo formulario

Libro B=este libro sirve como base de datos que tambien esta compartido donde se va guardando la informacion que llega del Libro A

entonces que pasa, cuando los usuarios ingresan la informacion casi al mismo tiempo me genera conflicto ya que coinciden en que la informacion se esta guardando en la misma fila del Libro B, entonces lo que quiero es que el Libro B no este compartirlo y solo que deje entrar al que primero mando la informacion desde los formularios que estan en el Libro A y si otro usuario manda informacion pues sale un aviso que por defecto que dice "es un archivo de solo lectura" inmediata mente se abre el cuadro para volver a renombrar el archivo y guardar la copia, lo que no quiero que no salga ese letrero "archivo de solo lectura" y mas bien salga un MsgBox que diga "la base de datos se esta modificando intente de nuevo" y no deje que la macro se ejecute y asi no de la obcion de guardar una copia, entonces cuando el otro usuario corra la macro de nuevo ya el Libro B estaria cerrado y por tanto dejaria guardar la informacion , asi repetitivamente

Gracias :tears_of_joy:

publicado

Hola Cesar, a ver si este código que tengo armado te sirve (debes adaptarlo a tus archivos y rutas).

Dim XLSLibro_B As Excel.Worksheet 'Se define la variable como hoja Excel

Set XLSLibro_B = Workbooks("NOMBRE DEL ARCHIVO").Sheets(1)


If Not Workbooks(XLSLibro_B.Parent.Name).ReadOnly Then
Workbooks(XLSLibro_B.Parent.Name).Close (True) 'cierra XLSLibro_B GUARDANDO los cambios
Else
Workbooks(XLSLibro_B.Parent.Name).Close (False) 'cierra XLSLibro_B SIN GUARDAR los cambios
MsgBox "El archivo está siendo utilizado por otro usuario." & Chr(10) _
& "Deberá volver a intentarlo más tarde, cuando el archivo esté disponible.", vbCritical
End If[/CODE]

Estoy suponiendo que alguna idea de VBA tenés, si no, tendrás que subir algún archivo para poder trabajar sobre él...

publicado

Buena Noche Manfred

gracias por tu respuesta, mis conosimientos son muy basicos ya que los proyectos que he echo han sigo gracias a lo que he podido consultar y adaptar de lo que he encontrago en este magnifico foro.

con respecto al codigo que me estas dando no lo pude adptarme sale un error que dice "Sub indice fuera del intervalo " y resalta de color amarillo esta parte del codigo Set XLSLibro_B = Workbooks("NOMBRE DEL ARCHIVO").Sheets(1), pues nose en que parte poner este codigo en mi proyecto, para hacer las pruebas en el archivo que adjunto le he cambiado de nombre a los libros:

Libro A ahora se llama Formularios

Libro B ahora se llama BaseDatos

Al libro BaseDatos le cambio de propiedad y le pongo el atributo de Solo Lectura para comprobar la macro, ya que las prubas las hago desde mi casa ya que no tengo a la mano otro computador en red, no se si necesariamente habria que hacer las pruebas estando el libro en una red compartida o cualquiera de las dos forma se puede...? Gracias por tu ayuda:courage: adjunto los dos libros

BaseDatos.xls

Formularios.xls

publicado

Ahora sí!, mucho mejor para dar respuesta ahora que subiste los archivos! :encouragement:

Para hacer las pruebas, haces bien en ponerle propiedad sólo lectura. Es que al querer abrir un archivo que está siendo usado por otro usuario, el método OPEN lo se abre como SOLO LECTURA.

Al menos esa es la forma que encontré para distinguir si el archivo está en uso! (si otro usuario conoce otra forma, lo invito a compartirla)

Private Sub CommandButton1_Click()
Dim WB As Workbook [COLOR=#008000]'Acá se declara la variable de objeto[/COLOR]
Application.ScreenUpdating = False

Set WB = Workbooks.Open(Filename:="C:\Users\CESAR\Desktop\Datos\BaseDatos.xls") [COLOR=#008000]'acá se asigna la variable para poder trabajar con ella[/COLOR]
If WB.ReadOnly Then
WB.Close (False) 'cierra XLSLibro_B SIN GUARDAR los cambios
MsgBox "El archivo está siendo utilizado por otro usuario." & Chr(10) _
& "Deberá volver a intentarlo más tarde, cuando el archivo esté disponible.", vbCritical
End If

Range("A2").Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop

ActiveCell = TextBox1 ''codigo
ActiveCell.Offset(0, 1).Select

ActiveCell = TextBox2 ''programa
ActiveCell.Offset(0, 1).Select

ActiveCell = TextBox3 ''nombre
ActiveCell.Offset(0, 1).Select

ActiveCell = TextBox4 ''apellido
ActiveCell.Offset(0, 1).Select

ActiveCell = TextBox5 ''tipo identificacion
ActiveCell.Offset(0, 1).Select

ActiveCell = TextBox6 ''# identificacion
ActiveCell.Offset(0, 1).Select

ActiveWorkbook.Save
ActiveWorkbook.Close
Range("C3").Select

Application.ScreenUpdating = True
Set WB = Nothing [COLOR=#008000]'es buena costumbre liberar de memoria las variables de objeto[/COLOR]

End Sub[/CODE]

Mas tarde comentá cómo te resultó

publicado

Buen día Manfred

Te comento el código me funciono súper solo que al momento que la macro encuentra que el libro es de solo lectura y le doy aceptar al MsgBox me sierra los dos libro pues al final del MsgBox le puse Exit Sub y ya no me cierra el Libro Formularios, pero ahora tengo otro problema que también necesito ayuda y es el siguiente:

Como comentaba los dos libro están en mi computador de la oficina y están en red, el libro BaseDatos no esta compartido, pero el Libro Formularios si lo esta para que todos los usuarios podamos ingresar al mismo tiempo en este y usar los mismos formularios, cuando corro la macro directamente desde mi computador todo esta bien pero cuando se ingresa a mi computador desde otro computador en red me genera el siguiente error : Se ha producido el error ‘1004’ en tiempo de ejecución, este hace referencia a que no encuentra la ruta para abrir el Libro BaseDatos, se me ocurre manejarlo de esta otra forma, dejar solo en red el Libro BaseDatos y en cada computador de los otros Usuarios dejar una copia del Libro Formularios y cuando la ejecuten que busque el Libro BaseDatos que esta en red, pero de todos modos generaría error en la ruta para abrir el libro, gracias por tu valiosa ayuda:02.47-tranquillity:

publicado
Te comento el código me funciono súper solo que al momento que la macro encuentra que el libro es de solo lectura y le doy aceptar al MsgBox me sierra los dos libro pues al final del MsgBox le puse Exit Sub y ya no me cierra el Libro Formularios,

Entonces esto lograste solucionarlo? Si no, agregá las líneas

ActiveWorkbook.Close[/CODE]

[/color]

[CODE]
[COLOR=#333333]Application.ScreenUpdating = True[/COLOR][/CODE]

[/left]

antes del EXIT SUB.

¿lo del error 1004 lo lograste solucionar? Como bien decís, el problema es la definición de la ruta de acceso al archivo.

publicado

Buena Tarde

Muchas Gracias por tu rapida respuesta,

lo del Exit Sub ya quedo solucionado, en lo que tengo problema es en la ruta, no se si habra algun codigo generico para buscar cualquier archivo en la red, pues he probado con la grabadora me macros y no me funciona, Mil Gracias :teapot:

publicado

En este caso, hace falta más información: ¿Cómo querés que el usuario indique la ruta al archivo? Las posibiliades (que se me ocurren ahora):

1- Con un diálogo tipo buscar archivo que se muestre al presionar "CommandButton1" o "Guardar" o algún otro botón

2- Automático, tomado del contenido de una celda específica en el libro Formularios.xls

3- Automático, tomado de un archivo txt externo

4- Automático, haciendo una búsqueda extensiva en busca del archivo por toda la red

Aclaro que:

- la opción 1 es la MENOS CÓMODA para el usuario!

- las opciones son las más rápidas y fáciles de reconfigurar

- la opción 4 no debería ni considerarse :witless:

publicado

Buena tarde

Gracias de nuevo

por lo que me das a entender las mejores opciones son las que estoy resaltando en amarillo

- la opción 1 es la MENOS CÓMODA para el usuario!

- las opciones son las más rápidas y fáciles de reconfigurar

- la opción 4 no debería ni considerarse

pues como tu eres el experto dejo que me indique cual es la mejor y y que se pueda adaptar, para poderla aplicar a mi proyecto y que no me vaya a generar errores, quedo atento a tus indicaciones :peach:

- - - - - Mensaje combinado - - - - -

que pena se color quedo maluco no lo revise antes de enviarlo es el de texto azul

- la opción 1 es la MENOS CÓMODA para el usuario!

- las opciones son las más rápidas y fáciles de reconfigurar

- la opción 4 no debería ni considerarse

Gracias,

publicado

Jajajaja, perdón! No quería condicionarte TAAAN evidentemente!

No importa, siempre se puede volver atrás.

Probá lo siguiente: en el procedimiento (Sub) CommandButton1_Click, reemplazá ésta línea:

Set WB = Workbooks.Open(Filename:="C:\Users\CESAR\Desktop\Datos\BaseDatos.xls")[/CODE]

por todo esto:

[CODE]Dim ubicacionArchivo As String


ubicacionArchivo = ThisWorkbook.Sheets(1).Range("A1") [COLOR=#008000]'Aquí se puede elegir la solapa y la celda[/COLOR]
[COLOR=#008000]'En la celda elegida, poner el dato (Ejemplo: A1=C:\Users\CESAR\Desktop\Datos\BaseDatos.xls[/COLOR]
[COLOR=#008000]'lo bueno es que la copia en cada pc diferente puede tener una ruta diferente![/COLOR]
Set WB = Workbooks.Open(Filename:=ubicacionArchivo)[/CODE]

Ah César, cuando lo hagas y pruebes subí de nuevo el archivo actualizado, porque yo sólo dispongo de tu archivo original.

publicado

Gracias lo voy a probar, apenas lo pueda hacer te respondo ya que en estos momento estoy en la oficina y tengo arto trabajo pero lo tratare de hacer en el menor tiempo posible

- - - - - Mensaje combinado - - - - -

Buena tarde Manfred

que pena pero no pude adamtar el codigo que me estas dando, pues me genera error a al momento de de correr la macro, adjunto los archivos para que me puedas ayudar mejor.

otra pregunta, no entendi la parte que dices: lo bueno es que la copia en cada pc diferente puede tener una ruta diferente!

, y si con este codigo se puede sin necesidad de modificarlo funciona en cualquier computador inclusive el mio ??

BaseDatos.xls

Formularios.xls

publicado

entonces que pasa, cuando los usuarios ingresan la informacion casi al mismo tiempo me genera conflicto ya que coinciden en que la informacion se esta guardando en la misma fila del Libro B, entonces lo que quiero es que el Libro B no este compartirlo y solo que deje entrar al que primero

Claro! eso pasa cuando quieres destapar una lata con un destornillador en vez de emplear un abrelatas! Access te permite la captura simultanea de varios registros al mismo tiempo y tu no te preocupas de que colisionen. Se ve que tu aplicación es muy básica tanto que quizás no valga la pena pasarlo a Access, pero si empieza a crecer en complejidad yo te recomendaria que lo migraras a Access o en su defecto utilizar DAO o ADO.

Suerte!

publicado

hola digitalboy

gracias por tu respuesta, la cuaestion en que no tengo idea de manejar Acces, DAO o ADO, ya que en este foro es solo de excel y los conosimientos mios son de excel, pero cualquier ayuda adicional bienvenida

publicado
otra pregunta, no entendi la parte que dices: lo bueno es que la copia en cada pc diferente puede tener una ruta diferente!

, y si con este codigo se puede sin necesidad de modificarlo funciona en cualquier computador inclusive el mio ??

Con ésto quiero decir que sin importar la computadora que se use, al estar en una celda específica (A1 de la "Hoja1", en el ejemplo), el usuario simplemente tipea la ruta correcta para acceder al archivo que la macro necesita.

Prestá atención al evento Guardar_Click, hice unos cambios y agregué una intercepción de error para que el usuario no tenga el cartel típico de cuando falla una macro.

Formularios - MOD 12-06-09.xls

publicado

Buena noche Manfred

ejecute el archivo que modificaste desde mi computadora hice los cambios y puse la ruta en al celda A1 de la Hoja Base de datos como lo indicas en el ejemplo, pero solo me sale el Mensaje de intercepción de error y no me deja guardar los datos a como se hacia antes de que le hicieras los cambios al archivo, que pena pero ahora si estoy mas perdido que la mama del chavo, no se si estoy cometiendo al gun error, espero que me podas explicar de nuevo,

Gracias por tu pasiencia :)

publicado

Vamos entonces con la explicación paso a paso de las líneas problemáticas:

ubicacionArchivo = ThisWorkbook.Sheets("Hoja1").Range("A1")[/CODE]

Ésta es la asignación de la variable: busca en la celda "A1" de la solapa "Hoja1" y asigna a la variable el texto contenido en esa celda (no su fórmula, sino el valor)

[CODE]On Error GoTo ErrorEnArchivo[/CODE]

Aquí avisa que: "de aquí en adelante, si surge un error, vaya a la etiqueta '[i]ErrorEnArchivo[/i]'

[CODE]Set WB = Workbooks.Open(Filename:=ubicacionArchivo)[/CODE]

Acá es justamente donde se abre el archivo. ¿Cuál archivo? Ésto viene dado por el parámetro [i]Filename[/i], que toma su valor de la variable '[i]ubicacionArchivo[/i]', a la que antes habíamos asignado el texto contenido en la celda "A1" (o sea, la ruta y nombre de archivo de [i]BaseDatos.xls[/i])

[CODE]On Error GoTo 0[/CODE]

Ésta línea suspende la intercepción de errores.

Ahora, al final del procedimiento:

[CODE]Exit Sub
ErrorEnArchivo:
Err.Clear
MsgBox "Se produjo un error al intentar acceder al archivo: " & vbCr _
& " " & ubicacionArchivo & vbCr & "El archivo no se encuentra en la ubicación especificada." _
, vbCritical
Me.Hide
Application.ScreenUpdating = True
Set WB = Nothing
End Sub[/CODE]

Éste es el código que se ejecuta en caso que surja un error.

Primero hay que anteponer el [i]EXIT SUB[/i], para que el código no se ejecute si no hay errores.

Luego, la etiqueta '[i]ErrorEnArchivo:[/i]' (se indica con los [i]:[/i] al final)

Err.Clear sirve para limpiar ("resetear") el objeto error

Luego, el aviso al usuario mediante MsgBox

Luego SE OCULTA el formulario (no se descarga de memoria, sólo deja de mostrarse)

Las últimas líneas son para darle un cierre 'prolijo' al código.

De todo esto se desprende que:

Si se muestra el mensaje de error "Se produjo un error al intentar acceder al archivo: ...", es porque el error saltó en la línea

[CODE]Set WB = Workbooks.Open(Filename:=ubicacionArchivo)[/CODE]

, la cual es la única que intercepta errores. Por consiguiente, lo que está fallando es el valor de la celda "A1".

Éste valor debe estar correctamente escrito y respetando mayúsculas y minúsculas. Creo que ahí está tu problema.

publicado

Hola Manfred

he estado algo full de trabajo y no habia podido terninar de ajustra la macro, espero apenas ya haber echo algunas prubas poder decirte de nuevo como me esta quedando,

Gracias por tu ayuda

cualquier cosa le estare comentando

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.