• 👏 Bienvenido a nuestra comunidad Excel

    ¿Todavía no estás registrado? 😲

    Registrate gratis aquí y podrás:

    💪 Hacer preguntas a los expertos
    ⬇️ Descargar ejemplos y plantillas
    🏅 
    Acceder a contenidos premium

Crear carpetas

Akkar

Member
Hola, Soy nuevo aquí y en el mundo de Excel, tengan paciencia conmigo. Aunque ahora estoy mirando videos para aprender macro, empecé a hacer proyectos hace un mes. Pero como que empecé corriendo antes de gatear. Ahora me encuentro con errores y cosas que no puedo finalizar.

Estoy en una macro, que recojo información de otro libro, e ingreso en una tabla, donde limpio colores y bordes, y concateno información de dos columnas para después crear las carpetas. Hasta ahí bien, incluso hice que si una celda de auxiliares está vacía, escriba sin auxiliar. Bien lo único que me faltó en 1ra parte es eliminar unas filas vacías, no conseguí (aunque las borro manual, antes de iniciar 2da parte)

Ésta 2da parte, separa a los auxiliares repetidos a una tabla en otra hoja (ya que tuve problema con última fila) , bien de esa tabla conseguí crear las carpetas de auxiliares con un (For Next). El problema viene ahora , para crear las subcarpetas de los pacientes de cada auxiliar. Intenté hacer un (For Next) dentro del anterior, con un (If not is nothing) para que me sacara los pacientes con el auxiliar , pero no me crea la subcarpeta. En el (mkdir) con la ruta creada y con el resultado, que sería el código de subcarpeta. Viendo que los nombres son correctos con el depurador, no me funciona.

Trabajo con mucha ilusión y ganas de aprender, no sé si me explique bien sobre mi problema. No sé si es que no se puede crear carpetas con rango y seguido crear otra carpeta en la creada. O hago algo mal.

Agradezco ya, solamente por haber leído todo, y sobre todo si pueden echarme una mano.
 

Héctor Miguel

Well-known member
no sé si me explique bien sobre mi problema
se entiende lo que pretendes, sin embargo, estas pidiendo que se adivinen ciertos detalles (?)

tienes (al menos) dos opciones:

o indicas exactamente como (RE)crear un modelo de datos identico al tuyo
o adjuntas (una copia de) TU modelo (recortada y hasta inventada, pero "fiel" de la situacion a resolver)

en necesario saber como se indica a la macro nombre y ubicacion de las (sub)carpetas a crear
 

Akkar

Member
Ok, disculpa mi ignorancia, aunque entendí perfectamente lo que me dijiste, es lógico. No se si sabre poner el código, vamos a intentarlo.

Código:
ruta = ThisWorkbook.Path

MkDir ruta & "\Curaciones Agosto20"

ultFilTabAux = hjtablaauxiliares.Range("F" & Rows.Count).End(xlUp).Row

ultFilaPacientes = hjtablapacientes.Range("E" & Rows.Count).End(xlUp).Row

For contTabAux = 7 To ultFilTabAux

        auxiliarCarpeta = hjtablaauxiliares.Range("F" & contTabAux)
        
        MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux)
        
      
        For contPacientes = 7 To ultFilaPacientes
            
            Set buscarAuxiliar = hjtablaauxiliares.Range("F7:F" & contPacientes).Find(auxiliar, LookIn:=xlValues, lookAt:=xlWhole)
            If buscarAuxiliar = auxiliar Then
            MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux) \ hjtablapacientes.Range("H" & contPacientes)
            Else
               
            End If
            
        Next contPacientes
        
        
Next contTabAux


acordaros que soy muy novato, e intentado poner lo que necesito, organizando lo y buscando lógica, esta no se que intento es, ya que voy probando el ensayo y error.

la carpeta "curaciones agosto20" la crea el mismo programa en donde esta el libro, a partir de ahi, crea una carpeta por auxiliar, que es el primer FOR, y el segundo FOR es para que busque los pacientes y cree las subcarpetas de cada paciente en la creada, pero no hay manera.

espero haberlo echo mejor ahora, gracias!

edite, porque vi unos fallos que anoche ni vi, y pense que ya estaba arreglado pero no.
 
Última edición:

Héctor Miguel

Well-known member
e intentado poner lo que necesito, organizando lo y buscando lógica, esta no se que intento es, ya que voy probando el ensayo y error
sin contar con una muestra de tus datos y su arreglo, solo te puedo comentar lo siguiente:
1) tienes una misma variable (ultFilTabAux) asignada a rangos de DOS hojas distintas:
Código:
ultFilTabAux = hjtablaauxiliares.Range("F" & Rows.Count).End(xlUp).Row
ultFilTabAux = hjtablapacientes.Range("E" & Rows.Count).End(xlUp).Row
2) en estas 2 lineas:
Código:
Set buscarAuxiliar = hjtablaauxiliares.Range("F7:F" & contPacientes).Find(auxiliar, LookIn:=xlValues, lookAt:=xlWhole)
If buscarAuxiliar = auxiliar Then
NO tienes ninguna variable (definida NI asignada) de nombre "auxiliar" (no hay con que comparar)

por lo tanto, no es claro si tu intencion/necesidad es "ir colgando" sub(sub)(sub)... carpetas a partir de... cual ?

(tendras mas detalles "en el tintero" ?)
 

Akkar

Member
Eres muy amable y paciente. No se como enviar el excel.

Código:
Sub crearcarpetas()

' creare un contador para sacar a las auxiliares que no esten repetidas para luego crear carpetas
Dim auxiliar As String
Dim buscarAuxiliar As Range
Dim auxiliarUnica As String

Dim contaux As Long
Dim ultFilaDestino As Long
Dim ultfilaauxiliar As Long

Dim contTabAux As Long
Dim ultFilTabAux As Long
Dim contPacientes As Long
Dim ultFilaPacientes As Long
Dim rutaauxiliar As String
Dim auxiliarCarpeta As String



auxiliarUnica = Range("I7").Value

ultFilaDestino = hjtablapacientes.Range("G" & Rows.Count).End(xlUp).Row

'primero miramos que todos pacientes tengan auxiliar, sino rellenamos auxiliar con sin auxiliar, luego creamos en otra hoja, por
'respetar ultima fila, una lista de todos los auxiliares, sin que se repitan

For contaux = 7 To ultFilaDestino

    auxiliar = hjtablapacientes.Range("G" & contaux).Value
   
    If auxiliar = "" Then
        hjtablapacientes.Range("G" & contaux).Value = "SIN Auxiliar"
    End If
   
    If hjtablaauxiliares.Range("F7") = "" Then
        ultfilaauxiliar = 7
    Else
        ultfilaauxiliar = hjtablaauxiliares.Range("F" & Rows.Count).End(xlUp).Row + 1

    End If

        Set buscarAuxiliar = hjtablaauxiliares.Range("F7:F" & ultFilaDestino).Find(auxiliar, LookIn:=xlValues, lookAt:=xlWhole)
        If Not buscarAuxiliar Is Nothing Then
           Else
           hjtablaauxiliares.Range("F" & ultfilaauxiliar) = auxiliar
        End If
        
Next contaux

ruta = ThisWorkbook.Path

MkDir ruta & "\Curaciones Agosto20"

ultFilTabAux = hjtablaauxiliares.Range("F" & Rows.Count).End(xlUp).Row

ultFilaPacientes = hjtablapacientes.Range("E" & Rows.Count).End(xlUp).Row

For contTabAux = 7 To ultFilTabAux

        auxiliarCarpeta = hjtablaauxiliares.Range("F" & contTabAux)
       
        MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux)
       
     
        For contPacientes = 7 To ultFilaPacientes
           
            Set buscarAuxiliar = hjtablaauxiliares.Range("F7:F" & contPacientes).Find(auxiliar, LookIn:=xlValues, lookAt:=xlWhole)
            If buscarAuxiliar = auxiliar Then
            MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux) \ hjtablapacientes.Range("H" & contPacientes)
            Else
              
            End If
           
        Next contPacientes
       
       
Next contTabAux





End Sub


esto seria completo, al menos la segunda parte de la macro, la primera, hace lo que tiene que hacer""

si me di cuenta de las lineas mal echas, tanto copy past, pues se me olvido arreglar.

puse completo para que vieras que si(sino estoy equivocado) puse los valores... aunque cuando empiezas a tocar, y no funciona, y copio y pego a ver si es asi, hay un momento que me mareo de tantos datos, en fin,

infinitamente agradecido por tu paciencia y tiempo
 

Adjuntos

Héctor Miguel

Well-known member
puse completo para que vieras que si(sino estoy equivocado) puse los valores... aunque cuando empiezas a tocar, y no funciona, y copio y pego a ver si es asi, hay un momento que me mareo de tantos datos, en fin
1) tu variable "auxiliar" (cadena de texto) queda FIJA despues del primer for...next
- ya no "juega" para la segunda parte

2) cuando creas las (sub)carpetas pierde el tipo String al concatenar la ruta con la (sub)carpeta:
Código:
MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux) \ hjtablapacientes.Range("H" & contPacientes)
ese \ "solitario" (previo a hjtablapacientes...) debiera ir entre comillas dobles y concatenado: & "\" & [...]
No se como enviar el excel
3) cuando consultas (o respondes), en la parte de abajo del mensaje hay un "boton" (con una imagen de clip) que dice:
"Adjuntar archivos"

ese adjunto es necesario porque (aun) hay "detalles perdidos" (como para partir solo del codigo)
 

Akkar

Member
1) tu variable "auxiliar" (cadena de texto) queda FIJA despues del primer for...next
- ya no "juega" para la segunda parte

2) cuando creas las (sub)carpetas pierde el tipo String al concatenar la ruta con la (sub)carpeta:
[\QUOTE]

deberia crear otra variable para auxiliar? puede ser por eso que no funciona la parte de si es igual?

ese \ "solitario" (previo a hjtablapacientes...) debiera ir entre comillas dobles y concatenado: & "\" & [...]
[\QUOTE]

vaya tela, este mundo es tan gratificante como malvado... por eso no me iba bian....., aunque me creo todos los pacientes en todas los auxiliares, algo que voy a intentar arreglar ahora

gracias por tus aportes, y paciencia,
me has alegrado el dia, voy a ver si lo consigo
mil gracias
 

Akkar

Member
ok, ya lo vi (que no estaba antes ?)
lo edite 3 minutos despues de publicar


bueno, estas en lo cierto, ni aun poniendo un nuevo me esta funcionando.

tengo que darle vueltas a la forma de conseguir ese efecto,

pense que para crear la primera carpeta hacer un for, pero claro para sus subcarpetas tenia que hacer otro for, porque sino pierdo la variante del primero. por eso la idea.

es complicadillo este mundo jajaja
 

Akkar

Member
Amigo, ya lo conseguí

lo simplifique y conseguí el resultado querido, pero hasta que lo vi, me volvi loco.

pero ya funciona correctamente.

era una confusion en mis variables puestas.... que novato jajaja, lo importante es que pude verlo, de los errores se aprende.
pero sin tu guia no hubiera conseguido verlo

gracias mil gracias

Código:
Sub crearcarpetas()

' creare un contador para sacar a las auxiliares que no esten repetidas para luego crear carpetas
Dim auxiliar As String
Dim buscarAuxiliar As Range
Dim auxiliarUnica As String

Dim contaux As Long
Dim ultFilaDestino As Long
Dim ultfilaauxiliar As Long

Dim contTabAux As Long
Dim ultFilTabAux As Long
Dim contPacientes As Long
Dim ultFilaPacientes As Long
Dim rutaauxiliar As String
Dim auxiliarCarpeta As String

Dim auxiliar2 As String
Dim buscarauxiliar2 As Range


auxiliarUnica = Range("I7").Value

ultFilaDestino = hjtablapacientes.Range("G" & Rows.Count).End(xlUp).Row

'primero miramos que todos pacientes tengan auxiliar, sino rellenamos auxiliar con sin auxiliar, luego creamos en otra hoja, por
'respetar ultima fila, una lista de todos los auxiliares, sin que se repitan
 
For contaux = 7 To ultFilaDestino

    auxiliar = hjtablapacientes.Range("G" & contaux).Value
    
    If auxiliar = "" Then
        hjtablapacientes.Range("G" & contaux).Value = "SIN Auxiliar"
    End If
    
    If hjtablaauxiliares.Range("F7") = "" Then
        ultfilaauxiliar = 7
    Else
        ultfilaauxiliar = hjtablaauxiliares.Range("F" & Rows.Count).End(xlUp).Row + 1

    End If

        Set buscarAuxiliar = hjtablaauxiliares.Range("F7:F" & ultFilaDestino).Find(auxiliar, LookIn:=xlValues, lookAt:=xlWhole)
        If Not buscarAuxiliar Is Nothing Then
           Else
           hjtablaauxiliares.Range("F" & ultfilaauxiliar) = auxiliar
        End If
         
Next contaux

ruta = ThisWorkbook.Path

MkDir ruta & "\Curaciones Agosto20"

ultFilTabAux = hjtablaauxiliares.Range("F" & Rows.Count).End(xlUp).Row

ultFilaPacientes = hjtablapacientes.Range("E" & Rows.Count).End(xlUp).Row

For contTabAux = 7 To ultFilTabAux

        auxiliarCarpeta = hjtablaauxiliares.Range("F" & contTabAux)
        
        MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux)
        
      
        For contPacientes = 7 To ultFilaPacientes
            If hjtablaauxiliares.Range("F" & contTabAux) = hjtablapacientes.Range("G" & contPacientes) Then
            
            MkDir ruta & "\Curaciones Agosto20\" & hjtablaauxiliares.Range("F" & contTabAux) & "\" & hjtablapacientes.Range("H" & contPacientes)
            Else
               
            End If
            
        Next contPacientes
        
        
Next contTabAux





End Sub
 

Héctor Miguel

Well-known member
lo simplifique y conseguí el resultado querido, pero hasta que lo vi, me volvi loco.
pero ya funciona correctamente.
era una confusion en mis variables
no estoy seguro que funcione "correctamente", de todas formas, te paso esta informacion:

NO toque tu macro para importar datos, pero dos "cosillas":

1) inhabilite tu macro (crearcarpetas) por estas eventualidades:
a) corrigiendo el tema del \ "solitario" se corrige el comportamiento PERO...
b) se crean las sub-carpetas de pacientes IGUAL para todos los auxiliares Y...
c) no contempla prevenir errores por intento de creacion de sub-carpetas ya existentes

2) cree un nuevo procedimiento (creaCarpetas) y lo asigne al boton correspondiente
a) aprovecho el que ya usas tablas (listObjects) y creo que es mas sencillo de administrar
b) corregi cualquier exceso de espacios en algun dato-nombre
c) cambie el formato de (solo) MAYUSCULAS (perdon por esto, no se por que no acaba de gustarme ese abuso)

nota: estoy manejando las colmnas por numero, mientras no cambies de posicion las columnas de las tablas todo OK
si llegas a cambiar el orden, podrias atender a los titulos (solo que tambien tienes algunos muy laaargos ?)

haz tus pruebas y... comentas ?
 

Adjuntos

Akkar

Member
no estoy seguro que funcione "correctamente", de todas formas, te paso esta informacion:

NO toque tu macro para importar datos, pero dos "cosillas":

1) inhabilite tu macro (crearcarpetas) por estas eventualidades:
a) corrigiendo el tema del \ "solitario" se corrige el comportamiento PERO...
b) se crean las sub-carpetas de pacientes IGUAL para todos los auxiliares Y...
c) no contempla prevenir errores por intento de creacion de sub-carpetas ya existentes

2) cree un nuevo procedimiento (creaCarpetas) y lo asigne al boton correspondiente
a) aprovecho el que ya usas tablas (listObjects) y creo que es mas sencillo de administrar
b) corregi cualquier exceso de espacios en algun dato-nombre
c) cambie el formato de (solo) MAYUSCULAS (perdon por esto, no se por que no acaba de gustarme ese abuso)

nota: estoy manejando las colmnas por numero, mientras no cambies de posicion las columnas de las tablas todo OK
si llegas a cambiar el orden, podrias atender a los titulos (solo que también tienes algunos muy laaargos ?)

haz tus pruebas y... comentas ?
me has dejado sin palabras.... y solo he visto la macro. Ni la he probado aun, pero se ve todo tan ordenado y logico, muchos comandos ni siquiera se como funcionan, pero veo una lógica con todo.

Me alegra mucho, el haber encontrado y decidido entrar en el foro, me da la sensación que voy aprender mucho con vosotros.

si, cuando arregle el \"solitario" me hacia lo que dices, entonces me centré y vi todos los errores de dirección de mis comandos, demasiadas fallas ahí, imagino que hice copy past, y no cambie las variables donde eran, pero en cuando me di cuenta, y las puse correctas, quite ese if not para crear la carpeta, al darme cuenta que con un if a=b crea, y al probar la macro, pues hizo todo como había pensado en un momento, no contemple lo de los errores, principalmente por que tenia que crear de 0. Pero es un buen punto. Se nota tu experiencia.

Ya le eché un vistazo, y funciona correctamente. Es más a la mía le das otra vez y salta el error en crear la primera carpeta, al estar ya creada, en la tuya puedes cansarte de dar a la macro que no pasa nada.

Se que para mi, esto es un proyecto avanzado, y que tenia que aprender a gatear antes de ponerme a correr, pero es importante para mi, poder hacer los proyectos que pasan por mi mente, ver que es posible y conseguirlo, llevo un mes escaso en este mundillo y me gusta, ver todas las posibilidades que hay para crear. Cada cosa que hacia en la macro, y ver que lo conseguía era un aliciente para mi, hasta que encontraba un error, pero lo solucionaba, y para adelante, y luego otro, hasta que llegue aquí. Con todo esto quiero decir, que valoro mucho el tiempo que me dedicaste, aunque te guste todo esto y disfrutaras con ello, no le quito valor, se que el tiempo es un tesoro, así que muchísimas gracias por tu paciencia y dedicación.
 

Akkar

Member
Solamente me quedaría depurar un poco la otra macro. Ya que al importar, me trae todo con colores y bordes, que conseguí eliminarlos. Pero me deja 3 lineas vacías al final, y no he sabido eliminarlas. Quizás también preguntar una dirección o algo para encontrar el archivo para extraer los datos. Bueno dar unos retoques. Y si no te importa, te la enseñare acabada.

Me voy a poner hacer macros mas sencillas, acordes a mi nivel 0, hacer repeticiones, para que asimile los comandos, si podéis orientarme, pues seria de agradecer, yo miro en youtube, y seguía unos cursos de macros.

Aun estoy embobado con la macro que me hiciste Héctor.....

Edito o añado

Faltó el rellenar la lista de auxiliares, copié la mía y la añadí a la tuya. También me faltó añadir o crear otra carpeta, que intenté hacerlo en la tuya, pero me dió error, y no quise tocar mas.

Hay alguna forma para copiar archivos a esas carpetas?

Yo he pensado en hacer una tabla con los archivos pdf que tengo en varias carpetas, y con sus rutas. Y desde esa tabla copiarlos a las carpetas.
con el nombre de carpeta buscar los archivos que lo contengan, ya que los archivos tienen la fecha y/o alguna novedad entre paréntesis.
Creo a ver visto por youtube alguna manera de crear una lista de archivos a excel, y no se si es posible buscar como expliqué.

sugerencias y/o guía

gracias de antemano
 
Última edición:

Akkar

Member
Hola,

el .DataBodyRange sustituye a lo de ultimafila ?

el with es para que trabaje solo esa tabla?

porque no me deja crear otra carpeta en la variable que hiciste base?

me quede un poco desilusionado, al no comprender tu macro, me queda un mundo que aprender. De lo aprendido, me parece que es como si no supiera, al ver que lo simplificaste , es como si yo dara vueltas y vueltas para llegar, y darte cuenta que no llegue.

saludos!
 

Héctor Miguel

Well-known member
el .DataBodyRange sustituye a lo de ultimafila ?
mas o menos (entre otras cosas)
el with es para que trabaje solo esa tabla?
es para no repetir referencias
porque no me deja crear otra carpeta en la variable que hiciste base?
depende, de como y donde se lo estes indicando a la macro (?)

el otro procedimiento no lo toque porque (obviamente) no cuento con los mismos archivos que tu trabajas (?)
Hay alguna forma para copiar archivos a esas carpetas?
tambien, si adjuntas dos o tres muestras y comentas "de donde a donde" y los "por que's"

y agrega lo que pretendes y no has conseguido (?)
 

Akkar

Member
lo mismo, al crear esas carpetas, los archivos serian como la carpeta donde deben ir

ejem. carpeta Manolo Perez CC343234234

los archivos serian en pdf

3AGO Perez CC343234234(val)
13AGO Perez CC343234234
21ago Perez CC343234234(N)
Perez CC343234234


y los agruparia siempre en donde la hoja, y las carpetas creadas, en otra carpeta claro esta

eso seria para ahorrar mucho tiempo, si se pudiera hacer. No tenia nada pensado, pero hoy me toco unir carpetas

Si no es mucho pedir, y no te da trabajo, podrías explicarme que hace cada linea de la macro, tuve una mala experiencia con la interpretación, me explico, me hablaban en ingles y yo entendía, pero cuando al tiempo, aprendió español, y me contaba que me había dicho, no coincidían lo hablado y lo que entendí yo.

quiero aprender, pero tampoco quiero molestar mucho.

de la macro anterior, pones muchas cosas que no entiendo, aunque por lógica deben ser para.... porque se el resultado final. Lo que pretendo es aprender ,

quiero hacer una base de datos, para los pacientes, desde la cual, se pueda hacer ingresar, consultar, etc, y cada mes programar, una vez programados preparar el siguiente mes,

estoy en proceso, lo de las carpetas y unirlas seria una de las cosas,

voy poco a poco


de lo echo hasta ahora, es para adaptarlo ahi

igual me he metido en un pozo , intentare salir :)


gracias
 

Héctor Miguel

Well-known member
explicarme que hace cada linea de la macro
adjunto el mismo archivo solo con comentarios a cada linea de codigo
quiero hacer una base de datos, para los pacientes, desde la cual, se pueda hacer ingresar, consultar, etc, y cada mes programar, una vez programados preparar el siguiente mes
como ya lo mencionaste...
tenia que aprender a gatear antes de ponerme a correr
solo que ya estas queriendo "volar" y... tienes que "ayudarnos a ayudarte" (p.ej.)
- procura dar respuesta puntual a lo que se te (RE)pregunta
- se claro en lo que expliques acerca de como lo haces (actualmente) y lo que esperas (o quisieras)
- adjunta (de ser necesario) copia de TU/s modelo/s (EN excel)
- incluye casos (resueltos a mano) y las explicaciones por criterios aplicados (etc. etc. etc.)
 

Adjuntos

Akkar

Member
Muchísimas gracias!

Código:
  ' se indica el nombre de la sub-carpeta que debe ser dependiente de la ruta anterior '
  base = "\Curaciones Agosto20"


si quiero poner otra carpeta, sería ahí?
base= "\Curaciones Agosto20" & "\Auxiliares" o base="\Curaciones Agosto20\Auxiliares"

Puedes recomendarme algún libro, o pagina donde aprender, o una guía

muchas gracias por todo,
saludos!
 
Arriba