Archivar documentos word en carpetas desde excel

13/02/2008 - 22:38 por Jose | Informe spam
Hola foro:
Esta exposición la he hecho en el grupo de Word pero quisiera saber si es
posible hacerlo con un procedimiento VBA.
Necesito que alguien me ayude con lo siguiente:
En una carpeta que se llama "Archivo general de clientes", tengo 365
documentos de word que necesito guardar en las subcarpetas de cada uno de
los clientes que tambien se encuentran en esta carpeta general. Los
documentos y las carpetas tienen un nombre mas largo pero el principio de
unos y otras es la referencia única de cada cliente. Es un número de 8
dígitos seguido de un "-" y luego nombre, población, etc... creo que lo
importante son esos 8 dígitos primeros.
Hice algo parecido con fichas de clientes en excel y pude conseguir archivar
las fichas en las subcarpetas aunque la diferencia con lo que necesito ahora
es que al mismo tiempo abría la carpeta y archivaba la ficha. Ahora es
diferente porque las carpetas ya están creadas...
Estoy pensando en un procedimiento que "metiera/archivara" en cada
subcarpeta cuyo nombre empieza por un número de 8 digitos, p.e. "71000123"
el correspondiente documento de word (formato RTF) cuyo nombre empieza con
ese mismo número, es decir: "71000123-patatinpatatan.rtf" y así
sucesivamente.
Si es posible, cuando la subcarpeta no exitiera la creara con el mismo
nombre del documento word y archivara ese documento dentro tambien. (¿con
tratamiento de errores? ... eso sería ya lo máximo).
Gracias por la ayuda.
José Rafael

Preguntas similare

Leer las respuestas

#16 Héctor Miguel
16/02/2008 - 04:54 | Informe spam
hola, Monica !

Ahora que tengo un ratito libre estoy probando el codigo pero me da error 13 de no concidir tipos »
Cliente = Evaluate("index(documentos," & n & ")")
Codigo = Evaluate("left(index(documentos," & n & "),8)")
si la ejecutas una vez da error en la linea Cliente = evaluate etc..
Si restableces el error y la vuelves a ejecutar »
funciona :-) perfectamente



prueba poniendo una marca de comentario a la linea final del codigo (donde se borran los nombres)
de: Names("subcarpetas").Delete: Names("documentos").Delete
a: ' Names("subcarpetas").Delete: Names("documentos").Delete
y revisa en el libro de prueba si puedes usar en dos celdas una llamada a los nombres:
=subcarpetas
=documentos
y compruebas si los nombres quedaron con los elementos encontrados: {F2}+{F9} (luego de revisar pulsas {esc})

lo he probado con rutas como nos explicaba Jose »
carpetas » [ ocho digitos-nombre completo direccion codigo y sin acentos :-P ]
y los archivos » [ mismos ocho digitos-nombre completo ]
Pero esto estoy mirando a ver si puedo modificarla :-) !!
[ y no sabia yo que se podia interactuar asi con los nombres definidos :-)



creo que es mas rapido usar funciones de hoja de calculo como indice(... y coincidir(... sobre matrices/nombres en excel
que hacer bucles repetitivos para encontrar (si existe) la posicion de algun elemento buscado sobre matrices de vba :D

saludos,
hector.
Respuesta Responder a este mensaje
#17 Monica May
17/02/2008 - 19:46 | Informe spam
Hola Hector :-)


prueba poniendo una marca de comentario a la linea final del codigo (donde se borran los nombres)
de: Names("subcarpetas").Delete: Names("documentos").Delete
a: ' Names("subcarpetas").Delete: Names("documentos").Delete
y revisa en el libro de prueba si puedes usar en dos celdas una llamada a los nombres:
=subcarpetas
=documentos
y compruebas si los nombres quedaron con los elementos encontrados: {F2}+{F9} (luego de revisar pulsas {esc})



Okeis comprobado :-P !!

ayer no me cogia bien los digitos de las carpetas osea que me lo daba
concatenado perooo ahora que he vuelto a probar me lo ha dado correcto
:-? y se ve que de tantas pruebas que debi hacer ayer pues se volvio
loco el codigo al hacer la division de caracteres de las carpetas :-P !!


creo que es mas rapido usar funciones de hoja de calculo como indice(... y coincidir(... sobre matrices/nombres en excel
que hacer bucles repetitivos para encontrar (si existe) la posicion de algun elemento buscado sobre matrices de vba :D



pues otra cosa que aprendo ;-) !!

Saludos
Monica

PD: Me guardo el codigo en mi base de datos ;-) !!!
Respuesta Responder a este mensaje
#18 Jose
17/02/2008 - 20:12 | Informe spam
Hola, buenas tardes:
Lo siento Héctor, no me funciona el código y no he podido averiguar porqué.
Se detiene en la linea:
Names.add "Subcarpetas", Join(sfolders,",")
el error es:
Se ha producido el error 1004 en tiempo de ejecución:
Error definido por la aplicación o el objeto
Lo que he hecho es en un modulo normal del libro pegar tu código
rectificando la palabra ciente por cliente como me advertiste.
¿que debo hacer ahora?
saludos y gracias
José Rafael



"Héctor Miguel" escribió en el mensaje
news:
hola, Jose !

1) El motivo de el nombre largo de las carpetas es poque necesito que
figuren:
el codigo: 71012123
el nombre: Adrian Pérez Rubio
la población: 46520 Canals (Valencia)
Agente : E42
Son "necesidades" de datos para el trabajo de muchas personas.



con estos "requerimientos" para el nombre de la carpeta... veo
(medio)dificil "cumplirte" con esta parte de tu solicitud inicial:
"... cuando la subcarpeta no exitiera la creara con el mismo nombre del
documento word y archivara ese documento dentro tambien."
"... con tratamiento de errores? ... eso seria ya lo maximo)"

2) Los codigos de clientes son siempre UNICOS no se pueden repetir...
3) ... las carpetas ya existen... se trata de archivar dentro de ellas el
documento word (por cierto son 325 documentos no 825 ni 865)



la siguiente macro (obviamente) no esta probada bajo las condiciones
"reales" de tu situacion tan especial :))
es para trabajarse desde excel (version MINIMA: 2000) te sugiero hacer
prueba/s sobre datos COPIA (solo por si las dudas) y...
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

Option Base 1
Sub Mover_RTF()
Dim Base As String, sFolder As Object, sFolders(), n As Integer, x As
Integer, _
Cliente As String, Codigo As String, Cambio As String, Nueva As
String
Base = "c:\documents and settings\josé rafael\mis documentos\archivo
general de clientes\"
With CreateObject("scripting.filesystemobject").GetFolder(Base)
ReDim sFolders(.SubFolders.Count)
For Each sFolder In .SubFolders
n = n + 1: sFolders(n) = sFolder.Name: Next: End With
Names.Add "SubCarpetas", Join(sFolders, ",")
Names.Add "SubCarpetas", Split(Evaluate(Names("subcarpetas").RefersTo),
",")
Names.Add "Documentos", "=files(""" & Base & "*.rtf"")": Erase sFolders
For n = 1 To Evaluate("counta(documentos)")
Cliente = Evaluate("index(documentos," & n & ")")
Codigo = Evaluate("left(index(documentos," & n & "),8)")
On Error Resume Next
x = Evaluate("match(""" & Codigo & """,left(subcarpetas,8),0)")
On Error GoTo 0
If x Then
Cambio = Base & Evaluate("index(subcarpetas," & x & ")") & "\"
Else
Nueva = Base & Left(Cliente, Len(Cliente) - 4)
MkDir Base & Nueva
Cambio = Base & Nueva & "\"
End If
Name Base & Ciente As Cambio & Cliente
Next
Names("subcarpetas").Delete: Names("documentos").Delete
End Sub

Respuesta Responder a este mensaje
#19 Monica May
17/02/2008 - 21:07 | Informe spam
hola Jose,

Hola, buenas tardes:
Lo siento Héctor, no me funciona el código y no he podido averiguar porqué.
Se detiene en la linea:
Names.add "Subcarpetas", Join(sfolders,",")
el error es:
Se ha producido el error 1004 en tiempo de ejecución:
Error definido por la aplicación o el objeto
Lo que he hecho es en un modulo normal del libro pegar tu código
rectificando la palabra ciente por cliente como me advertiste.
¿que debo hacer ahora?
saludos y gracias
José Rafael






ese error a mi no me lo ha dado en ningun momento ? pero haz una cosa
mira de tener solo sub-carpetas y archivos en formato [.rtf ]dentro de
la principal carpeta..

Comentanos...!!

Saludos
Monica
Respuesta Responder a este mensaje
#20 Héctor Miguel
18/02/2008 - 00:54 | Informe spam
hola, Jose !

... no me funciona el codigo y no he podido averiguar porque. Se detiene en la linea:
Names.add "Subcarpetas", Join(sfolders,",")
el error es: Se ha producido el error 1004 en tiempo de ejecucion: Error definido por la aplicacion o el objeto
Lo que he hecho es en un modulo normal del libro pegar tu codigo rectificando la palabra ciente por cliente como me advertiste.
que debo hacer ahora?



1) comprobar que estas usando excel version 2000 en adelante
(por las funciones vba Join(...) y Split(...) que no tienen soporte en versiones anteriores)
2) comprobar que no existen referencias "rotas" a librerias "perdidas" en el proyecto de macros
desde el editor de vba, menu: herramientas / referencias (busca por alguna que diga FALTA:xxx o MISSING:xxx)

saludos,
hector.

1) El motivo de el nombre largo de las carpetas es poque necesito que figuren:
el codigo: 71012123
el nombre: Adrian Pérez Rubio
la población: 46520 Canals (Valencia)
Agente : E42
Son "necesidades" de datos para el trabajo de muchas personas.



con estos "requerimientos" para el nombre de la carpeta... veo (medio)dificil "cumplirte" con esta parte de tu solicitud inicial:
"... cuando la subcarpeta no exitiera la creara con el mismo nombre del documento word y archivara ese documento dentro tambien."
"... con tratamiento de errores? ... eso seria ya lo maximo)"

2) Los codigos de clientes son siempre UNICOS no se pueden repetir...
3) ... las carpetas ya existen... se trata de archivar dentro de ellas el documento word (por cierto son 325 documentos no 825 ni 865)



la siguiente macro (obviamente) no esta probada bajo las condiciones "reales" de tu situacion tan especial :))
es para trabajarse desde excel (version MINIMA: 2000) te sugiero hacer prueba/s sobre datos COPIA (solo por si las dudas) y...
si cualquier duda (o informacion adicional)... comentas ?

Option Base 1
Sub Mover_RTF()
Dim Base As String, sFolder As Object, sFolders(), n As Integer, x As Integer, _
Cliente As String, Codigo As String, Cambio As String, Nueva As String
Base = "c:\documents and settings\josé rafael\mis documentos\archivo general de clientes\"
With CreateObject("scripting.filesystemobject").GetFolder(Base)
ReDim sFolders(.SubFolders.Count)
For Each sFolder In .SubFolders
n = n + 1: sFolders(n) = sFolder.Name: Next: End With
Names.Add "SubCarpetas", Join(sFolders, ",")
Names.Add "SubCarpetas", Split(Evaluate(Names("subcarpetas").RefersTo), ",")
Names.Add "Documentos", "=files(""" & Base & "*.rtf"")": Erase sFolders
For n = 1 To Evaluate("counta(documentos)")
Cliente = Evaluate("index(documentos," & n & ")")
Codigo = Evaluate("left(index(documentos," & n & "),8)")
On Error Resume Next
x = Evaluate("match(""" & Codigo & """,left(subcarpetas,8),0)")
On Error GoTo 0
If x Then
Cambio = Base & Evaluate("index(subcarpetas," & x & ")") & "\"
Else
Nueva = Base & Left(Cliente, Len(Cliente) - 4)
MkDir Base & Nueva
Cambio = Base & Nueva & "\"
End If
Name Base & Cliente As Cambio & Cliente
Next
Names("subcarpetas").Delete: Names("documentos").Delete
End Sub
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida