Microsoft Excel

Herbers Excel/VBA-Archiv

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

Kleines Problem mir VBA

Betrifft: Kleines Problem mir VBA von: Alifa
Geschrieben am: 24.09.2014 08:27:13

Guten Morgen,
ich versuche, dieses Problem mit VBA zu lösen:
Von der Zahl 8 ausgehend, soll mittels 3 Rechenoperationen die Zahl 91 berechnet werden. Die Rechenoperationen:1)n/2; 2)n*10; 3)n*10+8. Operation 1) ist nur bei geraden Zahlen erlaubt. Diese Op. können beliebig oft angewandt werden. Beispiel:Die Zahl 55 soll berechnet werden. 8*10+8=88=>88*10=880=>880/2=440=>440/2=220=>220/2=110=>110/2=55.
Kann jemand helfen?
Gruß, Erhard

  

Betrifft: AW: Kleines Problem mir VBA von: Jack_d
Geschrieben am: 24.09.2014 08:55:09

Hallo Erhard

Ich stell mich grad schwer die Logik hinter deinem Problem zu finden.
Oder anders formuliert, wie bringt man dem Programm bei, was es zu tun hat?

Die Schwierigkeit die ich sehe ist die fehlende Stringenz in der abfolge der Operationen.

Ich könnte mir lediglich vorstellen, das ganze über 3 Funktionen und eine MainSub abzubilden.
ABER hier fehlen mir die logischen Kriterien. " Welche function soll aufgerufen werden"

Wie löst du denn händisch dieses Problem? Vielleicht auch am Beispiel deiner 8 & 55 erklärt?

Grüße


  

Betrifft: AW: Kleines Problem mir VBA von: Alifa
Geschrieben am: 24.09.2014 14:01:47

Hi Jack,
wenn 8("/2","*10"*,"*10+8")...das Ergebnis weiter("/2","*10"*,"*10+8")...usw bis die gesuchte Zahk, hier 55 gefunden wird. Mit 8 beginnt man, es folgt EINE der 3 Operationen. Das erhaltenen Ergebnis wird desgleichen mit einem der 3 möglichen "Element" ergänzt und berechnet...bis das Ziel(hier die Zahl 55) erreicht ist. Ich stell mir das in etwa so vor, dass man ein Array("/2","*10"*,"*10+8") festlegt und dann mit "Evaluate" die Berechnung einleitet. Händisch etwa so: 8, probier "/2"; probier weiter mit "/2";...und so weiter alle Möglichkeiten probieren. Zunächst das Ganze 10 Mal. Die Zwischenergebnisse nach jedem Schritt sollen ausgegeben werden. Hier 88,880,440,220,110,55.
Gruß, Erhard


  

Betrifft: AW: Kleines Problem mir VBA von: Peter
Geschrieben am: 24.09.2014 10:35:31

Hallo

Ein Brute-Force Ansatz der das Problem aber schnell löst

https://www.herber.de/bbs/user/92783.xlsm


  

Betrifft: AW: Kleines Problem mir VBA von: Alifa
Geschrieben am: 25.09.2014 10:02:56

Hi,
hier mein Ansatz, irgendwie klappt das noch nicht.
Gruß, Erhard

Option Explicit

'Von  der Zahl N = 8 aus, kann man drei Operationen ausführen:
'N durch 2 teilen, (darf nur gewählt werden wenn N gerade ist),
'N mit 10 multiplizieren,
'N mit 10 multiplizieren und 8 zum Produkt zählen.
'Ziel ist es von der 8 aus zu jeder andere Zahl zu gelangen.
'Z.B: zu der 91:
'8, 4, 2, 28, 288, 144, 72, 728, 364,182, 91
'Wie erreicht man nun a)  58 und b)  59?

Sub Test2509014()'hier wird das Beispiel behandelt
Dim n0, n1, n2, n3, n4, n5, n6, n7, n8, n9
Dim z%, t!, p
Dim i0&, i1&, i2&, i3&, i4&, i5&, i6&, i7&, i8&, i9&
Cells.ClearContents
t = Timer

For i0 = 0 To 2
For i1 = 0 To 2
For i2 = 0 To 2
For i3 = 0 To 2
For i4 = 0 To 2
For i5 = 0 To 2
For i6 = 0 To 2
For i7 = 0 To 2
For i8 = 0 To 2
For i9 = 0 To 2

p = Array("/2", "*10", "*10+8")

n0 = Evaluate(8 & p(i1))
n1 = Evaluate(n0 & p(i2))
n2 = Evaluate(n1 & p(i3))
If n2 Mod 2 = 0 Then
n3 = Evaluate(n2 & p(i4))
ElseIf n3 Mod 2 = 0 Then
n4 = Evaluate(n3 & p(i5))
ElseIf n4 Mod 2 = 0 Then
n5 = Evaluate(n4 & p(i6))
ElseIf n5 Mod 2 = 0 Then
n6 = Evaluate(n5 & p(i3))
ElseIf n6 Mod 2 = 0 Then
n7 = Evaluate(n6 & p(i4))
ElseIf n7 Mod 2 = 0 Then
n8 = Evaluate(n7 & p(i5))
ElseIf n8 Mod 2 = 0 Then
n9 = Evaluate(n8 & p(i6))

If n8 = 91 Then
z = z + 1
Cells(1, 1).Resize(, 8) = Array("n0", "n1", "n2", "n3", "n4", "n5", "n6", _
"n7", "n8", "n9")
Cells(z + 2, 1).Resize(, 8) = Array(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9)

End If: End If
Next: Next: Next: Next: Next: Next: Next: Next: Next: Next:

MsgBox Round(Timer - t, 1)
End Sub



  

Betrifft: AW: Kleines Problem mir VBA von: Peter
Geschrieben am: 25.09.2014 14:22:02

Hallo

Ich hab dir ja schon eine Lösung geschickt! Ist das eine Programmieraufgabe (wer hat die beste /schnellste Lösung) oder dein eigenes Interesse an VBA (in diesem Fall versuch das Problem über eine rekursive Funktion zu lösen)


  

Betrifft: AW: Kleines Problem mir VBA von: Alifa
Geschrieben am: 25.09.2014 19:39:40

Hi,
die Prozedur soll auch für andere Zahlen(außer 91) anwendbar sein. Hatte 91 gewählt, um an einem Beispiel, mit einfacher Lösung, die Aufgabe zu verdeutlichen. Rekursive Funktion? Klingt gut. Bin dankbar für eine Lösung in dieser Richtung. Was muss ich an deiner Sub ändern, um Z.B. die Zahl 58 zu ermitteln? Es ist keine Programmieraufgabe, im Sinne deiner Frage, sondern die Attraktivität von VBA.
Grüße Erhard


  

Betrifft: AW: Kleines Problem mir VBA von: Alifa
Geschrieben am: 26.09.2014 08:31:13

Hi,
da waren einige Fehler drin. So klappt das jetzt mit 91. Wäre sehr dankbar, wenn eine Lösung gefunden wird, wo auch andere Werte eingesetzt werden können.
Gruß Erhard

Sub Test2609014()
Dim n0, n1, n2, n3, n4, n5, n6, n7, n8, n9
Dim z%, t!, p
Dim i0&, i1&, i2&, i3&, i4&, i5&, i6&, i7&, i8&, i9&
Cells.ClearContents
t = Timer

For i0 = 0 To 2
For i1 = 0 To 2
For i2 = 0 To 2
For i3 = 0 To 2
For i4 = 0 To 2
For i5 = 0 To 2
For i6 = 0 To 2
For i7 = 0 To 2
For i8 = 0 To 2
For i9 = 0 To 2

p = Array("/2", "*10", "*10+8")

n0 = Evaluate(8 & p(i0))
n1 = Evaluate(n0 & p(i1))
n2 = Evaluate(n1 & p(i2))
If n2 Mod 2 <> 0 Then Exit For
n3 = Evaluate(n2 & p(i3))
If n3 Mod 2 <> 0 Then Exit For
n4 = Evaluate(n3 & p(i4))
If n4 Mod 2 <> 0 Then Exit For
n5 = Evaluate(n4 & p(i5))
If n5 > 20000 Then Exit For
If n5 Mod 2 <> 0 Then Exit For
n6 = Evaluate(n5 & p(i6))
If n6 > 20000 Then Exit For
If n6 Mod 2 <> 0 Then Exit For
n7 = Evaluate(n6 & p(i7))
If n7 > 20000 Then Exit For
If n7 Mod 2 <> 0 Then Exit For
n8 = Evaluate(n7 & p(i8))
If n8 > 20000 Then Exit For
If n8 Mod 2 <> 0 Then Exit For
n9 = Evaluate(n8 & p(i9))
If n9 = 91 Then
z = z + 1
Cells(1, 1).Resize(, 10) = Array("n0", "n1", "n2", "n3", "n4", "n5", "n6", _
"n7", "n8", "n9")
Cells(z + 2, 1).Resize(, 10) = Array(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9)
End If:
Next: Next: Next: Next: Next: Next: Next: Next: Next: Next:
MsgBox Round(Timer - t, 1)
End Sub



  

Betrifft: AW: Kleines Problem mir VBA von: Peter
Geschrieben am: 26.09.2014 09:41:04

Hallo

Anbei ein Beispiel für die rekursive Lösung. In Zelle A1 kannst du jeden beliebigen Wert eintragen in Zelle C1 die Suchtiefe (je kleiner um so schneller aber auch mit dem Nachteil das keine Lösung gefunden wird, dann Suchtiefe erhöhen. Andererseits kann eine zu hohe Suchtiefe zu einer nicht optimalen Lösung führen. Daher bei einer gefunden Lösung auch eine Ebene tiefer probieren (E1-1). Das ist gut bei Eingabe von "80" und Suchtiefe 18 zu beobachten). Eine gutes Beispiel ist die Zahl 183 (braucht eine Suchtiefe von 23). Es ist eine weitere Einschränkung im Code vorhanden: MaxLong = 20000. Ich bin davon ausgegangen das kein Lösungweg einer höhere Zahl beinhalten (Geschwindigkeits Optimierung).

https://www.herber.de/bbs/user/92826.xlsm


  

Betrifft: AW: Kleines Problem mir VBA von: Alifa
Geschrieben am: 26.09.2014 11:45:24

Hi Peter
habe "third Part" in der Sub geändert(8 auf 4), die dritte Op. mutiert in *10+4. Zu finden:48. Suchtiefe 16. In Zeile 16 ergibt das 37,40625, also eine Dezimalzahl. Mit der Zeit läuft das phantastisch! Mein Makro braucht einige Minuten, während das braucht unter 1 Sekunde! Was muss ich im Code ändern, damit der dritte Therm "*10+4" wird (anstelle "*10+8") und keine Dezimalzahl ermittelt wird?
Gruß Erhard


  

Betrifft: AW: Kleines Problem mir VBA von: Alifa
Geschrieben am: 26.09.2014 13:03:41

Vielen Dank. Das klappt jetzt. Für 16 Schritte, unter einer Sekunde, beeindruckend!
Viele Grüße und ein schönes Wochenende
Erhard


 

Beiträge aus den Excel-Beispielen zum Thema "Kleines Problem mir VBA"