Jerarquización de las macros

Resuelto
padbollevrai Mensajes publicados 58 Estado Miembro -  
padbollevrai Mensajes publicados 58 Estado Miembro -
Hola,

Esto es lo que debo lograr.
Tengo un programa que recupera los valores de una hoja, los procesa y los transfiere a una columna de otra hoja.

Es muy bien, pero ¡tengo que completar 12 columnas de este modo!

Básicamente, son 6 columnas visualizadas en 2 (valor mínimo y valor Máximo).

PERO las columnas Min también pueden ser de tipo "Count", o de tipo "Time", en cuyo caso no hay columnas Máx junto a ellas.

Para resumir: Las columnas A, C, E, G, I, K pueden ser Min, Count o Time,
las columnas B, D, F, G, J, L pueden ser Max o Nada.

Mi programación debe adaptarse a cada tipo de columna, por eso pensé en una macro maestra que comandaría macros esclavas según el nombre de cada columna, de la forma (ojo, es solo un borrador):


Sub MAIN_FILLING()

If A3 es "Count", entonces llamar Filling_Count_A, Sino If A3 es "Time", entonces S llamar Filling_Time_A, Sino Llamar Filling_Min_A

If B3 es "Max", entonces llamar Filling_Max_B, Sino ""

If C3 es "Count", entonces llamar Filling_Count_C, Sino si C3 es "Time", entonces Llamar Filling_Time_C, Sino Llamar Filling_Min_C

If D3 es "Max", entonces llamar Filling_Max_D, Sino ""

If E3 es "Count", entonces llamar Filling_Count_E, Sino si E3 es "Time", entonces Llamar Filling_Time_E, Sino Llamar Filling_Min_E

If F3 es "Max", entonces llamar Filling_Max_F, Sino ""

If G3 es "Count", entonces llamar Filling_Count_G, Sino si G3 es "Time", entonces Llamar Filling_Time_G, Sino Llamar Filling_Min_G

If H3 es "Max", entonces llamar Filling_Max_H, Sino ""

If I3 es "Count", entonces llamar Filling_Count_I, Sino si I3 es "Time", entonces Llamar Filling_Time_I, Sino Llamar Filling_Min_I

If J3 es "Max", entonces llamar Filling_Max_J, Sino ""

If K3 es "Count", entonces llamar Filling_Count_K, Sino si K3 es "Time", entonces Llamar Filling_Time_K, Sino Llamar Filling_Min_K

If L3 es "Max", entonces llamar Filling_Max_L, Sino ""

End Sub


Eso funcionaría, pero sería un verdadero lío! En efecto, 24 programas diferentes cuando solo hay tres tareas a realizar...

Lo que me gustaría es tener un programa para rellenar los Count, uno para los Min, uno para los Max y otro para los Time, comandados por la macro maestra, y que se adaptarían para escribir la información en las columnas correctas, por supuesto.

¿Es posible, y cómo se hace?

¡Gracias!

Configuración: Windows Vista / Chrome 34.0.1847.131

4 respuestas

  1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
     
    Bonjour,

    So you need a function (or a procedure) with the column as a parameter. Like this:

    Sub Main() If [A3] = "count" Then Call Filling_Count(1) If [A3] = "time" Then Call Filling_Time(1) If [B3] = "count" Then Call Filling_Count(2) If [B3] = "time" Then Call Filling_Time(2) 'etc... End Sub Sub Filling_Count(NumCol As Integer) With columns(NumCol) 'blabla End With End Sub Sub Filling_Time(NumCol As Integer) With columns(NumCol) 'blabla End With End Sub


    You can even make a loop in your main with a select case etc...

    Example:
    For Col = 1 To 12 Select Case Cells(3, Col) Case "count" Call Filling_Count(Col) Case "min" Call Filling_Min(Col) Case "max" Call Filling_Max(Col) Case "Time" Call Filling_Time(Col) Case Else MsgBox "Erreur Fatale" End Select Next


    --
    Cordialement,
    Franck
    0
  2. padbollevrai Mensajes publicados 58 Estado Miembro 1
     
    ¡Vaya! ¡Excelente, muchas gracias!

    Ahora, en mis sub-macros, ¿cómo reemplazar la letra de la columna por la variable "Col"?

    Ejemplo, si tengo Range("B" & K).Value, ¿basta con poner Range("Col" & K)?

    Gracias
    0
    1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
       
      La sintaxis de Cells es adecuada para esta situación:
      Cells(Fila, Columna).Value

      Range("B3") es igual a Cells(3, 2)
      0
  3. padbollevrai Mensajes publicados 58 Estado Miembro 1
     
    Muchas gracias.

    Última cosa: has puesto

     For Col = 1 To 12 Select Case Cells(3, Col) Case "count" Call Filling_Count(Col) Case "min" Call Filling_Min(Col) Case "max" Call Filling_Max(Col) Case "Time" Call Filling_Time(Col) Case Else MsgBox "Erreur Fatale" End Select Next 


    O, en lugar de "Erreur fatale" en caso de "case else", me gustaría que pase al siguiente valor. Así que puse un Next en lugar de MsgBox "Erreur Fatale", pero eso genera un doble Next... Y me da un error de compilación.

    ¿Basta con no poner nada o hay algo particular?

    Otro problema: en una de mis subrutinas, un error de compilación señala "Déclaration existante dans la portée en cours" sobre "Dim Col as Integer".
    Solo la declaro una vez esa variable; no entiendo ese error, especialmente porque las otras subrutinas situadas más arriba en el código no han mostrado ese error.

    Merci
    0
    1. pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
       
      No pongas nada en el Case Else.

      Declaración existente en el ámbito actual
      mira bien, debes tener una variable Col Declarada dos veces.
      Reemplaza por Columna....
      0
  4. padbollevrai Mensajes publicados 58 Estado Miembro 1
     
    Logré salir adelante, ¡todo está bien!

    En realidad estaba poniendo "Dim Col as Integer" tanto en el Main como en cada macro.

    ¡Muchas gracias!
    0