Macro para repartir nombres por series.

Hola Experto, te cuento:
Tengo una columna llena de nombres, columna A, necesito extraer los primeros 16 nombres y repartirlos en la primera fila de cada columna que corresponda a ese nombre, pero que no aparezca el nombre sino una cruz, por, porque ya la columna tiene nombre. Luego que reinicie el ciclo nuevamente, extrayendo los siguientes 16 nombres siguientes y los reparta en la siguiente fila, o sea fila 2, en la columna con el nombre correspondiente, y así susesibamente hasta finalizar. En el caso de encontrar 2 nombres iguales, que coloque 2 cruces, por por, en la misma celda dentro de esos 16 nombres.
Ej.
Juan lucas ines maría juan jorge santiago diego
María X X X X X X
Lucas
Ines
María
Diego
Hasta 16 nombres.
Cuando termine de revisar y repartir esta serie de 16 nombres, tome otra serie de 16 nombres y haga lo mismo, pero las cruces que resulten de esta nueva serie, queden debajo de las primeras.
Ej: lucas ines maría juan jorge santiago diego
Fernando X X X X X X
Lucia X X X X
Ernesto
Jorge
Santiago
Ines
María
Hasta 16 nombres y luego tomar otros16 nombres y hacer lo mismo y así sucesivamente hasta terminar la columna ''A''
Las cruces indican los nombres que coinciden con los que están en la columna.
Un colega tuyo me dio esta macro:
Function contarx(celdas As Range, ByVal name As String) As String 
Dim cont As String 
Dim rnCell As Range 
Application.Volatile 
For Each rnCell In celdas 
    If rnCell.Value = name Then 
        cont = cont & "x" 
    End If 
Next rnCell 
contarx = cont 
End Function
Y es muy buena la macro, pero el problema fue, que cada vez que quiero que se ejecute, tengo que escribir en cada columna :
=contarx($A$1:$A$16;B1) y me llevaría mucho tiempo , porque son cientos de nombres que tengo en la columna ''A''y por cada 16 nombres tendría que escribirlo.
Necesito una macro que lo haga automáticamente el desglose de todos los nombres, sin que yo tenga que escribir que lo haga.
Se que es muy difícil, porque me lo ha hecho saber un colega tuyo, diciéndome que es un ciclo dentro de otro ciclo, y hay que tener conocimientos demasiados avanzados para dar con la tecla, así que no te sientas mal si no puedes.
Por favor, alguna señal de que has recibido mi mensaje.
Gracias.

1 Respuesta

Respuesta
1
Espero te sirva trabaja en conjunto con la función que te mandao mi colega...
Mis comentarios en el mismo código...
Espero t sirva...
Sub Macro3()
Dim ABC As Integer
Dim Linea As Variant
Dim Mensaje As Variant
Dim Título As Variant
Dim ValorPred As Variant
'A=65 en código ascii
'Z=90 en código ascii
Linea = ActiveCell.Address 'de línea donde dejará el resultado pregunta donde esta.
Linea = Mid(Linea, InStr(2, CStr(Linea), "$") + 1) 'Debido a q el resultado anterior es una dirección de celda en valor absoluto. P.E. $B$2, toma unicamente el 2, que es el valor de la línea
'UltimoBloque = 32 'Aquidebemos colocar el valor de la última línea de A. ya ves asi como valor concreto..
'O talves con Inbox
Mensaje = "Hasta que línea deberá revisar...?"
Título = "Ultima Línea"
ValorPred = ""    ' Establece el valor predeterminado.
' Muestra el mensaje, el título, y el valor predeterminado.
UltimoBloque = CLng(InputBox(Mensaje, Título, ValorPred))
'Este for es a lo que el colega se referia, y si no fue nada facil...
'Este calcula por Bloques
'Ene ste caso el 16 indica que los incrementos serán de 16 en 16.. hasta el q valor sea menor o igual al indicado
'En UltimoBloque
For Bloque = 1 To UltimoBloque Step 16
    ABC = 66 'El valor acsii de B
    'Determina que hasta 5 posiciones al a izquierda realizará el movimiento el valor m´zximo es 90 q es la Z,
'después de eso marcaría Error, porque por ejemplo 91 es [ y esto no es valor valido para una columna en excel.
    Hasta = ABC + 5
    ' Lo hará hasta la columna indicada...
    For ABC = 66 To Hasta
        Range(Chr(ABC) + CStr(Linea)).Select
        'Carga la formula de contarx que t paso el colega...
        ActiveCell.FormulaR1C1 = "=contarx(R" + CStr(Bloque) + "C1:R" + CStr(Bloque + 15) + "C1,R1C)"
     Next
     'por cada cambio de bloque avanzará una línea como lo solicitast...
     Linea = Linea + 1
 Next
End Sub
Lo vi el viernes...
Hola experto!
Disculpas por haber omitido mis pocos conocimientos sobre excel, ¿todo lo que pusiste va en el ''modulo 1'' junto con la fórmula ''cotarx'', en el orden que lo pusiste?
La formula a la que te referís es =cotarx($A$1 etc,etc ? ,o Funtion contarx(celdas etc,etc?
Es la primera vez que aplico una macro, y será la ultima, porque esto no es para mi.
Gracias por tu explicación!
Posicionas el cursor... en este caso en B2...
Seleccionas Herramientas / Macro / play Macro...
Y de la lista que aparezca seleccionas Macro3
Y la ejecutas...
Eso es todo...
No olvides modificar para undicas hasta que linea deberá trabajar...
Hola experto
Me esta siendo muy difícil entender dado mis pocos conocimientos, por lo tanto te voy a ir preguntando por etapas.
La macro que tu vez, es producto de otro experto al igual que tu, que lo único que hice fue copiarlo gracias a las funciones,(COPIAR y PEGAR )y con instrucciones paso a paso de como hacerlo, porque yo no entiendo ni un pomo!, es la primera vez que hice funcionar una macro, así que con esto te digo todo.
Solo te voy hacer una pregunta por vez para no abrumarte y pedirte paciencia.
1) Si me podes decir donde encuentro, ''¿Sub Macro3()''?
Gracias!
              Saludos
Ok... No t apures a todos no pasa cuando empezamos con un tema nuevo...
En el código que mandé que es complementarios al que te mando el colega...
En tu hoja de calculo donde vas a colocar este código, ábrela.
Presionas Alt+F11 y esto va abrir el editor de Microsoft Visual Basic.
Me voy a referir en cuanto a izquierda y derecha a tu mano no a pantalla.
En la ventan de la izquierda verás una lista de objetos... un árbol... de objetos.
Busca donde esta el nombre de tu Archivo algo parecido a:
VBAProject ( nombre del archivo )
Abajo Microsoft Excel Objetos
Busca si hay o no una carpeta llamada Módulos...
Si no existe, selecinar Insertar / Modulo
Esto creará un folder con los módulos...
Ahora si existe la capeta, ábrela y elige uno de los módulos, casi siempre los colocan como Módulo1... Módulo2... MóduloN...
Al abrir unos de los módulos que es donde deb estar el código del colega...,
copia lo que t mande que empieza como:
Sub Macro3().....
hasta donde esta End Sub
Esto sería a lo que me refiero con Macro3...
Cuango hagas esto... Puedes hacer lo que t mandé en la contestación previa...
Hola experto
Encontré el modulo!, pero tuve que seleccionarlo,(como dijiste), pues solo aparecían, Hoja1, 2,3 y This workbook.
Ahora bien, por lo que me dijiste, voy a poner primero la fórmula de tu colega y luego la tuya.
Mi pregunta:
La copio y pego así como esta, ¿con todas tus explicaciones en Español?
Como siempre, Gracias!
Si todo esta documentado...
El símbolo ' es para indicarle al excel que eso es un comentario del programador...
No lo toma en cuenta...
Hola experto!
Funciona bárbaro!
Mis ultimas 3 preguntas son:
1) Para hacer bloques de 23 nombres, es suficiente con cambiar el numero 16 por el 23, ¿o hay que hacer algo más?.
2) Como incrementar, (si es que se puede) las columnas hasta la 138, o sea hasta la columna ''EF'', ¿también se puede hacer ABC + 138?
3)Por ultimo, como dejar la columna''B''neutral, ¿qué quede solo como separador?.
Muchas gracias!
1.- Si...
2.- Para las columnas no sería posible porque debería se una concatenación calculada.. de letras...
3.- Mmm ... esta no me quedo clara...
Hola experto!
En la pregunta 3, me refería a que la macro no opere en la columna ''B'', porque resulta que no pongo ningún nombre en la columna''B'', y sin embargo en una sola de las filas aparecen como 8 o 10 cruces, no se porque lo hace, ¿ya qué queda sin señalar?. Dejo la columna ''B'' libre para usarla como separación, y me hace esto:
Ej A B C D Etc.
Fernando Lucia Jorge
Lucia
Ernesto xxxxxxxxxxx x x
Jorge
Santiago
Ines
María
Gracias!
Saludos.
La variable ABC = 66 'El valor acsii de B es la que indica el inicio en la columna B si aumentas 66 a 67 sería a partir de C...
Tu lo puedes definir esto...
¿Es a esto a lo que t referías...?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas