*Error '91'en tiempo de ejecución: Variable de tipo Object o variable de bloque With no está estab.*

Estoy realizando una aplicación en VB6 que recoge datos de un autómata y los pasa a un excel 2002. La aplicación va a estar en un ordenador todo el día encendido, ejecutándose 3 veces al día, con un timer. Cualquiera tiene acceso al excel y ese es mi problema, ya que si el excel está abierto cuando se ejecuta, da errores por todos lados.

El problema viene al sobreescribir el Excel que está abierto y he intentado guardarlo en un directorio secundario, cerrarlo y copiarlo al directorio original (más o menos).

Mi código lo que hace es, si encuentra un Excel abierto, escribe los datos en otro nuevo, ese lo guarda y cierra sin problemas pero lo malo viene al intentar cerrar el que estaba abierto:

oExcel.Aplication.DisplayAlerts = False 'Que no pregunte si guardar

'Guardar cambios en el fichero Excel (borrando y copiando) un un directorio intermedio

OExcel. ActiveWorkbook. SaveAs (strRutaExcel2)

OExcel. Quit

Set oHoja = Nothing

Set oLibro = Nothing

Set oExcel = Nothing

If isfileopen (strRutaExcel) Then 'Si encuentra el Excel original abierto

oExcel.ActiveWorkbook.SaveAs (strRutaExcel2) *Error*
oExcel.Quit
Set oHoja = Nothing
Set oLibro = Nothing
Set oExcel = Nothing

End If

Kill (strRutaExcel)

FileCopy "c:\2\" & "excel.xls", strRutaExcel

1 respuesta

Respuesta
1

Vigila, porque estás destruyendo la referencia de oExcel en "Set oExcel = Nothing" y después tratas de usarla en "oExcel.ActiveWorkbook.SaveAs (strRutaExcel2)".

El error que te da es normal.

O bien eliminas la línea del Nothing o vuelves a crear una nueva referencia con "Set oExcel = New..."

Ya me di cuenta que ahí algo iba mal y antes del "If isfileopen " puse el set oExcel=new Excel.Application...

Ahora me entra bien al if, pero no me hace el oExcel.Quit ni nada, osea que no me cierra el Excel que está abierto así que en la línea:

"Kill (strRutaExcel)"

me salta: "Error '91' en tiempo de ejecución: permiso denegado"

¿Por qué no me cierra el Excel?

Muchas gracias! ;)

La verdad es que me pierdo un poco, tanto con la explicación como con el código.

Antes de mirar con detalle lo que haces en el código, me gustaría entender el problema.

Dices que tienes un problema porque tu proceso abre un archivo de Excel que puede estar abierto por el usuario que está trabajando en el ordenador. Para resolver ese problema, empiezas a copiar el archivo de un lugar a otro, etc.

¿Es así? No me acaba de cuadrar...

El archivo que generas, ¿tienes qué crearlo de cero cada vez que se ejecuta tu proceso? ¿El usuario puede modificarlo? ¿Los posibles cambios hechos por el usuario (o por tu proceso en una ejecución anterior) se pueden descartar? ¿Podrías crear un archivo diferente en cada ejecución? ¿Podrías tratar de detectar si está abierto antes de crear un nuevo archivo y, en caso afirmativo, trabajar sobre un segundo archivo y dar un aviso al usuario? (Si el usuario lo tiene abierto, yo no trataría de cerrárselo y borrarlo, sin avisar)

uff qué de preguntas!! ;) vale me intento explicar mejor:

Mi programa lee datos de un autómata y los guarda en un Excel. En un ordenador, que va estar siempre encendido (así que a ciertas horas no va a haber nadie por si pregunta "desea guardar los cambios"), va a estar mi programa y tres veces al día (una por turno de la empresa) va a realizar una recogida de datos.

La persona que necesite esos datos abre el Excel. Haga o no modificaciones, eso me da igual, si no cierra el excel, al llegar la hora de recoger los datos y sobreescribir el archivo es cuando hay un problema, ya que si está abierto no puedo sobrescribirlo.

Lo que mi programa hace es:

-Llegan las 14.00, si no encuentra un excel lo crea desde cero y hace la recogida de datos. Si encuentra el excel va al día correspondiente y mete ahi los datos en el turno que sea.

-Si el excel ya estaba creado y cerrado lo hace muy bien

-Si el excel estaba creado pero abierto, lo que hace es crear un segundo excel, excel2 y escribir ahí los datos. ese excel2. al estar abierto el primero (el que se han dejado abierto), no puedo guardarlo sobrescribiendo el primero, entonces pensé:

Lo guardo en una ruta2 y lo cierro.

oExcel.ActiveWorkbook.SaveAs (strRutaExcel2)
oExcel.Quit
Set oHoja = Nothing
Set oLibro = Nothing
Set oExcel = Nothing

Sigo con el primero abierto así que lo guardo, con otro nombre, en la ruta2 y lo cierro:

If isfileopen (strRutaExcel) Then 'Si encuentra el Excel original abierto
oExcel.ActiveWorkbook.SaveAs (strRutaExcel2) *Error*
oExcel.Quit *
Set oHoja = Nothing *
Set oLibro = Nothing *
Set oExcel = Nothing *
End If

Elimino el excel guardado en la ruta1:

Kill (strRutaExcel)

Y copio lo de la ruta2 a la ruta1:

FileCopy "c:\2\" & "excel.xls", strRutaExcel

Ahora bien, las líneas con asterísco * no las hace, con lo cual no cierra el excel uno así que me casa en la siguiente línea: Kill (strRutaExcel) Me pone acceso denegado, evidente porque tengo el excel abierto...

Se que es un lío y no se explicarme del todo bien, lo siento. Si ahora no me entiendes tranqui que ya me las arreglaré ;) no quiero molestarte más... ;)

Un saludo!

Te escribo un poco "de memoria", pero viendo tu respuesta, pienso que puedes tratar de enfocarlo de forma diferente.

Trata de abrir el archivo. Si no te da error, todo OK. Si te da error porque no existe, lo creas. Si te da error porque está abierto, trabajas con ese archivo abierto. ¿Te vale?

Sería algo parecido a (ojo, que no he podido probar):

Dim oExcel As Excel.Application
Dim oArchivo As Excel.Workbook

Private Function AbrirExcel() As Boolean
On Error Resume Next
Set oExcel = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Err.Clear
On Error GoTo 0
Set oExcel = CreateObject("Excel.Application")
End If
oExcel.DisplayAlerts = False
AbrirExcel = Err.Number = 0
End Function

Private Function AbrirArchivo() As Boolean
On Error Resume Next
'Tratar de "capturar" el archivo si ya está abierto
Set oArchivo = oExcel.Workbooks("kk.xls")
If oArchivo Is Nothing Then 'No estaba abierto
Err.Clear
Set oArchivo = oExcel.Workbooks.Open("c:\kk.xls")
Select Case Err.Number
Case 0 'todo bien
Case 1004 'el archivo no existe, por lo que hay que crearlo
oExcel.Workbooks.Add
oExcel.ActiveWorkbook.SaveAs "c:\kk.xls"
End Select
Set oArchivo = oExcel.Workbooks("kk.xls")
End If
AbrirArchivo = Not oArchivo Is Nothing
End Function
Private Sub Procesar()
If AbrirExcel Then
If AbrirArchivo Then

'Aquí haces lo que quieras con el archivo
End If
End If
End Sub

¿Lograste resolverlo?

Si! Muchas gracias por todo!

Ah, estupendo. Me alegro.

Entonces, si te parece bien, ¿podrías cerrar la pregunta? Así desaparecerá de mi carpeta de preguntas abiertas y me resultará más fácil gestionar las que aún están abiertas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas