martes, 4 de abril de 2017

Matrices de varias dimensiones en VBasic.

Matrices o arrays. Tengo una lista de actuaciones de una multinacional en las 50 provincias españolas. De esa lista debo sacar un resumen de actuaciones por provincia y mes, así como la duración media de las actuaciones con un total anual y un total nacional. Voy a utilizar una macro VBasic con una matriz de mas de una dimensión.
  • Tenemos 50 provincias mas un total nacional.
  • El informe es de los 12 meses del año mas un total anual.
  • Debe incluir tanto el número de actuaciones como la duración media.
  • Por tanto nuestra matriz debe ser de 51*13*2. (50+1,12+1, Act. y duraciones)
  • En la lista hay actuaciones terminadas y actuaciones sin terminar (franqueadas o no franqueadas). 
  • El informe es de actuaciones franqueadas por provincia y mes, independientemente de cuando se inició la actuación.
  • La macro lee de inicio a fin, de una en una, todas las líneas con actuaciones.
  •  Acumula tanto las actuaciones como las duraciones por provincia y mes.
  • Solo si la actuación esta franqueada la tiene en cuenta. 
  • Existe otro filtro, debe estar franqueada en un año determinado.
  • A siguiente código le falta situar el nombre de los meses en la primera línea del informe. Un mes para dos columnas, centrado entre dos celdas. Lo he dejado así para que aquellos que estén interesados lo hagan por su cuenta. Como ejercicio de programación.
  • Por último incluimos un botón en la hoja inicio para lanzar el proceso. Después de incluir el botón, le asignamos la macro con el botón derecho del ratón.  



Código:
***************************Inicio código*******

Sub ProcesoActuaciones()

Dim D, Pr, Nl, Cp, Dur, I, FI, FF, Act(51, 13, 2), AAAA, MM, AProc, J, Meses, Prvs
Meses = Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", "T.Año")
 'Act(51,13,2) matriz en donde acumulamos los datos
'Meses= Array o matriz con los meses del año. 


Set D = Sheets("Actuaciones")
Set Pr = Sheets("Prv")
Prvs = Pr.Range("b2:b52").Value
AProc = Sheets("Inicio").Range("a2").Value 'Año que se procesa. Lo lógico es colocarlo externamente a este código. Lo sitúo en la hoja Inicio celda A2

With D
Nl = .UsedRange.Rows.Count 'Cuenta el número de lineas usadas

For I = 2 To Nl 'La línea 1 contiene las cabeceras
Cp = .Range("a" & I).Value 'código de provincia
FI = .Range("b" & I).Value 'fecha de inicio
FF = .Cells(I, 3).Value 'fecha fin. Tambien podemos hacer referencia a una celda con cells(fila,columna)

If FF > FI Then ' Si la fecha finalización es mayor que la de inicio
AAAA = Year(FF) 'Año fin
MM = Month(FF) 'mes fin
    If AAAA = AProc Then 'Año de proceso
'************Acumulados provinciales****************
    Act(Cp, MM, 1) = Act(Cp, MM, 1) + 1 'Acumula actuaciones.
    Act(Cp, MM, 2) = Act(Cp, MM, 2) + FF - FI 'Acumula duraciones
    Act(Cp, 13, 1) = Act(Cp, 13, 1) + 1 'Acum. act. Año
    Act(Cp, 13, 2) = Act(Cp, 13, 2) + FF - FI 'Acum. durac. año
'************Acumulados nacionales****************
Cp = 51
    Act(Cp, MM, 1) = Act(Cp, MM, 1) + 1
    Act(Cp, MM, 2) = Act(Cp, MM, 2) + FF - FI
    Act(Cp, 13, 1) = Act(Cp, 13, 1) + 1
    Act(Cp, 13, 2) = Act(Cp, 13, 2) + FF - FI

    End If

End If
Next
End With

With Sheets("resumen")
.UsedRange.Rows.Delete 'Elimina las lineas utilizadas
For I = 1 To 51 'Para cada una de las provincias y el total nacional
'.Range("a" & I + 1).Value = I
For J = 1 To 13 'Para cada mes
.Cells(I + 2, J * 2).Value = Act(I, J, 1)
If Act(I, J, 1) > 0 Then .Cells(I + 2, J * 2 + 1).Value = Act(I, J, 2) / Act(I, J, 1) 'Las duraciones medias son el total de duraciones/nºact. en donde N.Act debe ser mayor que cero, si no daría error.
Next
Next

For J = 1 To 13 ' Colocamos los literales 
.Cells(2, J * 2).Value = "N.Act."
.Cells(2, J * 2 + 1).Value = "D.Med."
.Columns(J * 2 + 1).Cells.NumberFormat = "[h]:mm"'Damos formato a la columna con d.m.
Next
.Range("a3:a53").Value = Sheets("prv").Range("b2:b52").Value 'Colocamos los nombres de las provincias
.Range("a1").Value = "Año:" & AProc 'informe del año 
.UsedRange.Columns.AutoFit
End With

With Sheets("aux")
.Cells.Clear
.Range("b1:n1").Value = Meses
.Range("a3:a53").Value = Prvs
End With
End Sub

*****************Fin código*******************
A este código le falta situar el nombre de los meses en la primera línea del informe. Lo he dejado así para que aquellos que estén interesados lo hagan por su cuenta. Como ejercicio de programación.

No hay comentarios:

Publicar un comentario