Macro que ejecute un procedimiento si se cumple condición

Tengo este código

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

Respuesta
1

Te había respondido la anterior y la borraste, no me dio tiempo. Te había dicho que por que almacenas el procedimiento en una celda. El nombre de los procedimientos no son variables.

Usar el método Run es una mala practica, y su principal desventaja es que no puedes pasar variables.

Si tienes varios procedimientos que se ejecutan basándose en alguna condición, lo correcto es usar un IF o un SELECT CASE y llamar al procedimiento correspondiente con "Call"

Evita usar Run.

On Error Resume Next y GoTo tambien son una mala practica y deben evitarse a toda costa. GoTo solo debe usarse para ir a un Error Handler después de un Exit Sub.

Ah ok ok entiendo Andy fíjate te explico mejor

Tengo 5 procedimientos horas, día, distancia, porcentaje, plana, eso se elije en un formulario igualmente el empleado al que le voy a aplicar ese procedimiento, que pasa, es posible que quiera aplicarle alguno de esos procedimientos a varios empleados el cual lo trato con esta parte del código guardándolos en una colección:

ub múltiple()
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

Ahora lo siguiente es aplicarle el siguiente código a cada objeto de esa colección:

For i = 1 To Varios.Count
Sheets("Setup").range("A24").Value = Varios(i)
Application.Run TypePaym
Next i

¿Qué pasa porque debo colocar el nombre de procedimiento en la celda D22? ¿Por qué el tipo de procedimiento que sera elegido para aplicar es seleccionado desde un listbox el cual esta vinculado a esa celda... no se si me explico?

PD: el tipo de método para llamar el procedimiento esta con el run porque fue un ejemplo que vi en san google es de hacer notar que la forma en que llame al procedimiento no me importa cual sea mientras funcione!

Si entiendo perfectamente lo que quieres hacer, y se que la "ventaja" de Run es que puedes almacenar el nombre del procedimiento en una variable String, pero esa no es la manera ideal de hacerlo. Talvez tu problema es que la variable TypePaym la pones como Objeto cuando debería ser un String y usar la propiedad Value o Value2

Prueba cambiando:

Dim TypePaym As Object
Set TypePaym = Sheets("Setup").range("D22")

Por:

Dim TypePaym As String: TypePaym = Sheets("Setup").Range("D22").Value

Andy

Ok lo acabo de intentar digamos que soluciono esa parte pero ahora me indica que no puede arrancar la macro xxxx, que la macro puede que no este disponible en este libro o este deshabilitada...

Que fue el mismo error que me dio en otro momento haciéndolo con el método call

Pues debes asegurarte que el nombre de la macro esta escrita al pie de la letra, exactamente, con mayúsculas y minúsculas donde deben estar.

Si exactamente andy tal cual era ese el problema no estaban igual Mil gracias andy!!!!

Me alegra que te haya servido. No olvides valorar la respuesta y cerrar la pregunta :)

Andy otra pregunta simple estimado, del mismo código que hablábamos, resulta que no me termina de correr porque cuando guarda en colección, ¿la primera variable que guarda es un espacio en blanco y pues en lo que comienza a procesar y hacer filtrados como no existe me da error que puedo hacer en ese caso?

¿Dónde te genera el error? Supongo que la raíz esta aquí:

On Error Resume Next
Varios.Add celda.Value, CStr(celda.Value)
On Error GoTo 0

celda.Value esta vacía?

Olvidalo andy ya leí un poquito el código y detalle el error otra cosa que tengo duda y que me estoy dando cuenta ahorita es que tengo en el formulario dos DTPicker1 y DTPicker1_Change start y end respectivamente vinculados a celca b22 y c22 respectivamente y estoy notando que no coloca la fecha en las celdas al momento de seleccionar la celda si no después que le doy click a aceptar del formulario o cierro el formulario! Es de acotar que la vinculación a celda las tengo en el evento change de cada DTPicker, como puedo hacer para que la coloque de inmediato de seleccionar la fecha en el DTPicker1 y DTPicker2.

Lo tengo vinculado de la siguiente manera.

Private Sub DTPicker1_click()
ThisWorkbook.Sheets("Setup").Cells(22, 2) = DTPicker1
End Sub

¿Te refieres al control MonthView? ¿Qué versión de Excel usas? Eso ya esta descontinuado, yo lo usaba en Excel 2003. Nunca mas lo utilice, lo fui a buscar ahora en mi Excel 2019 y ya no esta, leí que ya no lo incluyen creo que desde la 2013. Buscare si hay algún DLL que pueda agregar para ayudarte, si no no podre. Por cierto, te recomiendo que abras una pregunta nueva al respecto.

No no yo utilizo otro nuevo ya! Que es DTPicker y se instala si no lo tienes con este archivo Mscomct2.ocx, buscalo e instálalo!

Ya, ¿probaste en el evento Change? A mi me funciona.

Andy

Efectivamente así lo tengo pero me los coloca una vez que cierro el formulario, mientras mantenga el formulario abierto no coloca las fechas en las celdas por lo que el resto del código falla por no tener esa información que es esencial para obtener el reporte que me genera el código...

Cabe destacar que no le coloco el .Value porque ya mi código lo hice completo para que funcionara con el numero completo y no en formato de fecha el cual es lo que obtendría colocando el .Value

Deberás fijarte en los otros códigos del formulario, si hay algún Application.ScreenUptading = False que no hayas puesto a True. O cualquier otro tipo de evento que hayas apagado durante la ejecución del formulario.

Si quieres me compartes el libro para revisarlo, o si el código de todo el modulo no es tan largo puedes pegarlo acá, aunque preferiría revisar el libro.

Vale dime a donde te lo paso?

Normalmente la gente lo sube a un Drive (como Google Drive) y lo comparte. Si esa opción no te sirve envíalo a mi email: [email protected]

¿Andy buen día recibiste el correo?

Te acabo de responder :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas