Solver VBA
Impreso de: Foro de Access y VBA
Categoría: Otros de Microsoft: Windows y Office
Nombre del foro: Excel
Descripción del foro: Foro de Excel y VBA de Excel
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85941
Fecha de impresión: 26/Marzo/2026 a las 20:46
Tema: Solver VBA
Publicado por: gamusino
Asunto: Solver VBA
Fecha de publicación: 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
|
Respuestas:
Publicado por: xavi
Fecha de publicación: 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
http://www.llodax.com" rel="nofollow - Mi web
|
Publicado por: gamusino
Fecha de publicación: 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
|
Publicado por: AnSanVal
Fecha de publicación: 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.
|
Publicado por: gamusino
Fecha de publicación: 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
|
Publicado por: AnSanVal
Fecha de publicación: 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.
|
Publicado por: gamusino
Fecha de publicación: 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.
|
Publicado por: AnSanVal
Fecha de publicación: 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 http://www.achinet.mvp-access.es/excel/ayudas/gamusino.rar" rel="nofollow - 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))
------------- Saludos desde Tenerife.
|
Publicado por: gamusino
Fecha de publicación: 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
|
Publicado por: AnSanVal
Fecha de publicación: 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.
|
Publicado por: gamusino
Fecha de publicación: 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
|
Publicado por: AnSanVal
Fecha de publicación: 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.
|
Publicado por: gamusino
Fecha de publicación: 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.
|
|