Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen

Nichtzusammenhängende Bereiche deklarieren

Betrifft: Nichtzusammenhängende Bereiche deklarieren von: Renner
Geschrieben am: 08.11.2014 19:49:31

Hallo liebe Experten,
Ich brauche wiedermal Eure Hilfe. Ich muss im Excel Solver 2 später vielleicht auch 3 nicht zusammenhängende Bereiche für die Binärzahlen ( Entscheidungsvariablen) angeben. Z.B. Range("A1:C3,E1:G3,I1;K3") Zusätzlich sind diese Bereich noch dynamisch. Für den Einfachen Fall benutzte ich folgenden Code (er funktioniert )

SolverOptions MaxTime:=100, Iterations:=100, Precision:=0.000001, AssumeLinear _
:=False, StepThru:=False, Estimates:=1, Derivatives:=1, SearchOption:=1, _
IntTolerance:=5, Scaling:=False, Convergence:=0.0001, AssumeNonNeg:=True
Dim A, B As Long ' für das Aufspannen der Matrix für ( Variablen und Nebenbedingung)
A = Auftragszahl - 1 ' -1 da beim späteren aufaddieren die Ausgangszelle mit Addiert wird,_
'das macht die Matrix um 1größer als die sein soll
B = Auftragszahl - 1

SolverOk SetCell:=Range("B8"), MaxMinVal:=2, _
ByChange:=Range(Cells(10, 33), Cells(10 + A, 33 + A))

'Binäre Variable Matrix1
SolverAdd CellRef:=Range(Cells(10, 5), Cells(10 + A, 5 + A)), Relation:=5 '
'Binäre Variable Matrix2
SolverAdd CellRef:=Range(Cells(10, 33), Cells(10 + A, 33 + A)), Relation:=5
USW.
Leider kann ich den nicht auf mehrere Bereiche anpassen.
Mein Versuch:
ByChange:=Range("Cells(10, 5), Cells(10 + A, 5 + A):Cells(10, 33), Cells(10 + A, 33 + A)")
Vielleicht habt Ihr eine Idee.
Vielen Dank im voraus.

  

Betrifft: Solver - diskontinuierliche Bereiche von: {Boris}
Geschrieben am: 08.11.2014 23:02:49

Hi,

ByChange:=Range("Cells(10, 5), Cells(10 + A, 5 + A):Cells(10, 33), Cells(10 + A, 33 + A)")

Das ist syntaktisch nicht korrekt. Durch die "Anführungszeichen" wird der Part Cells(10, 5), Cells(10 + A, 5 + A):Cells(10, 33), Cells(10 + A, 33 + A) zu einem STRING und somit keinesfalls zu dem gewünschten Bereich.

Ich denke es ist sinnvoll, dass Du mal Deine Datei hochlädst - dann gibt`s vielleicht auch konkrete Hilfe.

VG, Boris


  

Betrifft: AW: Nichtzusammenhängende Bereiche deklarieren von: Renner
Geschrieben am: 09.11.2014 16:56:20

Hallo,
Danke für den Tipp.
Ich habe jetzt die Funktion herausgeschnitten, da die gesamte Datei mehrere Funktionen beinhaltet die alle auf Datenbank zugreifen usw.

Private Sub CommandButton1_Click()
 
  Dim Auftragszahl As Long
  With ActiveSheet
   Auftragszahl = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row - 9 'liest die letzte Zeiel  _
aus -8 beschriebene Zeilen = Anzahl der Aufträge
   
             
    SolverZurücksetzen
    SolverOptions MaxTime:=1000, Iterations:=100, Precision:=0.000001, Convergence:=0.0001,  _
AssumeNonNeg:=True
 Dim A, B As Long ' für das Aufspannen der Matrix für ( Variablen und Nebenbedingung)
 A = Auftragszahl - 1 ' -1 da beim späteren aufadieren die Ausgangszelle mit Addiert wird,_
 'das macht die Matrix um 1größer als die sein soll
 B = Auftragszahl - 1
   
    SolverOk SetCell:=Range("B8"), MaxMinVal:=2, _
        ByChange:=Range("Cells(10, 5), Cells(10 + A, 5 + A)) :Cells(10, 33), Cells(10 + A, 33 +  _
A)")
        ' ,Engine:= 2, EngineDesc:="Simplex LP"
    ' Add the constraint for the model. The only constraint is that the
    ' number of parts used does not exceed the parts on hand--
      
      'Binäre Variable Matrix1
         SolverAdd CellRef:=Range(Cells(10, 5), Cells(10 + A, 5 + A)), Relation:=5 '
       'Binäre Variable Matrix2
         SolverAdd CellRef:=Range(Cells(10, 33), Cells(10 + A, 33 + A)), Relation:=5
        'Ganze Zahlen Matrix1
          SolverAdd CellRef:=Range(Cells(10, 5), Cells(10 + A, 5 + A)), Relation:=4
         'Ganze Zahlen Matrix2
          SolverAdd CellRef:=Range(Cells(10, 33), Cells(10 + A, 33 + A)), Relation:=4
          
          
        'Jeder auftrag /Zeile nur ein Mal in jeder Zeile
        SolverAdd CellRef:=Range(Cells(10, 59), Cells(10 + B, 59)), Relation:=2, _
        FormulaText:="$AD$3"
        'Jeder auftrag /Spalte nur ein Malin jeder Spalte Matrix1
        SolverAdd CellRef:=Range(Cells(9, 5), Cells(9, 5 + A)), Relation:=1, _
        FormulaText:="$C$9"
        'Jeder auftrag /Spalte nur ein Malin jeder Spalte Matrix2
        SolverAdd CellRef:=Range(Cells(9, 33), Cells(9, 33 + A)), Relation:=1, _
        FormulaText:="$C$9"
       MsgBox "Berechnung ist abgeschlossen!"
        
    ' Show the Solver Results dialog box.
    SolverSolve UserFinish:=False

    ' Finish and keep the final results.
    SolverFinish KeepFinal:=1
 
   
 End With

End Sub

Was ich Brauche, sind 2 getrennte Bereich für den Solver.
Das Bild zeigt wie es aussehen muss.

Doch ich weiß nicht wie ich den veränderbaren Bereich umsetzten soll.
Vielen Dank an alle.
Gruß
Dima


 

Beiträge aus den Excel-Beispielen zum Thema "Nichtzusammenhängende Bereiche deklarieren"