** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - Solver VBA
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Solver VBA

 Responder Responder
Autor
Mensaje
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Solver VBA
    Enviado: 08/Abril/2021 a las 13:41
Muy buenas a todos,

Tengo una duda con los resultados que da este código.

Sub Solver_automatico()

Set ColumnaObjetivo = Application.InputBox("Selecione la columna objetivo", "Get Range", Type:=8)
Set Cte = Application.InputBox("Selecione la caida de tensión objetivo", "Get Range", Type:=8)
Set Sum = Application.InputBox("Selecione el sumatorio de las secciones a optimizar", "Get Range", Type:=8)


SolverReset


SolverOk setcell:=Cte, MaxMinVal:=1, ByChange:=ColumnaObjetivo
SolverOk setcell:=Sum, MaxMinVal:=2, ByChange:=ColumnaObjetivo

SolverAdd CellRef:=ColumnaObjetivo, Relation:=1, FormulaText:="300"
SolverAdd CellRef:=ColumnaObjetivo, Relation:=3, FormulaText:="16"
SolverAdd CellRef:=ColumnaObjetivo, Relation:=4
SolverAdd CellRef:=Cte, Relation:=1, FormulaText:="$Q$3"

SolverSolve

End Sub

Los resultados que debería arrojar serían los de la columna M, teniendo en cuenta que K3 no debe ser mayor de 9,5 pero no sé cómo hacer para que los únicos resultados que me pueda dar son los que se encuentran en la columna O, ya que son las secciones normalizadas.

Los SolverAdd que se refieren a menor de 300, mayor de 16 y el de integer no harían falta si hubiera una forma de que sólo pudiera escoger las secciones de la columna O.


Muchas gracias y un saludo


Editado por gamusino - 11/Abril/2021 a las 13:29
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Abril/2021 a las 16:55
Entiendo que es Excel por lo que lo muevo al foro adecuado. Por cierto, yo no veo la imagen.

Xavi, un minyó de Terrassa

Mi web
Arriba
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 09/Abril/2021 a las 08:42
Perdón si lo he colgado en el lugar equivocado, lo que no entiendo es por que no se puede ver la foto, yo la veo con diferentes dispositivos
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 09/Abril/2021 a las 11:57
La imagen la veo, lo que «no veo» es lo que pretendes hacer: con que datos, con que condiciones, fórmula, ejemplos de resultados, etc.

Al código que compartes no le encuentro sentido.


Saludos desde Tenerife.
Arriba
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 09/Abril/2021 a las 14:24
Voy a intentar explicar mejor el problema.



Tengo un suministrador de energía que va a alimentar a los 15 consumidores que se muestran en la columna B, dichos consumidores están conectados con unos cables cuya longitud está en la columna F. Los consumidores que están más cerca del suministrador arrastran la potencia de los consumidores más lejanos como se puede observar en la columna E.

La caída de tensión (AU) que se encuentra en la columna I se calcula como podemos ver en la imagen anterior como: =0.033702*longitud_del_cable*intensidad*2/sección_del_cable

La columna J pasa esa caída de tensión a porcentaje de la siguiente manera =I3/750*100 (750 porque es la tensión de suministro).

La columna K simplemente es la acumulada de la columna J.

La celda M12 es la suma de L3:L12, la cual utilizo en el programa para que sea la menor posible.

El objetivo principal del programa es asignar a cada cable una sección, teniendo en cuenta que las secciones normalizadas son las de la columna O.

Las secciones deben ir disminuyendo cuanto más lejos esté del suministrador (la sección puede ser igual pero no superior a un punto que se encuentre más cercano al suministrador.

Las secciones que debería dar el programa y que, en este caso se han calculado a mano son las de la columna S.

Tal como está el programa en este momento aparecen tres imputbox:

- El primero seleccionando las secciones a optimizar



- El segundo seleccionando la caída de tensión objetivo (que no puede ser mayor de 9,5)



- El sumatorio de las secciones


Actualmente el programa arroja números pero no sé cómo hacer para que aparezcan en orden (de mayor a menor a medida que se aleja del suministrador) y en un principio intenté buscar si habría alguna manera de en el formulatext hubiera alguna manera para que sólo pudiera seleccionar las secciones de la columna O pero parece que así no se puede hacer.

Espero que así se entienda mejor.

Muchas gracias a todos


Editado por gamusino - 10/Abril/2021 a las 14:00
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Abril/2021 a las 11:09

Mucha información no significa «explicar mejor el problema» sobre todo cuando es claramente errónea:

 

«Tengo un consumidor de energía que va a alimentar a...» Supongo que será un generador.

 

«... los 15 consumidores que se muestran en la columna B»  Columna B es Potencia.

«… unos cables cuya longitud está en la columna F»  Columna F es Intensidad.

 

Y el resto continúa de modo similar. Dejé de leer tu mensaje antes de la segunda imagen  (no me puedo fiar de lo que dices en ese mensaje).

 

Para poder intentar ayudarte, lo que se necesita es el cálculo que quieres hacer, donde quieres el resultado y algunos ejemplos de cómo deben ser esos resultados, y explica mejor lo de: «… los únicos resultados que me pueda dar son los que se encuentran en la columna O…» (que decías en tu consulta inicial).

 

 

=constante*longitud_del_cable*intensidad*2/sección_del_cable    (¿Qué constante?)




Saludos desde Tenerife.
Arriba
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Abril/2021 a las 19:09
Siento la pérdida de tiempo, pero cambié de disposición la tabla excel después de hacer la captura principal y por eso no tenían ningún sentido las columnas a las que me refería, ya lo he corregido.



Tal como está ahora, tú vas eligiendo las secciones de cada tramo (seccion_consumidor_1<=seccion_consumidor_2<=seccion_consumidor3<=...) hasta que la caída de tensión del último tramo (K3) sea menor que 9,5.

El código obtiene unos resultados pero no son ni las secciones normalizadas, ni están de menor a mayor.

Aquí está el problema, que el programa siga optimizando los resultados pero únicamente pueda escoger entre las secciones normalizadas.

Muchas gracias y perdón por no explicarme bien.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Abril/2021 a las 13:05
No había visto que modificaste el mensaje anterior, pensé que sólo añadías lo de tu último mensaje.

(Editado para corregir el enlace) Descarga este_ejemplo.

Notas:

Para facilitar la visualización, he ordenado la tabla por el campo Longitud (F), aunque para la fórmula es irrelevante. También invertí las secciones  normalizadas (O) para facilitar mi fórmula.

- Para simplificar la visualización, he ocultado columnas que no intervienen.

 

► En tu explicación dices «... Las secciones deben ir disminuyendo cuanto más lejos esté del suministrador...», pero veo que los valores de (L) son mayores cuanto mayor es la longitud  (a mayor longitud mayor distancia ¿no?).

►Los valores naranja (L) son <50 (ver columna O) y >=35 (similar para los otros colores), según mi formula les corresponden los valores de (P), aunque tú das como óptimos los valores de (S)  ¿...?.

►En la fórmula (P) que deberás ubicar en (L), debes sustituir L3 por la fórmula que calcula la sección:

=INDICE($O$3:$O$13;COINCIDIR(L3;$O$3:$O$13))

=INDICE($O$3:$O$13;COINCIDIR(fórmula;$O$3:$O$13))






Editado por AnSanVal - 11/Abril/2021 a las 13:27
Saludos desde Tenerife.
Arriba
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Abril/2021 a las 14:41
Lo primero muchas gracias por la paciencia.

Quiero subir mi archivo pero no sé cómo.

No expliqué lo de la longitud, no se puede cambiar de orden porque la longitud que aparece en el consumidor1 es la distancia entre consumidor1 y consumidor2, la longitud que aparece en el consumidor2 es la distancia entre consumidor2 y consumidor3 y así sucesivamente (la de consumidor10 es la distancia entre consumidor10 y suministrador).

Los que van después del suministrador (consumidor11:consumidor15) van al revés, la longitud que aparece en el consumidor15 es la distancia entre consumidor15 y consumidor14.

En la parte izquierda de la imagen pongo un pequeño esquema donde se ven las distancias entre consumidores y cómo proseguiría, ya que esto forma parte de una lista de más de 1000 consumidores.

Para hacernos una idea el consumidor1 se encuentra al inicio de una carretera, conforme avanzan los kilómetros nos vamos encontrando más consumidores hasta llegar al primer suministrador, el cual dará energía a los consumidores anteriores y a los posteriores hasta el 1, el 16 obtendrá la energía del siguiente suministrador.

A la derecha se encuentran las secciones de cable que unen a todos los consumidores hasta llegar al suministrador.

La intensidad que pasará por el cable entre consumidor10 y suministrador será la sumatoria de todas las anteriores, por eso la sección tiene que ser mayor cuanto más cerca del suministrador esté.



El punto más importante es que K3 no sea mayor de 9,5.

El solver tiene que tener una manera de que sólo me pueda dar como resultado las secciones normalizadas


Editado por gamusino - 11/Abril/2021 a las 16:12
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Abril/2021 a las 16:57

Ya expliqué en mi mensaje que la ordenación por longitud es irrelevante para la fórmula (es sólo por cuestión visual), es decir funcionará correctamente aunque permanezca el orden original (1:10).

La pregunta fue sobre cómo obtener el valor normalizado y no los valores intermedios, ese tema está ya resuelto, y yo no soy nada amigo del «yaque»: Ya que estamos también ...

Para tu conocimiento futuro (cómo subir un archivo al foro):
 1.- Sube el archivo a un sitio de hospedaje (p.e. OneDrive -gratuito-).
 2.- Comparte el enlace en tu mensaje.


Saludos desde Tenerife.
Arriba
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Abril/2021 a las 17:57
https://mega.nz/file/CAUynDyY#AQ7ynLnaIV6pi1rEnJy3DVX4OY10pkbEbolIng5PwBU

Aquí esta el enlace al archivo excel.

El orden de los consumidores no se puede alterar porque todo depende de K3 que es la acumulada y no puede ser mayor de 9,5.

En el archivo que has subido he visto que esa columna la tienes vacía, no entiendo por qué.

Los valores que debe dar el programa en L3:L12 tienen que ser los que aparecen en S3:S12 (estos últimos se han calculado a mano ya que actualmente al ejecutar el código que aparece arriba da valores de sección que no están normalizados, como son 38, 26, 22, 36, 32...)


Muchas gracias por la paciencia

Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5970
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Abril/2021 a las 23:20

► A lo largo de estos días te he pedido aclaraciones y a ninguna de mis dudas recibí ningún comentario de tu parte: 

09/04/2021

 - …lo que «no veo» es lo que pretendes hacer: con qué datos, con qué condiciones, fórmula, ejemplos de resultados, etc.

 - Al código que compartes no le encuentro sentido.

 10/04/2021

- Para poder intentar ayudarte, lo que se necesita es el cálculo que quieres hacer, donde quieres el resultado y algunos ejemplos de cómo deben ser esos resultados, y explica mejor lo de: «… los únicos resultados que me pueda dar son los que se encuentran en la columna O…» (que decías en tu consulta inicial).

 1104/2021

- En tu explicación dices «... Las secciones deben ir disminuyendo cuanto más lejos esté del suministrador...», pero veo que los valores de (L) son mayores cuanto mayor es la longitud 

- Los valores naranja (L) son <50 (ver columna O) y >=35 (similar para los otros colores), según mi formula les corresponden los valores de (P), aunque tú das como óptimos los valores de (S)  ¿...?.

  

► Sigo sin saber la fórmula que empleas para calcular la sección, o los razonamientos que empleas para las secciones óptimas. 

► Retiro mi participación de esta consulta y dejo más espacio para que pueda participar alguien que te entienda mejor que yo. Sólo aclararte que la fórmula que yo daba por buena, claramente no lo es, pues nunca se podrían obtener los valores que calculaste a mano y que consideras óptimos.

 

Saludos y suerte.




Saludos desde Tenerife.
Arriba
gamusino Ver desplegable
Nuevo
Nuevo


Unido: 05/Abril/2021
Localización: 58
Estado: Sin conexión
Puntos: 13
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita gamusino Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Abril/2021 a las 12:49
Siento la pérdida de tiempo y que no nos hayamos logrado entender, veo que me he puesto a explicar demasiadas cosas innecesarias en vez de ir a la raíz del problema e ir avanzando desde ahí.

Lo más simple que se me ocurre para explicar el problema es si se puede poner una restricción para que en los resultados L3:L12 sólo puedan ser los valores O3:O13.

Ejemplo: L3 en vez de dar 14,1973 sólo podría ser 16, 25, 35, 50, 70...
L4 en vez de dar 12,0031 sólo podría ser 16, 25, 35, 50, 70...
y así hasta L12

Q3=9,5



De nuevo muchas gracias AnSanVal por la ayuda y siento no haberme explicado bien.


Editado por gamusino - 12/Abril/2021 a las 13:53
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable