VBA Solveur désactivation de la boîte de dialogue qui s'affiche après chaque itération
Je suis en utilisant le haut-solveur Excel 2007, dans une VBA boucle de résoudre un certain nombre de problèmes différents. Parfois, le solveur frappe le maximum de temps, ce qui provoque un pop-up boîte de dialogue apparaît demandant à l'utilisateur s'il veut Continuer, Arrêter, ou à la Fin. Dans tous les cas, je le veux à la fin, et passez à la ligne suivante de la boucle. Cela permettra d'empêcher un utilisateur d'avoir à s'asseoir et d'y répondre à chaque fois.
J'ai couru une macro avec le solveur pass thru méthode ( Catch max de temps/itération de la boîte de dialogue lors de l'utilisation du Solveur de microsoft Excel en VBA ), mais alors il me donne une autre boîte de dialogue en disant: "La formule que vous avez tapé contient une erreur"
J'ai aussi essayé http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx .
Ce qui l'est moins compliqué que la version de "Le solveur pass thru méthode", mais après chaque itération, il me donne le même message que "La formule que vous avez tapé contient une erreur"
C'est mon code
Sub Optimize()
'
' OptimizeShortfall Macro
'
'
Set MyFirstObj = Range("I124")
Set MyFirstRange = Range("H600:H698")
Dim i As Integer
For i = 0 To 1
MyObj = MyFirstObj.Offset(0, i).Address
MyTestRange = MyFirstRange.Offset(0, i).Address
SolverReset
SolverOk SetCell:=MyObj, MaxMinVal:=1, ValueOf:="0", ByChange:= _
MyTestRange
SolverAdd CellRef:=MyTestRange, Relation:=1, FormulaText:="100%"
SolverOptions MaxTime:=20, Iterations:=100, Precision:=0.000001, AssumeLinear _
:=False, StepThru:=False, Estimates:=1, Derivatives:=1, SearchOption:=1, _
IntTolerance:=5, Scaling:=False, Convergence:=0.0001, AssumeNonNeg:=True
SolverSolve UserFinish:=True, ShowRef:="SolverIteration"
Next i
End Sub
Function SolverIteration(Reason As Integer)
MsgBox Reason
SolverIteration = 1
End Function
ShowRef
argument est facultatif. Vous pouvez l'omettre, dans ce cas, la boucle à l'autre solveur de problème. Le message The formula you typed contains an error
implique que quelque chose est mauvais, peut-être dans le modèle de configuration.Si j'omets le ShowRef argument-je obtenir la boîte de dialogue disant "Max limite de temps atteinte, voulez-vous Arrêter/continuer". Pour éviter cela, j'ai utilisé ShowRef à l'appel de la macro 'SolverIteration", mais ensuite il me donne un msg en disant: "La formule que vous avez tapé contient une erreur".
Pourriez-vous le rapport de la ligne qui donne l'erreur? Pouvez-vous également de vérifier que toutes les formules sont entrés sans fautes de frappe? Parfois des questions comme le fait d'avoir des points-virgules à la place des virgules dans les formules, ou le nombre de niveaux d'imbrication, peut donner de telles erreurs.
Je vois. En théorie votre code devrait fonctionner, mais le message d'erreur que vous obtenez est très difficile à déboguer, car il peut signifier quelque chose. Ce post a exactement les mêmes symptômes, mais le véritable problème est complètement différent. Vous disposez de tous les événements dans votre code? Si des événements s'allument et tenter de changer le solveur de cellules, alors ce pourrait être un problème..
Merci beaucoup mec!!!! Le lien que vous m'avez donné résolu le problème. Mon classeur nom de l'espace a en elle, ainsi qu'il a été près de 20 caractères de long. Je chaged à une seule lettre, et maintenant le fonctionnement de la macro! Merci beaucoup mec!!! Cela a été de caler mon travail pour beaucoup de jours!
OriginalL'auteur Eyan Noronha | 2014-09-02
Vous devez vous connecter pour publier un commentaire.
http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx , va vous expliquer clairement quand une boîte de dialogue apparaît, ce que cela signifie et comment l'éviter si vous êtes en cours d'exécution du solveur dans une boucle.
Force une Solution pour sortir de la boucle suivante dans le cas de Max de Temps/d'Itérations a été atteint était de garder le Alt+T bouton enfoncé pendant toute la durée de l'ensemble de la macro.
Un autre plus sage méthode consiste à utiliser Le ShowRef argument dans le SolverSolve fonction.
Ce ShowRef n'est qu'au lieu de poping une boîte de dialogue, il va exécuter la macro donné comme argument, dans ce cas "SolverIteration". Si vous souhaitez que le solveur de continuer pour l'Itération donnée définir SolverIteration à 0. Si vous voulez arrêter le solveur pour l'Itération donnée et passer à la prochaine Itération, l'Ensemble SolverIteration à 1.
Ne prendre note que le ShowRef Argument a quelques problèmes dans la digestion des classeurs avec de très long nom et/ou les noms avec l'espace, Afin de définir le nom du classeur, aussi courte que possible.
Désolé si mon explication n'était pas suffisant pour vous. Voici la liste exhaustive de trois liens que j'avais besoin pour résoudre mon problème:
http://msdn.microsoft.com/en-us/library/office/ff197237(v=office.15).aspx
Catch max de temps/itération de la boîte de dialogue lors de l'utilisation du Solveur de microsoft Excel en VBA
http://www.excelforum.com/excel-programming-vba-macros/555406-solved-solver-solversolve-showref.html
P. S. Dans mon code mentionné dans la question ci-dessus, il suffit de retirer la ligne 'MsgBox Raison" de la fonction "SolverIteration".(Il a juste une autre boîte de dialogue pop-up avec un Entier de valeur de la Raison sur elle :P)
OriginalL'auteur Eyan Noronha