Quitar y poner "Solo Lectura" para guardar un archivo.

09/09/2009 - 16:04 por JC | Informe spam
Hola a Tod@s:

Agradecería infinito a quien me pudiera detallar los comandos en VBA
necesarios para:
1.- Poder quitar el "Solo Lectura" de un archivo .xls
Después pasaría a guardar ese archivo, tras unas modificaciones
2.- Y posteriormente necesitaría volver a poner de nuevo con comandos el
"Solo Lectura" al mismo archivo.

Mil gracias (como siempre) por vuestra amabilidad y gentileza.

Un abrazo

Juan Carlos

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
09/09/2009 - 21:13 | Informe spam
hola, Juan Carlos !

... los comandos en VBA necesarios para:
1.- Poder quitar el "Solo Lectura" de un archivo .xls
Despues pasarua a guardar ese archivo, tras unas modificaciones
2.- Y posteriormente necesitaria volver a poner de nuevo con comandos el "Solo Lectura" al mismo archivo...



1) existen (al menos) dos formas de solo lectura para los archivos de excel...
a) al momento de guardarlos (archivo / guardar como... / buscar en las opciones) y marcar la opcion de:
recomedar que se abra como de solo lectura (a la vez que) puedes asignarle una clave contra-escritura al abrirse
y/o cuando se abre y NO se provee la clave que tenga contra la apertura del archivo
b) modificando las propiedades del archivo desde el sistema operativo (NO es exclusivo de excel, sino de windows)

2) si te refieres a cambiar el modo de acceso (exclusivo o no) al archivo EN/durante la sesion de excel...
a) consulta en la ayuda de vba-excel por el metodo .ChangeFileAccess y la propiedad .ReadOnly
b) si estableces (en la sesion) un modo de acceso de solo lectura... -> ActiveWorkbook.ChangeFileAccess xlReadOnly
- NO es posible que el usuario le guarde cambios (seria necesario usar un guardar como... y darle OTRO nombre)
- si suponemos que esta guardado con el metodo anterior... la siguiente vez que se abra... regresa al modo xlReadWrite

3) en via de mientras, una (posible) alternativa es una macro (despues de las modificaciones) para
- quitar el modo de solo lectura
- guardar los cambios
- reponer el modo de solo lectura

Application.DisplayAlerts = False
ThisWorkbook.ChangeFileAccess xlReadWrite
ThisWorkbook.Save
ThisWorkbook.ChangeFileAccess xlReadOnly
Application.DisplayAlerts = True

comentas por donde van los tiros ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 JC
10/09/2009 - 10:38 | Informe spam
...
Application.DisplayAlerts = False
ThisWorkbook.ChangeFileAccess xlReadWrite
ThisWorkbook.Save
ThisWorkbook.ChangeFileAccess xlReadOnly
Application.DisplayAlerts = True

comentas por donde van los tiros ?
saludos,
hector.



Hola Héctor:

Un placer poderte saludar.
De nuevo sacandome las "castañas" del fuego...
Lo más resumido posible:
Tengo un archivo de consulta en una unidad de red, que actualizo todos los
días.
Debe de mantenerse como de "Solo Lectura", ya que así evitamos posibles
modificaciones del archivo original y de paso se evita que si algún usuario,
tuviera abierto el libro en el momento de la actualización del archivo, si
estuviera en modo"LecturaEscritura" no se podrían guardar los cambios de la
actualización.

Tengo un libro de macros personal, desde donde ejecuto las diferentes macros
y tendría que "antes" de abrir el libro, cambiarle la propiedad de "ReadOnly"
a "ReadWrite", pero no sé la grámatica y me da error.
Intento hacer algo así como:
Sub Actualización()
Workbooks.ChangeFileAccess xlReadWrite:= True Filename_
"M:\BASE DATOS\DIARIO.xls"
*Que me da error de compilación: Se esperaba: número de línea o etiqueta o
*declaración o fín de la instrucción... Y así tras de haberlo intentado de
varias *formas, para después abrir el libro en si y ejecutar las macros de
actualización:
Workbooks.Open Filename:= _
"M:\BASE DATOS\DIARIO.xls"

Si necesitas algún detalle más no dejes, por favor, de comentarmelo...
Espero haberme expresado con suficiente claridad.

Un abrazo

Juan Carlos
Respuesta Responder a este mensaje
#3 Héctor Miguel
11/09/2009 - 01:25 | Informe spam
hola, Juan Carlos !

(segun parece...) lo que necesitas es modificar a los archivo el atributo de "solo lectura" (DEL SISTEMA OPERATIVO)
(es decir...) ANTES de abrir un archivo de excel... NO es un libro "de excel" (solo es un monton de bytes almacenados en el DD)
por lo tanto, las propiedades como <workbook>.ChangeFileAccess = (...) solo son aplicables a libros ABIERTOS (en excel)

op1: revisa (y adapta) ejemplos de Randy Birch para administrar propiedades (del sistema operativo) a los archivos
Visual Basic File API Routines
FindFirstFile: Changing File and/or Folder Attributes Recursively
http://vbnet.mvps.org/code/fileapi/...veattr.htm

op2: otra alternativa es modificar sus propiedades (del sistema opeativo) estando CERRADO/S el(los) archivo/s en cuestion (p.e.)

With CreateObject("scripting.filesystemobject")
With .GetFile("m:\base datos\diario.xls")
.Attributes = 1
End With
End With

el numero 1 (uno) en los atributos es el "bit" de "solo lectura"
para establecerlo en "lectura-escritura" se lo restas (o sea..)

.Attributes = -1

o si el archivo tuviera mas (otro dipo de) atributos y debes conservarlos, para dejarlo como "lectura-escritura" utiliza algo +/- como...

With CreateObject("scripting.filesystemobject")
With .GetFile("m:\base datos\diario.xls")
If .Attributes And 1 Then .Attributes = .Attributes - 1
End With
End With

las constantes para los atributos de archivos/carpetas son:

0: normal (no se establece ningun atributo)
1: solo lectura
2: oculto
4: sistema (lectura-escritura)
8: etiqueta de volumen de unidad (solo lectura)
16: carpeta o directorio (solo lectura)
32: archivo (lectura-escritura)
64: alias (atajo) (solo lectura)
128: (comprimido)

saludos,
hector.

__ OP __
Tengo un archivo de consulta en una unidad de red, que actualizo todos los dias.
Debe de mantenerse como de "Solo Lectura", ya que asi evitamos posibles modificaciones del archivo original
y de paso se evita que si algun usuario, tuviera abierto el libro en el momento de la actualizacion del archivo
si estuviera en modo"LecturaEscritura" no se podrian guardar los cambios de la actualizacion.

Tengo un libro de macros personal, desde donde ejecuto las diferentes macros y tendria que "antes" de abrir el libro
cambiarle la propiedad de "ReadOnly" a "ReadWrite", pero no se la gramatica y me da error. Intento hacer algo asi como:
Sub Actualizacion()
Workbooks.ChangeFileAccess xlReadWrite:= True Filename_
"M:\BASE DATOS\DIARIO.xls"
*Que me da error de compilacion: Se esperaba: numero de linea o etiqueta o declaracion o fin de la instruccion...
Y asi tras de haberlo intentado de varias *formas, para despues abrir el libro en si y ejecutar las macros de actualizacion:
Workbooks.Open Filename:= _
"M:\BASE DATOS\DIARIO.xls"
...
Respuesta Responder a este mensaje
#4 JC
11/09/2009 - 09:01 | Informe spam
Chapeau !!!

Eres un Máquina Héctor...
Mil gracias otra vez de nuevo Maestro !!!

Tu razonamiento me ha quedado absolutamente claro y tu solución, ambas las
dos propuestas, funcionan a las mil maravillas.

Las personas como Tú, no tenían que morirse nunca.

Gracias de nuevo y un fuerte abrazo Héctor.

Juan Carlos.

"Héctor Miguel" escribió:

hola, Juan Carlos !

(segun parece...) lo que necesitas es modificar a los archivo el atributo de "solo lectura" (DEL SISTEMA OPERATIVO)
(es decir...) ANTES de abrir un archivo de excel... NO es un libro "de excel" (solo es un monton de bytes almacenados en el DD)
por lo tanto, las propiedades como <workbook>.ChangeFileAccess = (...) solo son aplicables a libros ABIERTOS (en excel)

op1: revisa (y adapta) ejemplos de Randy Birch para administrar propiedades (del sistema operativo) a los archivos
Visual Basic File API Routines
FindFirstFile: Changing File and/or Folder Attributes Recursively
http://vbnet.mvps.org/code/fileapi/...veattr.htm

op2: otra alternativa es modificar sus propiedades (del sistema opeativo) estando CERRADO/S el(los) archivo/s en cuestion (p.e.)

With CreateObject("scripting.filesystemobject")
With .GetFile("m:\base datos\diario.xls")
.Attributes = 1
End With
End With

el numero 1 (uno) en los atributos es el "bit" de "solo lectura"
para establecerlo en "lectura-escritura" se lo restas (o sea..)

.Attributes = -1

o si el archivo tuviera mas (otro dipo de) atributos y debes conservarlos, para dejarlo como "lectura-escritura" utiliza algo +/- como...

With CreateObject("scripting.filesystemobject")
With .GetFile("m:\base datos\diario.xls")
If .Attributes And 1 Then .Attributes = .Attributes - 1
End With
End With

las constantes para los atributos de archivos/carpetas son:

0: normal (no se establece ningun atributo)
1: solo lectura
2: oculto
4: sistema (lectura-escritura)
8: etiqueta de volumen de unidad (solo lectura)
16: carpeta o directorio (solo lectura)
32: archivo (lectura-escritura)
64: alias (atajo) (solo lectura)
128: (comprimido)

saludos,
hector.

__ OP __
> Tengo un archivo de consulta en una unidad de red, que actualizo todos los dias.
> Debe de mantenerse como de "Solo Lectura", ya que asi evitamos posibles modificaciones del archivo original
> y de paso se evita que si algun usuario, tuviera abierto el libro en el momento de la actualizacion del archivo
> si estuviera en modo"LecturaEscritura" no se podrian guardar los cambios de la actualizacion.
>
> Tengo un libro de macros personal, desde donde ejecuto las diferentes macros y tendria que "antes" de abrir el libro
> cambiarle la propiedad de "ReadOnly" a "ReadWrite", pero no se la gramatica y me da error. Intento hacer algo asi como:
> Sub Actualizacion()
> Workbooks.ChangeFileAccess xlReadWrite:= True Filename_
> "M:\BASE DATOS\DIARIO.xls"
> *Que me da error de compilacion: Se esperaba: numero de linea o etiqueta o declaracion o fin de la instruccion...
> Y asi tras de haberlo intentado de varias *formas, para despues abrir el libro en si y ejecutar las macros de actualizacion:
> Workbooks.Open Filename:= _
> "M:\BASE DATOS\DIARIO.xls"
> ...



Respuesta Responder a este mensaje
#5 Héctor Miguel
11/09/2009 - 09:19 | Informe spam
hola, Juan Carlos !

si fuera "una maquina"... no "sentiria" (?)
y en verdad te agradezco el "feed-back" (y los comentarios) ;)

saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida