# Error '9' en tiempo al abrir desde el fichero guardado.



## helpdeskes (Apr 11, 2007)

Hola a todos, Necesito que alguién me pueda orientar en una macro que tengo creada tipo Auto Open, que es la siguiente:


```
Sub Auto_open()
'
'Rem No necesario porque ya lo lleva la plantilla
   ' With ActiveWorkbook
   '    .PrecisionAsDisplayed = False
   '     .SaveLinkValues = False
   ' End With
    ' ChDir "C:\Ofertas"
    Workbooks.Open Filename:="C:\Ofertas\Lista Precios.xls", ReadOnly:=True
    Windows("Generador Ofertas1").Activate
    Range("E3").Select
End Sub
```

El "problema" es que cuando guardo el documento con otro nombre y lo vuelvo abrir me da error de Visual Basic (error '9'.. subindice fuera de intervalo), entiendo que es por la parte de la macro "Windows("Generador Ofertas1).Activate, y mi pregunta es como puedo hacer en la macro, algo tipo variable para que no de el error, y se abra desde el fichero guardado, y no intente abrir "Generador Ofertas1".
Miles de gracias de antemano.


----------



## galileogali (Apr 11, 2007)

Prueba esto


```
Dim WbkOp as workbook
'// ...
set wbkOp = Workbooks.Open Filename:="C:\Ofertas\Lista Precios.xls", ReadOnly:=True 
wbkOp.Windows("Generador Ofertas1").Activate 
'//...
```

GALILEOGALI


----------



## helpdeskes (Apr 16, 2007)

Hola galileogali

Siento no haber contestado antes, pero he estado unos cuantos días "OUT".

Muchas gracias por tu respuesta. La he probado pero me da errores de compilación y entonces he visto que seguramente no me he explicado bien. 

El problema es que cuando se abre el fichero, y se abren automaticamente los otros ficheros, tengo que volver al 1º que he  abierto, del cual no se el nombre, por eso se me ocurrio guardarme el nombre del libro en una variable para luego hacer el comando 
Windows(variable)Activate.

Es decir más o menos sería 

```
Dim wbkOp as .....
wbkOp = "Me guardo el nombre del Libro de trabajo actual"
' Abro los otros que necesito
Workbooks.Open Filename:="C:\Ofertas\Lista Precios.xls", ReadOnly:=True
    Workbooks.Open Filename:="C:\Ofertas\Listado BP.xls", ReadOnly:=True
' Vuelvo al libro que me ha ejecutado la macro AutoOpen
Windows(wbkOp).Activate
```

Ms o menos es es la idea, pero no se como guardarme el nombre del libro de trabajo acutal, antes de abrir los otros. 

Saludos


----------



## helpdeskes (Apr 16, 2007)

Hola de nuevo galileogali!

Ya está solucionado!!!  

Después de enviarte la respuesta, se nos iluminó nuevamente la cabeza para nuestra suerte.. os pasamos nuestra solución  


```
Sub Auto_open()
'
' Macro Para establecer las condiciones de trabajo en el generador de Ofertas
' Macro grabada el 09/02/2007 por HelpDeskEs
'
    Dim WbkOp As String
    ' Guarda el nombre de la hoja actual con la oferta
    WbkOp = ThisWorkbook.Name
    ' Abre Archivos Vinculados
    Workbooks.Open Filename:="C:\Ofertas\Lista Precios.xls", ReadOnly:=True
    Workbooks.Open Filename:="C:\Ofertas\Listado BP.xls", ReadOnly:=True
    ' Activa la Hoja de Oferta
    Windows(WbkOp).Activate
    Range("E3").Select
End Sub
```
Esperemos que sirva y solucione problemas/dudas a otras personas en estos foros.
Muchas gracias por vuestras indicaciones y por vuestra web que siempre es de gran ayuda, para aclarar dudas/cuestiones/preguntas.
Nuevamente miles de gracias. :wink: 
Saludos,


----------



## Greg Truby (Apr 16, 2007)

No es necesario guardar el nombre en un variable.  Usted ya está en el modulo del cuaderno.  Entonces se puede usar *ME* y la colección de ventana de tal.  Aquí hay una solución más amplia.
	
	
	
	
	
	



```
Const c_strArchivoPrecios As String = "C:\Ofertas\Lista Precios.xls"
Const c_strArchivoListado As String = "C:\Ofertas\Listado BP.xls"

Private Sub Workbook_Open()
    
    If ArchivoExiste(c_strArchivoPrecios) Then
        If Not AbiertoYa(c_strArchivoPrecios) Then
            Workbooks.Open Filename:=c_strArchivoPrecios, ReadOnly:=True
        End If
    Else
        If vbNo = MsgBox("No se puede encontrar el archivo: " & vbCr & _
                         vbCr & c_strArchivoPrecios & vbCr & _
                         vbCr & "¿Desea seguir?", _
                         vbQuestion + vbYesNo + vbDefaultButton2, _
                         "Archivo Faltante") Then
            Me.Close False
            Exit Sub
        End If
    End If
    
    If ArchivoExiste(c_strArchivoListado) Then
        If Not AbiertoYa(c_strArchivoListado) Then
            Workbooks.Open Filename:=c_strArchivoListado, ReadOnly:=True
        End If
    Else
        If vbNo = MsgBox("No se puede encontrar el archivo: " & vbCr & _
                         vbCr & c_strArchivoListado & vbCr & _
                         vbCr & "¿Desea seguir?", _
                         vbQuestion + vbYesNo + vbDefaultButton2, _
                         "Archivo Faltante") Then
            Me.Close False
            Exit Sub
        End If
    End If
    
    Me.Windows(1).Activate
    Range("E3").Select
End Sub

Private Function AbiertoYa(strFileName As String) As Boolean
    Dim wb As Workbook
    
    On Error Resume Next
    Set wb = Workbooks(FileNameOnly(strFileName))
    AbiertoYa = (Err.Number = 0)
End Function

Private Function ArchivoExiste(strFileName As String) As Boolean
    ArchivoExiste = (Dir(strFileName) <> vbNullString)
End Function

Private Function FileNameOnly(strFullName As String) As String
'   Returns the filename from a path/filename string

    Dim p%
    
    p = InStr(1, strFullName, ".")
    If p = 0 Then
        '// no extension = no file name
        FileNameOnly = vbNullString
        Exit Function
    End If
    
    p = InStrRev(strFullName, Application.PathSeparator)
    FileNameOnly = Right(strFullName, Len(strFullName) - p)
End Function
```


----------

