Microsoft Visual Basic - e

Anuncio
Module1 - 1
Sub OPT()
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim
minpc As Integer
max(100) As Double
row_max, fday, lday As Integer
aux, aux2 As String
frow(1000) As Double
lrow(1000) As Double
max_it(1000) As Double
sumpc(1000) As Double
day_row As Double
fecha, date_ini, date_fin As Date
inicio, final, fin As Integer
pc_ini, pc_opt As Integer
sum_ini, falso As Double
sum_opt, starts_ini, starts_opt As Double
pc1(1000), pcfin(1000) As Double
vacio As String
j
k
m
n
o
g
h
1
1
1
1
1
1
1
=
=
=
=
=
=
=
'Almaceno la condición de horas PC
Sheets("eficiencias").Select
minpc = ActiveSheet.Cells(32, 8).Value
Sheets("opt").Select
'Fechas de inicio y fin
date_ini = Cells(3, 24).Value
date_fin = Cells(3, 25).Value
'####Almacenar el rango a optimizar####
'vector para buscar las fechas
Range("C4").Select
Selection.End(xlDown).Select
fin = ActiveCell.Row
For t = 3 To fin
Cells(t, 3).Select
If (Cells(t, 3) = date_ini - 1) Then
inicio = Cells(t + 1, 3).Row
End If
If (Cells(t, 3) = date_fin + 1) Then
final = Cells(t - 1, 3).Row
Exit For
End If
Next t
'Borro las optimizaciones anteriores
Range(Cells(4, 19), Cells(fin, 22)).Select
Selection.ClearContents
'Almaceno el rango de funcionamiento
Range("M4").Select
For i = inicio To final
Cells(i, 13).Activate
aux = Cells(i, 13).Value
aux2 = Cells(i + 1, 13).Value
If ((aux = "STOP") * (aux2 = "PC")) Then
frow(j) = Cells(i + 1, 13).Row
j = j + 1
End If
If ((aux = "PC") * (aux2 = "STOP")) Then
lrow(k) = Cells(i, 13).Row
k = k + 1
Module1 - 2
End If
Next i
'Copio el régimen inicial para compararlo con los resultados
Range(Cells(inicio, 15), Cells(final + 1, 15)).Select
Selection.Copy
Cells(inicio, 19).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range(Cells(inicio, 17), Cells(final + 1, 17)).Select
Selection.Copy
Cells(inicio, 21).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'###Almaceno las filas de los tramos correspondientes al funcionamiento
For f = inicio To final + 1
Cells(f, 19).Select
aux3 = Cells(f - 1, 19).Value
aux4 = Cells(f, 19).Value
If ((aux3 = "START2") * (aux4 = "PC")) Then
pc1(g) = Cells(f, 19).Row
g = g + 1
End If
If ((aux3 = "PC") * (aux4 = "DS")) Then
pcfin(h) = Cells(f - 1, 19).Row
h = h + 1
End If
Next f
If (Cells(inicio, 20) = "DS") Then
Cells(inicio, 22) = 0
End If
h = 1
If (Cells(inicio, 19) = "DS") Then
Cells(inicio, 21) = 0
End If
'Busco el máximo de cada tramo
k = 1
For j = 1 To 1000
If (frow(j) = 0) Then
Exit For
End If
h = j
'Almacenamiento del máximo del primer caso
For l = (frow(j) - 2) To (lrow(k) + 1)
max(m) = max(m) + Cells(l, 17)
sumpc(n) = sumpc(n) + Cells(l, 18)
Next l
m = m + 1
k = k + 1
'Almacenamiento de la fila del primer máximo
row_max = frow(j)
'###Condición si sumpc(n) es menor que minpc para la planta parar y copiar el régimen
If (sumpc(n) < minpc) Then
falso = 1
Range(Cells(row_max, 13), Cells(pcfin(h), 13)) = "STOP"
Cells(row_max, 3).Select
day_row = ActiveCell.Row
fecha = ActiveCell.Value
For p = 1 To 20
If (Cells(day_row - p, 3) = fecha) Then
fday = Cells(day_row - p, 3).Row
End If
If (Cells(day_row + p, 3) = fecha) Then
lday = Cells(day_row + p, 3).Row
End If
Module1 - 3
Next p
'Selecciona las celdas del régimen y las pega
Range(Cells(fday, 15), Cells(lday + 1, 15)).Select
Selection.Copy
Cells(fday, 20).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Selecciona el margen recibido optimizado y lo pega
Range(Cells(fday, 17), Cells(lday + 1, 17)).Select
Selection.Copy
Cells(fday, 22).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
If (Cells(inicio, 20) = "DS") Then
Cells(inicio, 22) = 0
End If
If (Cells(inicio, 19) = "DS") Then
Cells(inicio, 20) = "STOP"
End If
sumpc(n) = 0
End If
'Iteración para buscar el máximo
n = 1
Do While (sumpc(n) > minpc)
If (falso = 1) Then
Exit Do
End If
Cells(frow(j) + n - 1, 13) = "STOP"
sumpc(n) = 0
For o = (frow(j) - 2) + n To (lrow(k - 1) + 1)
max_it(n) = max_it(n) + Cells(o, 17)
sumpc(n) = sumpc(n) + Cells(o, 18)
Next o
If (max_it(n) > max(m - 1)) Then
max(m - 1) = max_it(n)
falso = 2
'Búsqueda del máximo coincidente con pc
If (Cells(frow(j) + n, 13) = "PC") Then
row_max = frow(j) + n
End If
If (Cells(frow(j) + n, 13) = "STOP") Then
For p = 1 To 6
Cells(frow(j) + n + p, 13).Select
If (Cells(frow(j) + n + p, 13) = "PC") Then
row_max = frow(j) + n + p
Exit For
End If
Next p
End If
End If
n = n + 1
If (sumpc(n - 1) = sumpc(n - 2)) Then
Exit Do
End If
sumpc(n) = sumpc(n - 1)
Loop
m = 1
'#####Modifico el régimen en función del máximo
If (falso > 1) Then
Cells(row_max, 13) = "PC"
Range(Cells(row_max, 13), Cells(pcfin(h), 13)) = "PC"
End If
'Copia del régimen de funcionamiento óptimo en una nueva columna, así como los resultados econó
micos del cambio
'durante el día entero
'Busca las celdas correspondientes al día optimizado
Module1 - 4
Cells(row_max, 3).Select
day_row = ActiveCell.Row
fecha = ActiveCell.Value
For p = 1 To 20
If (Cells(day_row - p, 3) = fecha) Then
fday = Cells(day_row - p, 3).Row
End If
If (Cells(day_row + p, 3) = fecha) Then
lday = Cells(day_row + p, 3).Row
End If
Next p
'Selecciona las celdas del régimen y las pega
Range(Cells(fday, 15), Cells(lday + 1, 15)).Select
Selection.Copy
Cells(fday, 20).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Selecciona el margen recibido optimizado y lo pega
Range(Cells(fday, 17), Cells(lday + 1, 17)).Select
Selection.Copy
Cells(fday, 22).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
If (Cells(inicio, 20) = "DS") Then
Cells(inicio, 22) = 0
End If
If (Cells(inicio, 19) = "DS") Then
Cells(inicio, 20) = "STOP"
End If
sumpc(n) = 0
falso = 0
Next j
'Rellenar filas vacías con Stop
For i = inicio To final
Cells(i, 20).Select
vacio = Cells(i, 20)
If (vacio = "") Then
Cells(i, 20).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.FormulaR1C1 = "STOP"
Cells(i, 22).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.FormulaR1C1 = 0
End If
Next i
Range(Cells(final + 2, 19), Cells(final + 2, 22)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Devolver las fórmulas cambiadas a su estado original
Range("M4").Select
Selection.AutoFill Destination:=Range("M4:M" & final)
'#####Presentación de los resultados#####
sum_ini = 0
sum_opt = 0
pc_ini = 0
pc_opt = 0
starts_ini = 0
starts_opt = 0
For i = inicio To final
sum_ini = sum_ini + Cells(i, 21)
sum_opt = sum_opt + Cells(i, 22)
If (Cells(i, 19) = "PC") Then
pc_ini = pc_ini + 1
End If
If (Cells(i, 20) = "PC") Then
pc_opt = pc_opt + 1
End If
If (Cells(i, 19) = "START1") Then
Module1 - 5
starts_ini = starts_ini + 1
End If
If (Cells(i, 20) = "START1") Then
starts_opt = starts_opt + 1
End If
Next i
'Presentación de las diferencias
Sheets("resultados").Select
Range("B9") = sum_ini
Range("D9") = sum_opt
Range("B12") = pc_ini
Range("D12") = pc_opt
Range("B18") = starts_ini
Range("D18") = starts_opt
If (Range("D15") <= 0) Then
vbanswer = MsgBox("El beneficio neto es nulo o negativo" & Chr(13) & "La planta debe parar su p
roducción", vbOK)
End If
Range("A1").Select
vbanswer = MsgBox("Optimización realizada", vbOK)
End Sub
Descargar