Renombrar ficheros ,tiff mediante código

07/03/2009 - 01:35 por javier.ranchal | Informe spam
Hola a todos:

En mi empresa nos ha surgido la necesidad de renombrar muchos
ficheros .tif, sustituyendo el nombre genérico que aparece por el
valor de las celdas de la primera columna de un fichero de Excel, por
lo que me creé una macro en VBA que resolviera la papeleta

En un principio todo parecía correcto, pero cuando probamos en detalle
con los usuarios, me he encontrado que sólo renombra correctamente los
ficheros cuyo nombre original es texto, mientras que si el nombre
original es un número, el programa entra una vez más en el bucle.

Estoy desesperado, no entiendo por qué actúa así, por lo que os
adjunto el código para ver si alguien pudiera echarme una mano.



Sub prueba4() ' Modificación del nombre de un fichero en una carpeta
Dim miruta As String
Dim minombre As String
Dim contador As Integer

miruta = "c:\prueba\*.tif" ' Carpeta donde estan
almacenados los ficheros .tif
minombre = Dir(miruta, vbArchive) ' capturo el primer archivo .tif
contador = 0

Do While minombre <> ""
Name "c:\prueba\" & minombre As "c:\prueba\" & ActiveCell.Value &
".tif" ' renombro el fichero al valor de la celda activa
contador = contador + 1
ActiveCell.Offset(1, 0).Select ' Me desplazo a la celda de
abajo
minombre = Dir ' Capturo el siguiente
fichero .tif
Loop

MsgBox contador ' Cuando ya no hay más
ficheros, miro cuantos se han renombrado.

End Sub



El código lo tengo insertado en un fichero cuya primera columna
contendría los valores que sería el nuevo nombre del fichero (ese
nombre es lo de menos, por ejemplo podrían ser las letras del
abecedario).

Si observáis, el código recoge el nombre del primer fichero contenido
en la carpeta prueba que tiene extensión .tif, y al entrar en el
bucle, sustituye el nombre original del fichero por el valor de la
celda activa, seguidamente se desplaza una celda abajo y pasa a
renombrar el segundo fichero .tif de la carpeta, y así sucesivamente.

Pues bién, si os creáis un pequeño fichero y probáis el código con
tres o cuatro imágenes .tif, observaréis que, si el nombre original de
esos ficheros .tif es texto, las veces que el programa entra en el
bucle son correctas, mientras que si el nombre original de los
ficheros es númerico (como ocurre en mi empresa), el programa entrará
una vez más de las necesarias en el bucle y, en consecuencia lo
renombrará mal.

Y por más que lo miro, reviso, pruebo, no entiendo por qué c... se
comporta así.

Por favor, si alguien pudiera ayudarme le estaría muy agradecido..

Un saludo y muchas gracias por anticipado.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
07/03/2009 - 05:13 | Informe spam
hola, javier !

En mi empresa nos ha surgido la necesidad de renombrar muchos ficheros .tif
sustituyendo el nombre genérico que aparece por el valor de las celdas de la primera columna de un fichero de Excel
por lo que me cree una macro en VBA que resolviera la papeleta

En un principio todo parecia correcto, pero cuando probamos en detalle con los usuarios
me he encontrado que solo renombra correctamente los ficheros cuyo nombre original es texto
mientras que si el nombre original es un numero, el programa entra una vez mas en el bucle.

Estoy desesperado, no entiendo por que actua asi, por lo que os adjunto el codigo para ver si alguien pudiera echarme una mano.



1) te sugiero que hagas una prueba +/- como pides: "con tres o cuatro imagenes .tif"
donde dos (o mas) de esas imagenes tengan un nombre "numerico", y pruebes el codigo que expones (PERO...)
haz una ligera variante (provisional) y...
-> donde usas la instruccion: Name "origen" As "destino"
-> cambiala por otra del tipo: Debug.Print minombre

lo anterior solo para comprobar si el bucle entra en la "redundancia ciclica" que comentas -???-

2) si de esta forma el bucle no presenta las repeticiones que mencionas, sera necesario que encuentres una manera diferente
ya que de la forma que usas este bucle (realmente) no tienes control sobre cual archivo (renombrado) ya se habia procesado
ni la seguridad de que el orden en que se encuentran los *.tif se corresponda con los nombres en las celdas que recorre

es probable que esta forma de bucle y cambios de nombre "al vuelo" pudiera tener otro tipo de "repercusiones" -???-
haz la prueba con el punto 1, y si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ el codigo expuesto y resto del mensaje __
Sub prueba4() ' Modificacion del nombre de un fichero en una carpeta
Dim miruta As String
Dim minombre As String
Dim contador As Integer
miruta = "c:\prueba\*.tif" ' Carpeta donde estan almacenados los ficheros .tif
minombre = Dir(miruta, vbArchive) ' capturo el primer archivo .tif
contador = 0
Do While minombre <> ""
Name "c:\prueba\" & minombre As "c:\prueba\" & ActiveCell.Value & ".tif" ' renombro el fichero al valor de la celda activa
contador = contador + 1
ActiveCell.Offset(1, 0).Select ' Me desplazo a la celda de abajo
minombre = Dir ' Capturo el siguiente fichero .tif
Loop
MsgBox contador ' Cuando ya no hay mas ficheros, miro cuantos se han renombrado.
End Sub

El codigo lo tengo insertado en un fichero cuya primera columna contendria los valores
que seria el nuevo nombre del fichero (ese nombre es lo de menos, por ejemplo podrían ser las letras del abecedario).

Si observais, el codigo recoge el nombre del primer fichero contenido en la carpeta prueba que tiene extension .tif
y al entrar en el bucle, sustituye el nombre original del fichero por el valor de la celda activa
seguidamente se desplaza una celda abajo y pasa a renombrar el segundo fichero .tif de la carpeta, y asi sucesivamente.

Pues bien, si os creais un pequeno fichero y probais el codigo con tres o cuatro imagenes .tif
observareis que, si el nombre original de esos ficheros .tif es texto las veces que el programa entra en el bucle son correctas
mientras que si el nombre original de los ficheros es numerico (como ocurre en mi empresa)
el programa entrara una vez mas de las necesarias en el bucle y, en consecuencia lo renombrara mal.

Y por mas que lo miro, reviso, pruebo, no entiendo por que c... se comporta asi.

Por favor, si alguien pudiera ayudarme le estaria muy agradecido..

Un saludo y muchas gracias por anticipado.
Respuesta Responder a este mensaje
#2 javier.ranchal
07/03/2009 - 11:48 | Informe spam
Hola Héctor:

En primer lugar muchas gracias por contestar.

Para comprobar utilicé el clásico msgbox, y si comentaba el name, todo
salía perfecto (si había tres ficheros me salían tres msgbox, si había
cinco me salían cinco, etc...). Sin embargo cuando hacía el mismo
proceso pero con el name activo, me devolvía lo comentado (si el
nombre de los tif eran texto me salía correcto, pero si eran número,
me listaba los ficheros existentes y volvía a dar una vuelta extra
volviendo a renombrar el primer fichero ya renombrado).

De todas formas, esta mañana me he levantado con las ideas más claras
y he solucionado el problema poniendo como condición en el bucle que
sea la celda activa la que controle la entrada al bucle en lugar del
objeto minombre.

Do While ActiveCell.Value <> ""
...

Creo que con esta opción incluso lo puedo controlar mejor, pero desde
luego que es muy curioso lo de que el programa haga distinción entre
unos ficheros y otros ¿Verdad?

Ël problema ya lo tengo solucionado, pero si aún así quieres indagar o
que haga la prueba del Debug que comentas y lo pruebo, estoy a tu
disposición.

Un abrazo y muchas gracias de nuevo por tu ayuda.
Respuesta Responder a este mensaje
#3 Héctor Miguel
08/03/2009 - 01:47 | Informe spam
hola, javier !

__ 1 __
Para comprobar utilice el clasico msgbox, y si comentaba el name, todo salia perfecto
(si habia tres ficheros me salian tres msgbox, si habia cinco me salian cinco, etc...).
Sin embargo cuando hacia el mismo proceso pero con el name activo, me devolvia lo comentado
(si el nombre de los tif eran texto me salia correcto, pero si eran numero, me listaba los ficheros existentes
y volvia a dar una vuelta extra volviendo a renombrar el primer fichero ya renombrado).



1) esto (probable/seguramente) se debe a lo comentado en el mensaje anterior...
"... de la forma que usas este bucle (realmente) no tienes control sobre cual archivo (renombrado) ya se habia procesado"

__ 2 __
... con las ideas mas claras... he solucionado el problema poniendo como condicion en el bucle
que sea la celda activa la que controle la entrada al bucle en lugar del objeto minombre.
Do While ActiveCell.Value <> ""
Creo que con esta opcion incluso lo puedo controlar mejor ...



2) este cambio supone/asume/espera que tu recorrido por la "ActiveCell" es exactamente el mismo numero de celdas...
que el numero de archivos que pudiera encontrar el bucle en su camino, de lo contrario, tambien perderias el control...
ya sea que te quedes "corto" con los archivos existentes realmente en dicha carpeta...
o que re-re-renombres unos cuantos de los "primeros" (segun que numero sea mayor, celdas o archivos) -???-

__ 3 __
... pero... es muy curioso lo de que el programa haga distincion entre unos ficheros y otros Verdad?



3) (segun yo ?) esta curiosidad se debe a otro comentario en el mensaje anterior...
"... esta forma de bucle y cambios de nombre "al vuelo" pudiera tener otro tipo de "repercusiones""

__ 4 __
Ël problema ya lo tengo solucionado, pero si aun asi quieres indagar
o que haga la prueba del Debug que comentas y lo pruebo ...



4) EMO, una (posible) forma de tener un poco mas de control sobre este tipo de cambio de nombres pudiera ser si...
a) "bajas" los nombres de archivos que reporte un bucle Dir() p.e. a una celda adjunta al rango con los "nuevos" nombres
b) corres un nuevo bucle (SIN el Dir) solo con la instruccion Name <celda_archivo_encontrado> As <celda_nuevo_nombre>

saludos,
hector.
Respuesta Responder a este mensaje
#4 javier.ranchal
09/03/2009 - 16:12 | Informe spam
On 8 mar, 01:47, "Héctor Miguel"
wrote:
hola, javier !

__ 1 __

> Para comprobar utilice el clasico msgbox, y si comentaba el name, todo salia perfecto
> (si habia tres ficheros me salian tres msgbox, si habia cinco me salian cinco, etc...).
> Sin embargo cuando hacia el mismo proceso pero con el name activo, me devolvia lo comentado
> (si el nombre de los tif eran texto me salia correcto, pero si eran numero, me listaba los ficheros existentes
> y volvia a dar una vuelta extra volviendo a renombrar el primer fichero ya renombrado).

1) esto (probable/seguramente) se debe a lo comentado en el mensaje anterior...
    "... de la forma que usas este bucle (realmente) no tienes control sobre cual archivo (renombrado) ya se habia procesado"

__ 2 __

> ... con las ideas mas claras... he solucionado el problema poniendo como condicion en el bucle
> que sea la celda activa la que controle la entrada al bucle en lugar del objeto minombre.
> Do While ActiveCell.Value <> ""
> Creo que con esta opcion incluso lo puedo controlar mejor ...

2) este cambio supone/asume/espera que tu recorrido por la "ActiveCell" es exactamente el mismo numero de celdas...
    que el numero de archivos que pudiera encontrar el bucle en su camino, de lo contrario, tambien perderias el control...
    ya sea que te quedes "corto" con los archivos existentes realmente en dicha carpeta...
    o que re-re-renombres unos cuantos de los "primeros" (segun que numero sea mayor, celdas o archivos)    -???-

__ 3 __

> ... pero... es muy curioso lo de que el programa haga distincion entre unos ficheros y otros Verdad?

3) (segun yo ?) esta curiosidad se debe a otro comentario en el mensaje anterior...
    "... esta forma de bucle y cambios de nombre "al vuelo" pudiera tener otro tipo de "repercusiones""

__ 4 __

> Ël problema ya lo tengo solucionado, pero si aun asi quieres indagar
> o que haga la prueba del Debug que comentas y lo pruebo ...

4) EMO, una (posible) forma de tener un poco mas de control sobre este tipo de cambio de nombres pudiera ser si...
    a) "bajas" los nombres de archivos que reporte un bucle Dir() p.e. a una celda adjunta al rango con los "nuevos" nombres
    b) corres un nuevo bucle (SIN el Dir) solo con la instruccion Name <celda_archivo_encontrado> As <celda_nuevo_nombre>

saludos,
hector.



Hola Héctor:

La verdad es que de momento he podido salir del paso porque estoy
utilizando al pobre usuario para que verifique que se han hecho bien
los cambios. Está muy bien la opción que comentas y, tan pronto como
acabe unas cosas pendientes, me pongo con ello para depurar el código.

Un abrazo y muchísimas gracias por tu ayuda.

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