Fórmula que supera el nivel máximo de anidamiento

Tengo una fórmula que he creado el cual realiza una búsqueda con VLOOKUP condicionada por fórmula IF pero lamentablemente me indica que supero el máximo de niveles el cual no considero que supere los 256 niveles de anidamiento que permite excel, dejo aquí la fórmula:

=iferror(if(d35=vlookup(d35;[payroll.xlsm]setup!$h$5:$h$13;1;false);if(c35=vlookup(c35;[payroll.xlsm]setup!$i$5:$i$7;1;false);if(and(round(i35;1)>=0;round(i35;1)<=0,5);vlookup(d35&c35;[payroll.xlsm]setup!$j$11:$l$13;3;false)+vlookup(d35&c35;[payroll.xlsm]setup!$j$11:$k$13;2;false);if(and(round(i35;1)>=0,51;round(i35;1)<=1);vlookup(d35&c35;[payroll.xlsm]setup!$j$11:$m$13;4;false)+vlookup(d35&c35;[payroll.xlsm]setup!$j$11:$k$13;2;false);if(round(i35;1)>1;i35*vlookup(d35&c35;[payroll.xlsm]setup!$j$11:$n$13;5;false)+vlookup(d35&c35;[payroll.xlsm]setup!$j$11:$k$13;2;false))))));if(d35=vlookup(d35;[payroll.xlsm]setup!$h$5:$h$13;1;false);if(c35=vlookup(c35;[payroll.xlsm]setup!$i$5:$i$7;1;false);if(and(round(i35;1)>=0;round(i35;1)<=3,4);vlookup(d35&c35;[payroll.xlsm]setup!$j$5:$k$10;2;false);if(and(round(i35;1)>=3,5;round(i35;1)<=6,4);vlookup(d35&c35;[payroll.xlsm]setup!$j$5:$l$10;3;false);if(and(round(i35;1)>=6,5;round(i35;1)<=10,4);vlookup(d35&c35;[payroll.xlsm]setup!$j$5:$m$10;4;false);if(round(i35;1)>=10,5;(i35-10,4)*vlookup(d35&c35;[payroll.xlsm]setup!$j$5:$n$10;5;false)+vlookup(d35&c35;[payroll.xlsm]setup!$j$5:$m$10;4;false))))))))

¿Mi pregunta existe la forma de crear un código vba que haga lo que hace esta fórmula o se puede mejorar la fórmula de forma que funcione en una celda? Esto porque la fórmula estará insertada en un código VBA el cual ya lo tengo escrito... Saludos y en espera de sus ayuda!

1 Respuesta

Respuesta
1

[Hola

En realidad el nivel máximo de anidaciones es de 64, no he contado pero quizá ya lo pasaste.

Es bastante complicado darte una alternativa dado el nivel de dificultad para entender esa fórmula; quizá si haces una tabla de valores y rangos explicando, sea más fácil ayudarte.

Abraham Valencia

Listo abraham ya lo resolví! jajaja gracias de todas maneras!

Jejeje, que bueno. Saludos]

Abraham Valencia

Abraham que tal amigo una pregunta en base al mismo código del que ya habíamos hablado que es el siguiente

For i = 1 To unicos.Count
Sheets("JOB").Range("S1").Offset(i - 1, 0).Value = unicos(i)
dDate = Format(unicos(i), "mm/dd/yyyy")
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:="=" & dDate
Sheets("JOB").Range("V1").Offset(i - 1, 0).Value = Application.WorksheetFunction.Subtotal(5, Range("O2" & ":O" & uf))
Sheets("JOB").Range("W1").Offset(i - 1, 0).Value = Application.WorksheetFunction.Subtotal(4, Range("P2" & ":P" & uf))
Sheets("JOB").Range("Y1").Offset(i - 1, 0).Value = Application.WorksheetFunction.Subtotal(9, Range("Q2" & ":Q" & uf))
Selection.AutoFilter

Tengo dos preguntas:

1) si en esta linea Sheets("JOB").Range("Y1").Offset(i - 1, 0).Value = Application.WorksheetFunction.Subtotal(9, Range("Q2" & ":Q" & uf)) lo que quiero es que cuente las celdas con datos como debo modificarla? se que reemplazo el Subtotal por CountA pero no me funciona, (supongo que es por el 9 WorksheetFunction.Subtotal(9, Range("Q2" & ":Q" & uf)).

2) El argumento que esta en la intentar de ese 9, supongo define lo que hará, ¿pero existe una tabla donde indique que numero colocar según la función que uno quiera aplicar?

¡Gracias! 

Excelente Abraham!!! Agradecido!!!

abraham amigo que tal.... una pregunta...

Tengo el siguiente codigo

Sub multiple()

Dim i As Integer
Dim Varios As Collection
Set Varios = New Collection
Dim TypePaym As Object
Set TypePaym = Sheets("Setup").range("D22")
Let uf = Sheets("Setup").range("G" & Rows.Count).End(xlUp).Row
For Each celda In range("G22:G" & uf)
On Error Resume Next
Varios.Add celda.Value, CStr(celda.Value)
On Error GoTo 0
Next celda
For i = 1 To Varios.Count
Sheets("Setup").range("A24").Value = Varios(i)
Application.Run TypePaym
Next i

End Sub

Todo me funciona bien hasta la línea del application run ya que en esa línea necesito que me llame el procedimiento que se encuentra en la variable o en la celda D22 el cual cambiara según la necesidad!

Pero me arroja el error 1004

[Hola

Tu variable "TypePaym" está declarada como objeto y "Run" lo que busca es una cadena de texto (String).

Abraham Valencia

abraham que tal bro... una pregunta tienes un correo para enviarte un momento el archivo y veas algo que no consigo la falla?

Fíjate tengo este código en un formulario donde después de seleccionar los empleados que son varios de un listbox los coloca en la celda G20 según la cantidad haya sido seleccionado ahora tengo este código en un commandbutton

Private Sub CommandButton5_Click()
If CheckBox1 = False Then
Me.Hide
Call TypePross
Else
Me.Hide
Call multiple
End If
End Sub

Que es quien le indica que si el checkbox de multiempleados esta activado entonces llame el modulo múltiple que es el siguiente

Sub multiple()
Dim i As Integer
Dim Varios As Collection
Set Varios = New Collection
Dim TypePaym As String
TypePaym = Sheets("Setup").range("D22").Value
Let uF = Sheets("Setup").range("G" & Rows.Count).End(xlUp).Row
For Each celda In range("G20:G" & uF)
On Error Resume Next
Varios.Add celda.Value, CStr(celda.Value)
On Error GoTo 0
Next celda
For i = 1 To Varios.Count
Sheets("Setup").range("A22") = Varios(i)
Application.Run TypePaym
Next i
A = MsgBox("Process", vbOKOnly)
End Sub

¿Qué hace este? Lee los nombres de los empleados que están a partir de la celda G20 y los guarda en una colección luego coloca el primer nombre en la celda A22 y ejecuta el procedimiento TypePaym termino de hacer ese procedimiento vuelve a colocar el segundo nombre de la colección en la A22 y repite todos los pasos hasta que el bucle recorre toda la colección y culmina con el Msgbox "Process"...

PERO resulta que si pruebas el procedimiento múltiple directo hace la función pero cuando lo haces desde el principio no coloca cada uno de los objetos de la colección en la celda A22 por lo que el procedimiento TypePaym falla

[Hola

Coloca tu archivo en algún "Drive" (OneDrive, Google Drive, DropBox, etc.) y envía por aquí el enlace de descarga.

Abraham Valencia

https://1drv.ms/u/s!AnjRTSkVrt87iEPyy-RS14NTSR76?e=ZEDz0y 

este es el link del archivo con el macro que se llama payroll y los otros archivos los utiliza en su proceso 

el archivo que se llama base datos ppal es el que pide que selecciones al iniciar el macro que el botón se llama PAYROLL 

y mi problema radica ahora en que no me esta haciendo el bucle del macro que se llama múltiple (realmente si lo ejecutas directamente el bucle si cumple su función pero cuando lo haces desde el botón PAYROLL de la hoja PAYROLL los nombres que guarda en su colección desde la celda G20 no los coloca en la celda A22 para que el resto del código termine de funcionar) 

de todas maneras si le ves algún otro detalle a los macros que se pueda mejorar házmelo saber a ver si le doy la vuelta a ver como lo mejoro...

PD el tipo de PAYMENT con que estaba haciendo las pruebas con Porcent que es el que mas completo esta!

agradecido de ante mano

Pudiste verificar lo del error que te digo Abraham?

Se me pasó el mensaje ¿resolviste tu dilema?

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas