Ich habe folgendes Problem: ich möchte Excel einen Prüfvorgang durchführen lassen, der folgende Formel auf Wahr/Unwahr prüfen soll.
Formel kurz erklärt: x, y und n sind vordefinierte Zahlen. Excel soll mir nun sagen, ob aus dem n-ten Produkt von (a*b), wobei a und b Zahlen zwischen 0 und 20 sein sollten, x*y rauskommen kann.
Kurzes Beispiel: x=5 y=8 x*y=40 n=4
40=1*5+2*10+5*1+4*5 --> True
Es soll also geprüft werden, ob eine Möglichkeit besteht, ob die Summe aus n a*b-Produkten x*y ergeben kann. Dabei können a und b verschiedene Werte annehmen innerhalb der einzelnen Produkte, jedoch keine Werte größer 20.
06.06.2018, 15:56 (Dieser Beitrag wurde zuletzt bearbeitet: 06.06.2018, 15:56 von LCohen.)
Das ergibt 50, nicht 40.
Welches der vielen Ergebnisse soll's denn werden? Oder geht es wirklich nur um's OB?
Ein VBA'ler mit Rekursions-Kenntnissen hat jetzt gute Karten.
Wehrdienst für nach 31.12.2007 geborene Männer. Freiwilligkeit wird nicht ausreichen; also gibt es das Losverfahren mit daraus mehr als 50% Dienstverpflichteten. Herzlichen Glückwunsch. (Ich habe 15 Monate in der Lw gedient). Weiße Jahrgänge der Bw also ca. -1937 und 1994-2007. Alternativen wie Zivildienst/Verweigerung/Soziales Jahr noch nicht besprochen.
For j = 1 To 20 For jj = 1 To 20 For jjj = 1 To 20 For jjjj = 1 To 20 If j + jj + jjj + jjjj = a * b Then c00 = c00 & Join(Array(vbLf, j, jj, jjj, jjjj)) Next Next Next Next
1. Das Programm variiert zwei Werte (awert und bwert) ganzzahlig über die vorgegebenen Grenzen. Für jede Variation, für die die definierte Formel den Wert 0 hat, werden die Werte der Variation ausgegeben.
2. Die Formel ist frei definierbar.
Code:
Private Sub cbTuwat_Click() Dim lngAmin As Long Dim lngAmax As Long Dim lngBmin As Long Dim lngBmax As Long Dim lngOff As Long Dim lngAwert As Long Dim lngBwert As Long Dim rngFormel As Range Dim rngAwert As Range Dim rngBwert As Range Dim rngAusgabe As Range
lngAmin = ThisWorkbook.Names("amin").RefersToRange.Value lngAmax = ThisWorkbook.Names("amax").RefersToRange.Value lngBmin = ThisWorkbook.Names("bmin").RefersToRange.Value lngBmax = ThisWorkbook.Names("bmax").RefersToRange.Value Set rngAwert = ThisWorkbook.Names("awert").RefersToRange Set rngBwert = ThisWorkbook.Names("bwert").RefersToRange Set rngFormel = ThisWorkbook.Names("Formel").RefersToRange Set rngAusgabe = ThisWorkbook.Names("Ausgabe").RefersToRange rngAusgabe.CurrentRegion = ""
lngOff = 0 For lngAwert = lngAmin To lngAmax rngAwert.Value = lngAwert For lngBwert = lngBmin To lngBmax rngBwert.Value = lngBwert If rngFormel.Value = 0 Then rngAusgabe.Offset(lngOff, 0) = lngAwert rngAusgabe.Offset(lngOff, 1) = lngBwert lngOff = lngOff + 1 End If Next lngBwert Next lngAwert If lngOff = 0 Then MsgBox "Keine Lösung gefunden." End Sub
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
06.06.2018, 19:13 (Dieser Beitrag wurde zuletzt bearbeitet: 06.06.2018, 19:13 von RPP63.)
Moin Helmut und sorry vorab für das off topic! Verona Poth nannte ihren Sohn San Diego, weil er dort gezeugt wurde. Gabi Köster nahm das in einem Sketch zum Anlass, nicht allem und allen "sinnvolle" Namen geben zu müssen. Grob nach diesem Script: "Hömma, Rückbank von Papas Auto, im Wald, kommsse ma essen?"
Conclusio: Nicht immer ist ein sprechender Name sinnvoll … ;)
[/off topic]
Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Wehrdienst für nach 31.12.2007 geborene Männer. Freiwilligkeit wird nicht ausreichen; also gibt es das Losverfahren mit daraus mehr als 50% Dienstverpflichteten. Herzlichen Glückwunsch. (Ich habe 15 Monate in der Lw gedient). Weiße Jahrgänge der Bw also ca. -1937 und 1994-2007. Alternativen wie Zivildienst/Verweigerung/Soziales Jahr noch nicht besprochen.