Nombrar rango

Hola.
Tengo una macro que hice, pero no encuentro como asignar un nombre de rango a la funcion (mi problema esta en elrango1) ActiveCell.FormulaR1C1 = _
"=IF(RC[-2]="""","""",IF(COUNTIF(elrango1,RC[-2])=0,""NUEVO"",""REPETIDO""))"
. Te explico, yo creo un rengo mRMuestreo1=rango(x) y mRmuestreo12=rango(y). La función if que te muestro solicita el rango en el formato COUNTIF(R8C[-1]:R16C[-1], R[-1]C[-2]), lo que yo quiero saber, es como asignar el rango R8C[-1]:R16C[-1] por medio de variables y como asignarlas. Espero puedas ayudarme. Gracias

3 respuestas

Respuesta
1
Trabajar con la notación R1C1 siempre se me hace un poco más complicado, para asignar nombres a rangos de celdas puedes utilizar este ejemplo:
ActiveWorkbook.Names.Add Name:="cesar", RefersToR1C1:="=Hoja1!R7C4:R12C6"
Luego te puedes referir a ese rango como:
Range("cesar"). Cells. Count o lo que necesites.
Si tienes alguna duda adicional no dudes en escribir, de lo contrario por favor no olvides finalizar la pregunta valorando la respuesta teniendo en cuenta la oportunidad, calidad y efectividad de la misma.
Respuesta
1
Convengamos que ésta es una situación que reviste algún grado de complejidad.
Para resolverla conviene tener en cuenta dos consideraciones:
a.- En el esquema de referencias de rangos R1C1
Cuando dices, por ejemplo:
R8C[-1]
El "8" indica el número de fila específico, mientras que lo que está entre corchetes indica la cantidad de filas/columnas desviadas desde la celda actual.
Así C[-1] indica una columna a la izquierda de la columna actual.
Vale decir que la primera complicación con la que te encontrarás es que la referencia a una celda en VBA puede ser hecha de manera explícita o relativa a la posición actual.
b.- La referencia a un rango en VBA puede hacerse indicando su dirección especifica, como en:
Range("A1:B5") o a través de la indicación de la primera celda superior izquierda y la última celda inferior derecha.
En el ejemplo sería:
Range("A1","B5")
Usaremos ésta última forma para resolver tu problema.
Se tratará, entonces, de indicarle a VBA cuales son las coordenadas de la celda superior izquierda y de la inferior derecha, previendo la posibilidad de que tales coordenadas se indiquen específicamente o por su posición relativa a la celda activa.
La siguiente rutina se ocupa de tal tarea:
Sub RefXvar()
'===== Area de ingreso de variables ================
'Referencia Desviada: (desde la celda Activa)
D_Filaini = 0
D_ColIni = -1
D_FilaFin = 0
D_ColFin = -1
'Referencia Fija
F_FilaIni = 8
F_ColIni = 0
F_FilaFin = 16
F_ColFin = 0
'tipo de referencia Absoluta (con $) en rango final:
FilaAbs = True
ColAbs = False
'===================================================
'Macro define números de fila/columna a utilizar:
On Error GoTo MalRef
FilaIni = IIf(F_FilaIni, F_FilaIni, ActiveCell.Offset(D_Filaini).Row)
ColIni = IIf(F_ColIni, F_ColIni, ActiveCell.Offset(0, D_ColIni).Column)
FilaFin = IIf(F_FilaFin, F_FilaFin, ActiveCell.Offset(D_FilaFin).Row)
ColFin = IIf(F_ColFin, F_ColFin, ActiveCell.Offset(0, D_ColFin).Column)
'Macro arma la dirección del rango
ElRango = Range(Cells(FilaIni, ColIni), Cells(FilaFin, ColFin)).Address(FilaAbs, ColAbs)
On Error GoTo 0
'Macro utiliza el dato anterior para la fórmula
ActiveCell.Formula = "=SUM(" & ElRango & ")"
'Coloca, abajo, la fórmula con el método anterior
'al solo efecto de control (despues puedes borrar esta instrucción)
ActiveCell.Offset(1).FormulaR1C1 = "=SUM(R8C[-1]:R16C[-1])"
Exit Sub
MalRef:
If Err.Number <> 0 Then
MsgBox "Alguna de las variables en esta macro es erronea", vbCritical, "Error en dirección"
On Error GoTo 0
Err.Number = 0
End If
End Sub
Como verás esta macro intenta contemplar todas las alternativas posibles.
Así podrás indicarle las coordenadas de las celdas extremas, ya sea por referencia directa a la fila columna (variables que empiezan con F_) o por posicioón relativa a la celda actual (variables que empiezan con D_).
Adicionalmente, podrás decidir si el rango en la fórmula final tiene que expresarse con referencias absolutas o relativas, vale decir: si aparecerá o no el signo $ en filas y/o columnas (variables: FilaAbs y ColAbs).
Por la secuencia lógica de esta macro, si una variable está en cero, tomará la coordenada de su variable complementaria.
Por ejemplo si la variable D_Filaini (referencia relativa) es igual a 0, tomará como fila de la celda superior izquierda la que se indique en la variable F_Filaini (referencia directa).
Del mismo modo, si la situación fuera al revés tomará la fila relativa a la fila actual según el valor de la primera variable.
¿Y si ambas son cero?
En tal caso tomará una referencia desviada igual a 0 lo que significa que es la misma fila/columna de la celda actual.
De esta manera, podrás usar las variables libremente para definir el rango a utilizar en tu fórmula.
Finalmente, la macro cuenta con una rutina de protección en caso de que las coordenadas arrojaran una dirección imposible.
Bueno, Varela, espero haber sido suficientemente claro y que la solución satisfaga tu alto nivel de exigencia. (nunca más de 4 ;)
Un abrazo!
Fernando
Respuesta
1
Observa como la propiedad FormulaR1C1 te solicita la fórmula en formato texto (String), cualquier variable que necesites, la puedes "transformar" a texto con la función Format y después "concatenarla" dentro de la función, te doy un sencillo ejemplo y tu lo complementas, saludos...
Public Sub Formula()
Dim Col As Integer
Col = -1
ActiveCell.FormulaR1C1 = _
"=IF(RC[-2]="""","""",IF(COUNTIF(R8C[" & Format(Col) & "]:R16C[" & Format(Col) & "],R[-1]C[-2])=0,""NUEVO"",""REPETIDO""))"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas