Definir un rango a partir del valor de una columna

Respuesta de
valedor
a
Usuario
Admirado Valedor,
Necesito definir un rango a partir del valor de una columna.
Tengo una tabla de excel de 6 columnas por 8000 líneas. La columna b puede tener 8 o 10 variables, siempre correlativas. Se trata de que una macro cree los rangos a partir del valor de la columna b. Después de haber visto algunas de tus respuestas creo que debe ser muy fácil para ti. Gracias anticipadas,

Lucas.
Usuario
Tu te has superado y yo me estoy recuperando de la impresión. Los compañeros te han dedicado palabras emocionadas: a los consabidos calificativos de Monstruo y Faraón, también han aparecido otras como Torero, Califa o Einstein. Esta tarde hemos quedado a la salida del trabajo para descorchar una botella a tu salud. Muchísimas gracias.
Experto
Hola Lucas, ahora si, ya nos entedemos, como critica constructiva, observa que es mejor desde un principio ser lo más claro posible, ¿no crees?...

Bien, lo que tenias que haber hecho es grabar una macro exactamente con los pasos que mencionas, como primero prueba, esto te recomiendo hacerlo siempre...

Como casi siempre, hay varias soluciones a la cuestión, la que escogí fue casi solo por el gusto de complicarme las cosas...

1.- Ordenamos por la columna DE (la de los agentes)
2.- Obtenemos los subtotales con la operación Cuenta de esta columna, esto es para saber cuantas filas tenemos de cada agente
4.- Guardamos el nombre del agente y la dirección del rango
4.- Quitamos los subtotales
5.- Iteramos entre los agentes definiendo cada rango con el numero de filas encontrado con la estructura

Rango_NombreAgente

Ejecuta la siguiente macro en la hoja donde están tus datos, estoy asumiendo que...

1.- Los datos tienen títulos en la primer columna
2.- Estos comienza en la fila 1
2.- NO hay filas en blanco dentro de tus datos


Option Explicit

Public Sub DefinirRangos()
Dim rVisibles As Range
Dim co1 As Integer, co2 As Integer
Dim c As Range
Dim Inicio As Long, Fin As Long
Dim mRangos() As String

Application.ScreenUpdating = False
'Ordenamos por la columna D la de los agentes
Range("A1").CurrentRegion.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'Agregamos un subtotal para saber cuantos y cuales agentes hay
Range("A1").CurrentRegion.Subtotal GroupBy:=4, Function:=xlCount, TotalList:=Array(4), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
'Contraemos para ver solo los totales
ActiveSheet.Outline.ShowLevels RowLevels:=2
'Seleccionamos solo las celdas visibles
Set rVisibles = Range(Range("D1"), Range("D1").End(xlDown)).SpecialCells(xlCellTypeVisible)
Inicio = 2
'Redimencionamos la matriz donde guardaremos información
ReDim mRangos(1, rVisibles.Cells.Count - 3)
'Iteramos cada celda visible
For Each c In rVisibles
co1 = co1 + 1
'La primer fila contiene los títulos y la ultima el total
'general, por eso las omitimos
If co1 > 1 And co1 < rVisibles.Cells.Count Then
'Calculamos donde termina el rango del agente actual
Fin = Inicio + c.Value - 1
'Guardamos el nombre del agente para definir el rango
mRangos(0, co2) = "Rango_" & Mid(c.Offset(0, -1).Value, 9)
'Guardamos la direccion del rango
mRangos(1, co2) = "=" & ActiveSheet.Name & "!$A$" & Format(Inicio) & ":$F$" & Format(Fin)
'Calculamos el inicio del siguiente rango
Inicio = Inicio + c.Value
'Incrementamos el contador usado en la matriz
co2 = co2 + 1
End If
Next c
'Eliminamos los subtotales
Range("D1").RemoveSubtotal
'Agregamos los rangos con la informacion recabada
For co1 = 0 To UBound(mRangos, 2)
ActiveWorkbook.Names.Add Name:=mRangos(0, co1), _
RefersTo:=mRangos(1, co1)
Next co1
Application.ScreenUpdating = True
'Liberamos la memoria
Erase mRangos
Set rVisibles = Nothing
End Sub
Experto
Hola...

Por definir, ¿te refieres a establecer una variable con dichos rangos?, ¿Qué tipos de valores tienes en esa columna?, ¿Empieza en la fila 1?, ¿Siempre son 8 o 10? ¿O pueden ser de 8 a 10 valores?, si me aclaras un poco, con gusto te ayudare, saludos...


Mauricio
Usuario
Muchas gracias por tu interés.
Para alguien que ya ha dado consejos tan elocuentes no creo que sea muy complicado; se trata de lo siguiente:
Dos veces por semana me envían un listado sobre el que tengo que hacer un montón de operaciones: 10 agentes comerciales (columna D) informan de las ventas de sus clientes.
El listado tiene 6 columnas (A, B, C, D,...) y como 8000 líneas (1,2,3,...,) La columna D determina los rangos. Según eso, hay entre 8 y 10 rangos distintos y las líneas que contiene cada rango pueden ser entre 100 y 2000
Hasta ahora lo que hago manualmente es lo siguiente:
1º Ordeno la tabla por la columna D.
2º Selecciono manualmente las lineas que tienen el mismo valor en la columna D.
3º Le doy un nombre
4ºVoy al siguiente...
5º y así ... hasta el 9º o 10º... entre las 6000 - 8000 líneas que suelen tener.
En definitiva se trata de crear un rango a partir del valor de las celdas de una columna.
El nombre del rango esta asociado a funciones de búsqueda, etc...
En fin, espero haberme expresado con tanta extensión como claridad.
Gracias, de nuevo por tu ayuda.
Recibe un cordial saludo,

Lucas

P.S. El 31 de mayo ya tuvimos ocasión de reconocer tus méritos y decíamos:
Hemos hecho las primeras pruebas y... funciona! (...) Muchísimas gracias, Maestro Experto, es Vd. un monstruo. Las cinco estrellitas se te quedan cortas, Faraón.
.