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
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.
- Anónimoahora mismo
2 respuestas más de otros expertos
Respuesta de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
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
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