# Macro para cambiar directorio por defecto excel



## gustavomeeuwes (Aug 13, 2010)

Hola.
Estoy descubriendo las macros y tengo una duda.
Tengo una planilla "Planilla General" con 5 hojas dentro del libro. Quiero copiar 3 de las hojas "Datos Generales", "Seguimiento", "Contactos Emergencias" en un nuevo libro y guardarlo en un directorio específico C:\C.I.S.\Fichas distinto al predeterminado de Excel C:\Mis documentos y el nombre de este nuevo libro es el valor de la celda C6 de la hoja "Datos Generales". Despues cierro este nuevo libro y ejecuto una macro "Nueva_Ficha" que me borra el contenido de las celdas para dejar "limpia" la planilla original y cargar nuevos datos.
Ví en los foros una solución como la que sigue:


```
Sheets(Array("Datos Generales", "Seguimiento", "Contactos Emergencias")).Select
Sheets(Array("Datos Generales", "Seguimiento", "Contactos Emergencias")).Copy
ChDir "C:\C.I.S\Fichas"
ActiveWorkbook.SaveAs Filename:=Range("C6").Value
ActiveWorkbook.Close
Sheets("Datos Generales").Select
Application.Run "'Planilla General.xls'!Nueva_Ficha"
```
 
El tema es que grabamos la macro realizando manualmente las operaciones que queremos que la misma realice. Manualmente al ejecutar "Guardar como", el Excel guarda la última ubicación o carpeta donde guardamos, por lo que al finalizar la grabación de la macro y ejecutarla, la misma funciona bien. Pero si cierro el excel y lo abro de nuevo, el "Guardar como" vuelve a la ubicación por defecto C:\Mis documentos y al ejecutar la macro no me respeta la instrucción 

ChDir "C:\C.I.S\Fichas"

y me guarda la planilla en la ubicación por defecto C:\Mis documentos.
¿Como puedo solucionarlo?
Perdón si mi pregunta es demasiado larga, pero quería ser bien claro. Veo en los foros que la gente pregunta de a poco con lo que se complica dar una respuesta rápida y que funcione, y que terminan seguramente desgastando a los expertos y moredarores.
Desde ya muchas gracias
NOTA: Uso Excel 2003.

Cordiales Saludos
Gustavo Meeuwes


----------



## Jaafar Tribak (Aug 14, 2010)

Hola Gustavo. Bienvenido a nuestro querido foro. 

No estoy seguro si le funcionaria lo siguiente:


```
Private Sub Workbook_Open()
    ChDir "C:\C.I.S\Fichas"
End Sub
```


----------



## Greg Truby (Aug 15, 2010)

Hola Gustavo y bienvenido a MrExcel.

Bueno, del punto de vista de programación, si uno va a ir cambiando el directorio por defecto, le toca al programador cambiarlo al valor inicial antes de salir del programa. Por lo general a usuarios no les gusta que un macro cambia la configuración de la computadora al menos que es la función en sí de tal macro.

Pero favor sepa que no es necesario. Se puede añadir el sendero al nombre y guardar el archivo así. Entonces, paso 1 será algo como:

```
'// ¿ ... other code ... ?
 
    Sheets(Array("Datos Generales", "Seguimiento", "Contactos Emergencias")).Copy
    ActiveWorkbook.SaveAs Filename:="C:\C.I.S\Fichas\" & Range("C6").Value
    ActiveWorkbook.Close
    '// ¿ ... other code ... ?
```
 
Después, a mí me gusta usar una variable para accesar objetos en vez de depender que x cuaderno sea el activo. Puede ser que en el futuro hiciera alguna modificación que cambiará el cuaderno activo, entonces yo haría algo como:

```
Dim wbNuevo As Excel.Workbook
    Sheets(Array("Datos Generales", "Seguimiento", "Contactos Emergencias")).Copy
    Set wbNuevo = ActiveWorkbook
    '// ¿ ... other code ... ?
    With wbNuevo
        .SaveAs Filename:="C:\C.I.S\Fichas\" & Range("C6").Value
        .Close
    End With
    '// ¿ ... other code ... ?
```
 
Ahora, es mal hábito tener "valores secretos" en su código. ¿Qué pasa si por a o por b decido cambiar el sendero donde va el archivo? Tendría que revisar quien sabe cuántas líneas de código para estar seguro que cambié todas las instancias (sí, "find and replace" ayuda mucho pero siempre es mala idea). Entonces defino el sendero como constante.

```
Const c_strSendero As String = "C:\C.I.S\Fichas\"
    Dim wbNuevo As Excel.Workbook
 
    '// ¿ ... other code ... ?
 
 
    Sheets(Array("Datos Generales", "Seguimiento", "Contactos Emergencias")).Copy
 
    Set wbNuevo = ActiveWorkbook
 
    With wbNuevo
        .SaveAs Filename:=c_strSendero & Range("C6").Value
        .Close
    End With
    '// ¿ ... other code ... ?
```
 
Ahora me pregunto «¿Y qué va a pasar si decido insertar o suprimir una fila o columna encima de o a la izquierda de celda C6 o si deseo copiar otra hoja que está antes de la hoja _datos generales_?» Va a usar un nombre erróneo y/o levantar un error. Mejor dar un nombre como «NombreNuevo» a celda C6 y usar el nombre. Asi evito problemas. 
	
	
	
	
	
	



```
Const c_strSendero As String = "C:\C.I.S\Fichas\"
    Const c_strRngFileName As String = "NombreNuevo"
    Dim wbNuevo As Excel.Workbook
 
    '// ¿ ... other code ... ?
    Sheets(Array("Datos Generales", "Seguimiento", "Contactos Emergencias")).Copy
 
    Set wbNuevo = ActiveWorkbook
 
    With wbNuevo
        .SaveAs Filename:=c_strSendero & Range("NombreNuevo").Value
        .Close
    End With
    '// ¿ ... other code ... ?
```
 
¡HOLA, Jaafar! Me alegra verlo aquí. 

Atentamente,


----------



## gustavomeeuwes (Aug 15, 2010)

Hola Jaafar:
Muchas Gracias por tu respuesta.
Pude solucionar mi problema.
Unn saluod.
Gustavo.


----------



## gustavomeeuwes (Aug 15, 2010)

Hola Greg!
Muchas gracias por la respuesta. La primera opción creo que es la mejor para mis necesidades.
La planilla es para hacer fichas con datos personales y un seguimiento de atenciones Psicológicas de estas personas. Mi Señora estudia Psicología y les quiero ayudar, ya que actualmente tienen todas estas fichas hechas a mano. Y las quiero guardar en un directorio en particular ya que los datos los van a cargar en una computadora de la universidad a la que tienen acceso muchas personas.
Aprovecho y te hago otra consulta.

Como le agrego una instruccion para que no se puedan borrar estos archivos creados, Si abrir y modificar y volver a guardar. Agregándole una contraseña o en modo solo lectura? hay un método mejor?
Cual sería la línea de comandos a agregar?

Gracias y Saludos
Gustavo


----------



## Greg Truby (Aug 15, 2010)

De lo que me doy cuenta no hay manera de prevenir que alguien se los borre en el sentido de dentro de Excel.  Eso de poder borrar o no es cuestion de derechos del usuario en el sistema operativo.  Alguien con derechos de administrador tendría que ajustar los derechos de los usuarios para que solamente puede leer archivos y no suprimirlos en tal y tal carpeta.


----------



## gustavomeeuwes (Aug 15, 2010)

Hola Greg: En su contestación anterior, en la ultima opción, 

"Ahora me pregunto «¿Y qué va a pasar si decido insertar o suprimir una "fila o columna encima de o a la izquierda de celda C6 o si deseo copiar "otra hoja que está antes de la hoja _datos generales_?» Va a usar un "nombre erróneo y/o levantar un error. Mejor dar un nombre como "«NombreNuevo» a celda C6 y usar el nombre. Asi evito problemas. 

No veo que se le asigne el "NombreNuevo" a la celda C6.

Esta opción como bien Ud dice es la mas "segura" y voy a probarla.
Gracias.
Gustavo


----------



## Greg Truby (Aug 15, 2010)

gustavomeeuwes said:


> ...No veo que se le asigne el "NombreNuevo" a la celda C6....


 
Esto se hace manualmente.  Por medio del menú, (en inglés) es *Insert | Name | Define...* o se puede presionar *Ctrl+F3* o se puede seleccionar C6 y teclar el nombre en la "cajita de nombre" que está ubicado al lado izquierdo de la barra de fórmulas.


----------



## gustavomeeuwes (Aug 15, 2010)

Hola Greg:
Muchas gracias y perdón por mi ignorancia.
Cordiales Saludos
Gustavo Meeuwes


----------



## Greg Truby (Aug 16, 2010)

gustavomeeuwes said:


> Hola Greg:
> Muchas gracias y perdón por mi ignorancia.
> Cordiales Saludos
> Gustavo Meeuwes


 
Con mucho gusto y no hay por qué pedir perdón.  ¿Cómo es el dicho?  «Nadie nace aprendido.»


----------

