¿Como utilizar variables en una macro de excel?

Como dice la pregunta tengo problemas para utilizar variables en una macro de excel, especificamente en una formula de la macro:

ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-12],R2C12,R15C12)"
Range("N2").Select
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-12],R2C12:R15C12)"
Range("N2").Select
Selection.Copy
Range("O2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-12],R2C12:R15C12,R2C13:R15C13)"
Range("O2").Select
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-13],R2C12:R15C12,R2C13:R15C13)"
Range("P2").Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-3]"
Range("N2:P2").Select
Selection.AutoFill Destination:=Range("N2:P15"), Type:=xlFillDefault
Range("N2:P15").Select
Range("N2").Select

Esto es lo que grabe en la macro, en excel lo que hace es:

(Celda N2) =buscar(B2, L2:L12), (Celda O2) =buscar(B2, L2:L12, M2:M12)

despues (Celda P2)=O2-M2

Despues copia las celdas N2, O2 y P2 en las casillas N2:P15

Por ultimo selecciona la celda N2.

Lo que yo quiero hacer es utilizar variables en lugar de celdas fijas pero no logro incorporarlas a la macro ya tengo algo avanzado pero lo hace mal:

Private Sub CommandButton1_Click()
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim x As Integer
Dim y As Integer
Dim saldo As Integer
Dim dif As Integer

b = 5
c = 2
d = 2

Do While Hoja9.Cells(d, 1) <> ""
d = d + 1
Loop

Range("a1").Select

For a = 0 To 30
If Hoja9.Cells(c, b) = 0 Then
Hoja9.Cells(c, b).Select
Else:
b = b + 1
End If
Next a

x = b - 2
y = b - 1
saldo = b + 1
dif = saldo + 1
xneg = (x) * (-1)
yneg = y * -1
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[" & xneg & "],R &" & c & "& C &" & x & ",R &" & d & "& C &" & x & ")"
Hoja9.Cells(c, x).Select
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[" & yneg & "],R &" & c & "& C &" & x & ":R &" & d & "& C &" & y & ")"
Hoja9.Cells(c, x).Select
Selection.Copy
Hoja9.Cells(c, saldo).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[" & b & "],R &" & c & "& C &" & x & ":R &" & d & "& C &" & x & ",R &" & c & "& C &" & y & ":R &" & d & "& C &" & y & ")"
Hoja9.Cells(c, saldo).Select
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[" & saldo & "],R &" & c & "& C &" & x & ":R &" & d & "& C &" & x & ",R &" & c & "& C &" & y & ":R &" & d & "& C &" & y & ")"
Hoja9.Cells(c, dif).Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-3]"
ActiveSheet.Range("N2:P2").Select
Selection.AutoFill Destination:=Range("N2:P15"), Type:=xlFillDefault
ActiveSheet.Range("N2:P15").Select
ActiveSheet.Range("N2").Select
End Sub

Corriendo esto se detiene en la segunda linea y me marca error 1004 y en la hoja de excel pone en la casilla una formula:"=buscar(B2, 2:2 &2& N:N &12, 2:2 &16& N:N &12).

Mi manera de programar es primitiva y por eso tengo este problema si pudueran ayudarme a solucionarlo estaria muy agradecido. Si alguien se interesa y necesita el archivo para porder enter mejor el asunto, paseme su correo y lo envio.

Respuesta
-1

En este ejemplo se utiliza BuscarV

http://www.programarexcel.com/2014/10/como-utilizar-worksheetfunction-vlookup.html 

y acá hay cientos de ejemplos que te ayudarán.

2 respuestas más de otros expertos

Respuesta
1

H o l a:

Y qué necesitas poner en la celda, la fórmula o el resultado de la fórmula, porque si vas a utilizar una macro, entonces que la macro obtenga el resultado y que de una vez te lo ponga en la celda.

Envíame tu archivo y me explicas con colores y comentarios lo que necesitas.

'

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Julio Castro” y el título de esta pregunta.

'

S a l u d o s . D a n t e   A m o r

Gracias ya mande el correo, ahí y también mencionó que en realidad lo que necesitó es saber como mezclar las variables que pongo en el botón con la macro. El resultado esta bien así como lo que arroja la macro por si sola, pero no puedo hacer que en lugar de utilizar celdas predeterminadas se puedan utilizar las variables.

 H o l a:

Vamos por partes para que te sea más claro.

Primero, vamos a simplificar la macro original.

Lo que hice fue lo siguiente:

'tienes esto:
Range("N2").Select
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-12],R2C12:R15C12)"
'
'lo reemplacé por esto
Range("N2").FormulaR1C1 = "=LOOKUP(RC[-12],R2C12:R15C12)"

'

'Del siguiente código:

'lo siguiente:
Range("N2").Select
Selection.Copy
Range("O2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-12],R2C12:R15C12,R2C13:R15C13)"
Range("O2").Select
ActiveCell.FormulaR1C1 = "=LOOKUP(RC[-13],R2C12:R15C12,R2C13:R15C13)"
'
'
'Por esto:
Range("O2").FormulaR1C1 = "=LOOKUP(RC[-13],R2C12:R15C12,R2C13:R15C13)"

'

Solamente quité algunas líneas que la grabadora de macros va poniendo pero que no son necesarias, el resultado es este:

Sub buscar()
'Act.Por.Dante Amor
    Range("N2").FormulaR1C1 = "=LOOKUP(RC[-12],R2C12:R15C12)"
    Range("O2").FormulaR1C1 = "=LOOKUP(RC[-13],R2C12:R15C12,R2C13:R15C13)"
    Range("P2").FormulaR1C1 = "=RC[-1]-RC[-3]"
    Range("N2:P2").AutoFill Destination:=Range("N2:P15"), Type:=xlFillDefault
End Sub

El siguiente paso es cambiar la nomenclatura FormulaR1C1 (RowColumn), por celdas:

Sub buscar2()
'Por.Dante Amor
    Range("N2") = "=LOOKUP(B2,$L$2:$L$15)"
    Range("O2") = "=LOOKUP(B2,$L$2:$L$15,$M$2:$M$15)"
    Range("P2") = "=O2-M2"
    Range("N2:P2").AutoFill Destination:=Range("N2:P15"), Type:=xlFillDefault
End Sub

Te explico el significado de la nomenclatura RC en esta instrucción:

Range("N2").FormulaR1C1 = "=LOOKUP(RC[-12]

LOOKUP(RC[-12]: Lo anterior significa que en la misma fila, es decir, si estás en N2, entonces en la R2 (fila 2), en la columna -12, la columna N es la número 14, 14 -12 = columna 2, entonces la dirección de R2C2 (Fila2Columna2) = celda B2. Por eso queda:

Range("N2") = "=LOOKUP(B2


Entonces, es más práctico utilizar las variables en esta nomenclatura

Range("N2") = "=LOOKUP(B2 


Para utilizar variables, podríamos hacer un ciclo desde la fila 2 hasta la última fila con datos de la columna A y reemplazar en las fórmulas el número 2 por la variable i y el número 15 por la variaba ufila:

Sub buscar3()
'Por.Dante Amor
    ufila = Range("A" & Rows.Count).End(xlUp).Row 'última fila con datos de la columna A
    For i = 2 To ufila
        Range("N" & i) = "=LOOKUP(B" & i & ",$L$2:$L$" & ufila & ")"
        Range("O" & i) = "=LOOKUP(B" & i & ",$L$2:$L$" & ufila & ",$M$2:$M$" & ufila & ")"
        Range("P" & i) = "=O" & i & "-M" & i
    Next
End Sub

Nota: el número 2 de ",$L$2:$L$" y ",$M$2:$M$", no debe cambiarse, ya que es donde inicia el rango.

Entonces en esta instrucción:

Range("N2")

Estoy cambiando el 2 por la variable i:

Range("N" & i)

'

En esta instrucción:

"=LOOKUP(B2,$L$2:$L$15)"

Estoy cambiando el 2 por la variable i: 

"=LOOKUP(B" & i & ",$L$2:$L$" & ufila & ")"

Primero, estoy cerrando las comillas: "=LOOKUP(B"  & pongo la variable & y nuevamente abro comillas para continuar con el texto de la fórmula: ",$L$2:$L$


Si no quieres hacerlo con un ciclo, lo ponemos con autofill.

Sub buscar4()
'Por.Dante Amor
    ufila = Range("A" & Rows.Count).End(xlUp).Row
    Range("N2") = "=LOOKUP(B2,$L$2:$L$" & ufila & ")"
    Range("O2") = "=LOOKUP(B2,$L$2:$L$" & ufila & ",$M$2:$M$" & ufila & ")"
    Range("P2") = "=O2-M2"
    Range("N2:P2").AutoFill Destination:=Range("N2:P" & ufila), Type:=xlFillDefault
End Sub

Avísame cualquier duda sobre cómo utilizar las variables en las fórmulas.

Ya hice los cambios en la macro y me sirvio bastante para entender como funciona y para eliminar las lines de codigo basura, por otro lado en realidad sigo con el mismo problema porque en tu ejemplo me dice como hacer que las operaciones se hagan en una ubicacion de filas y columnas ya determinadas y utilizando las variables para moverse entre las celdas de esas filas y columnas, el archivo que te envie esta en constante cambio y necesito que esos cambios donde se agregan mas clientes y tambien debo agregar columnas, aqui pongo como quedo la macro con los cambios que me recomendaste:

 Range("N2") = "=LOOKUP(B2,$L$2:$L$15)"
Range("O2") = "=LOOKUP(B2,$L$2:$L$15,$M$2:$M$15)"
Range("P2") = "=O2-M2"
Range("N2:P2").Select
Range("N2:P2").AutoFill Destination:=Range("N2:P15"), Type:=xlFillDefault
Range("N2").Select

Mi duda es, como hago para que en lugar de poner Range("N2")pueda utilizar variables en lugar de indicar la columna N fija,para que cuando el archivo cambie la macro pueda acoplarse a los cambios.

SSS a lo mejor no me explico bien en lo que ocupo. Y es que quiero incorporar en esta macro las variables del programita precisamente por esos cambios de informacion en el archivo.

Muchas gracias Dante Amor 

Pero si ya estás poniendo la fórmula e insertas columnas, automáticamente la fórmula se adapta a las columnas insertadas.

También por eso te pregunté, si necesitas el resultado, lo más práctico es que la macro te ponga el resultado y no estar RE-construyendo la fórmula cada que ejecutas la macro.

Te anexo el buscar5, busca la última columna con el encabezado: "SALDO PENDIENTE", entonces cuando la macro encuentre esa columna, en las siguientes 3 columnas te pondrá las fórmulas.

Sub buscar5()
'Por.Dante Amor
    Set b = Rows(1).Find("SALDO PENDIENTE", lookat:=xlWhole)
    If Not b Is Nothing Then
        ucol = b.Column + 1                             'siguiente columna
        ufila = Range("A" & Rows.Count).End(xlUp).Row   'última fila con datos
        Cells(2, ucol) = "=LOOKUP(RC2,R2C" & ucol - 2 & ":R" & ufila & "C" & ucol - 2 & ")"
        Cells(2, ucol + 1) = "=LOOKUP(RC2,R2C" & ucol - 2 & ":R" & ufila & "C" & ucol - 2 & ",R2C" & ucol - 1 & ":R" & ufila & "C" & ucol - 1 & ")"
        Cells(2, ucol + 2) = "=RC" & ucol + 1 & "-RC" & ucol - 1 & ""
        Range(Cells(2, ucol), Cells(2, ucol + 2)).AutoFill Destination:=Range(Cells(2, ucol), Cells(ufila, ucol + 2)), Type:=xlFillDefault
    End If
End Sub

S a l u d o s

Recuerda cambiar la valoración a mi respuesta.

Respuesta
1

Leyendo tu código me llamó la atención tantos & & & 

Así que solo te dejo un ejemplo de cómo se arman las fórmulas con variables: la parte fija entre comillas dobles y la parte variable entre &

Por ej en la primera:

ActiveCell.FormulaR1C1 = "=LOOKUP(RC[" & xneg & "],R " & c &  "C" & x & ",R" & d & "C" & x & ")"

Es decir que dentro de las comillas, en la parte en negrita no va el signo &

Espero puedas armar con esta explicación tus fórmulas.

Gracias por tu atención, intente de la forma que me dices pero me marcar error 1004 :S, y de la forma en que lo tengo si corre, pero sale una formula que no es correcta en lugar de aparecer =buscar(B2,L2:L15), lo que aparece es esto =buscar(B2,2:2 &2& N:N &12,2:2 &16& N:N &12)  :/

Si corre pero te queda una fórmula incoherente... entonces algo no está bien aunque no te aparezca mensaje de error.

Quizás no estás siguiendo la regla que responde a tu consulta: ¿Cómo utilizar variables en VBA?: Respuesta: la parte fija va entre comillas y la variable entre & &.

De todos modos ya valoraste a dan así que estimo el te está haciendo el seguimiento y ya encontrará el defecto en la escritura de la fórmula. Sino enviame la hoja donde tenés la tabla y la fórmula. Mis correos aparecen en el encabezado de mis páginas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas