Microsoft Excel

Herbers Excel/VBA-Archiv

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

Zeichenkette mit Sequenzen

Betrifft: Zeichenkette mit Sequenzen von: Alifa
Geschrieben am: 14.11.2014 11:20:39

Hallo,
Die Zeichenkette besteht aus 11 Zeichen. Zahlen von 0 bis 9. in jedem String sollen die Zeichen unterschiedlich sein. Der String kann eine bis fünf Sequenzen ohne Null enthalten. Die Quersummen dieser Sequenzen sind vorgegeben. Beispiel String mit 2 Sequenzen und Quersummen 21 und 15: 00984000762. Der String 00109870650 ist WAHR für 3 Sequenzen (1,987,65) mit den Quersummen 1,24,11. Mein Ansatz: Ein Macro mit der Function Sequenzen(Byval Sequenz1,Quersumme1,...Sequenz(n),Quersumme(n). Hier n=3. Oder ist für jeden String mit unterschiedlicher Anzahl von Sequenzen ohne Null eine Funktion notwendig? Die Sequenzen gelten von rechts nach links. Danke im Voraus!
Alifa

  

Betrifft: Meinst du das so, ... von: Luc:-?
Geschrieben am: 14.11.2014 12:59:26

…Alifa:

 ABC
1001098706501,24,11WAHR
20098400076221,15WAHR
3007824000752121,15WAHR
4C1[:C3]:=B1=MaskOn(DiSum(WECHSELN(A1;0;"."));"num";;",")
5B3:=MaskOn(DiSum(WECHSELN(A3;0;"."));"num";;",")
Habe jetzt mal der Einfachheit halber meine UDFs benutzt.
Gruß, Luc :-?


  

Betrifft: AW: Meinst du das so, ... von: Alifa
Geschrieben am: 14.11.2014 16:34:01

Hallo Luc,
ich versuche das zu verdeutlichen

Sub TesteKetten()
Dim a, b, c, d, e, f, g, h, i, j, k, s
For a = 1 To 9
For b = 1 To 9
For c = 1 To 9
For d = 1 To 9
For e = 1 To 9
For f = 1 To 9
For g = 1 To 9
For h = 1 To 9
For i = 1 To 9
For j = 1 To 9
For k = 1 To 9

s = CStr(a & b & c & d & e & f & g & h & i & j & k)

If Verschieden(Replace(s, 0, "")) Then

'jetzt folgt die Bedingung: s hat 2 Sequenzen(sequ1 und sequ2)
'deren Summen s1=21 und s2=15 sind
If Sequenzen(s, 2, 21, 15) Then ' Sequenzen ist die Funktion, die noch
'erfunden weden soll...
's=00984000762 oder s=98400007620 oder s=05970000438....
'es gibt also mehrere Lösungen. Mit zusätzlichen Bedingunen(die hier nicht
'von Bedeutung sind) grenze ich die Ergebnisse ein
MsgBox a
End Sub
'alle Ziffern unterschiedlich.Beispiel:Verschieden(Cstr(a1 & a2 & a3))
Function Verschieden(ByVal Zahl As String, Optional i As Integer) As Boolean
For i = Len(Zahl) To 1 Step -1
If Len(Zahl) - Len(Replace(Zahl, Mid$(Zahl, i, 1), "")) <> 1 Then Exit For
  Next
   Verschieden = i = 0
End Function

Gruß, Alifa


  

Betrifft: Na, da scheint ja noch Anderes im HGrd zu ... von: Luc:-?
Geschrieben am: 14.11.2014 18:28:53

…liegen, was du hier nicht thematisieren willst, Alifa;
bisher bin ich nämlich davon ausgegangen, dass das HptProblem die Bildung einer Quersummen­Folge über eine (hier durch 0) unter­brochene Ziffernfolge ist. Dabei wäre der Ersatz von 0 durch "" kontra­produktiv, denn die Ziffernfolge wäre dann ja nicht mehr unter­brochen.
Vielleicht käme es ja wirklich erstmal nur darauf an, was man statt deiner geplanten Fkt Sequenzen auch mit meiner UDF DiSum, der Lösung von XlFmln nach Splitten der Ziffernfolge in selbständige Einzelteile (Sequenzen) oder den dir bereits im Okt2009 bzw Jan2014 aufgezeigten Möglichkeiten bewältigen kann.
Die DiSum-Fml kann übrigens auch so aussehen:

 ABC
1ZiffernfolgeSeqzQSumVorgabeBestätigung
2001098706501,24,11WAHR
30098400076221,15WAHR
4007824000752121,15WAHR
5C2[:C4]:=B2=WECHSELN(DiSum(GLÄTTEN(WECHSELN(A2;0;" ")));" ";",")
Du scheinst es umgekehrt versuchen und direkt nach der Vorgabe­Sequenz in der unterbrochenen Ziffern­folge suchen zu wollen, was ich für ein doch sehr (bzw zu) spezifisches Einsatz­Gebiet einer solchen Fkt halte. Es ist idR immer günstiger, allgemeinere Lösungs­möglich­keiten zu nutzen als einen solchen „insularen“ Aufwand zu treiben (vor allem, wenn man das nicht selber schafft!)… ;-)
Luc :-?


  

Betrifft: Ansatz - schnarchlangsam von: Erich G.
Geschrieben am: 15.11.2014 17:32:48

Hi Erhard,
probier mal den folgenden Code. Er ist recht kurz, dafür aber umso langsamer:

Option Explicit

Sub Sequ()
   Dim arQ, aa As Long, zz As Double, arS, ii As Long, jj As Long, ss As Long
   Dim ee As Long, arT() As Boolean, arZ(0 To 9) As Boolean

   arQ = Array(1, 14, 11)           ' Beispiel: Quersummen für 3 Sequenzen

   aa = UBound(arQ)
   For zz = 1 To 99999999999#
      Application.StatusBar = zz & " / " & ee
      DoEvents
      arS = Split(Application.Trim(Replace(zz, "0", " ")))
      If aa = UBound(arS) Then
         ReDim arT(aa)
         For ii = 0 To aa
            Erase arZ
            For jj = 1 To Len(arS(ii))                ' in Sequ. keine doppelte Ziffer
               If arZ(Mid(arS(ii), jj, 1)) Then Exit For Else arZ(Mid(arS(ii), jj, 1)) = True
            Next jj
            If jj <= Len(arS(ii)) Then Exit For       ' Dublette gefunden
            ss = 0
            For jj = 1 To Len(arS(ii))                ' Quersumme der Sequenz
               ss = ss + Mid(arS(ii), jj, 1)
            Next jj
            For jj = 0 To aa                          ' Quersumme in Vorgabe gefunden
               If ss = arQ(jj) And Not arT(jj) Then arT(jj) = True: Exit For
            Next jj
         Next ii
         If ii > aa Then
            For jj = 1 To aa                          ' alle Vorgabe-Quersummen gefunden?
               arT(0) = arT(0) And arT(jj)
            Next jj
            If arT(0) Then
               ee = ee + 1                            ' Ausgabezeile
               Cells(ee, 1) = Time
               Cells(ee, 2) = zz
               Cells(ee, 3).Resize(, aa + 1) = arS
            End If
         End If
      End If
   Next zz
   Application.StatusBar = False
End Sub
Kommen da die Ergebnisse raus, die du haben wolltest?

Ein Tipp: Bei Vorgabe der Quersummen mit Array(1, 14, 11) ist 1029059 der erste Treffer,
also kannst du die zz-Schleife statt bei 1 besser bei z. B. 1029050 starten lassen.

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich und: Ein schönes Wochenende allerseits!


  

Betrifft: Aha, du gehst also davon aus, ... von: Luc:-?
Geschrieben am: 15.11.2014 17:58:34

…Erich,
dass Alifa für die jeweilige Quersummen­Sequenz alle möglichen Zahlenfolgen erst ermitteln will. Dann dürfte aber nur die Unterbrechung durch eine 0-Sequenz beliebiger Länge eine Rolle spielen, wodurch dann die Ergebnisse noch durch diese verschieden­langen 0-Sequen­zen modifizierbar wären. Dadurch wäre es …
1. nicht verwunderlich, dass das lange dauert, und …
2. auch irgendwie irrwitzig, …
weshalb ich davon ausging, dass feststehende Ziffern­folgen (auch gestützt durch ver­schieden­lange 0-Sequen­zen) nur darauf unter­sucht wdn sol­len, ob sie einer eben­falls fest­stehenden Quer­summen­Sequenz genügen, zumal er ja auch etwas von vorheriger Ein­gren­zung (mit nicht genannten Methoden) schrieb.
Deshalb nahm ich an, dass er nur einen ungünstigen Ansatz gewählt hat, um dieses Ziel zu erreichen, was bei Zutreffen meiner Ver­mu­tung recht einfach und schnell (wie von mir demonstriert) zu erreichen wäre.
Aber bei der Art der Aufgabenstellungen, die er bisher hier nachgefragt hat, würde mich die Richtigkeit deiner Interpretation auch nicht sonderlich verwundern…
Gruß + schöWE, Luc :-?


  

Betrifft: AW: Ansatz - schnarchlangsam von: Alifa
Geschrieben am: 16.11.2014 11:24:25

Hallo Erich,
es geht um 11 Zeilen und 11 Spalten(wie beim Kreuzworträtsel). Die 0(schwarze Felder) dient zum Trennen der Sequenzen. Man könnte auch einen Buchstaben nehmen. Bei N Sequenzen sind mindestens N-1 "Trennungen"(Tr). Die Kette mit den 5 Sequenzen (deren Quersummen: 10,9,6,3,8) könnte folgendes "Muster" haben: nn0nn0n0n0n oder 0nn0n0n0non oder...Wenn mit solchen "Mustern" vorgegangen wird, ist die größte "Zahl" siebenstellig und kann schneller abgearbeitet werden, als eine 11 stlg. Im String(11 Zeichen) müssen alle Ziffern unterschiedlich sein. Ich habe Dein Makro mit meiner Kette mit 3 Sequenzen und deren Quersummen(8,7,19) geprüft. Ein Ergebnis war: B=8070793; C=8; D=7; F=793. Die Bedingung(alle Ziffern verschieden) ist nicht erfüllt. Vielleicht kann man das nicht lösen, da es zu viele Möglichkeiten gibt und die Berechnungen zu lange dauern. Wenn man die Ketten einzeln berechnen lässt, dann mit Deiner Sub "NoDubs" die Anzahl der Möglichkeiten reduziert...
Viele Grüße, Erhard






  

Betrifft: Typischer Fall (wie aus dem Lehrbuch für ... von: Luc:-?
Geschrieben am: 16.11.2014 18:49:27

…Problemlösungstrainer), Erhard;
immer schön nicht das eigentliche Problem benennen, sondern nur nach auftretenden Problemen bei eigenen Lösungs­ansätzen fragen und damit eine ggf mögliche rationalere Heran­gehens­weise verhindern, da doch viele nur ungern für den Papierkorb arbeiten… :->
Glücklicherweise habe ich hier, dank meiner Mittel, nicht so viel Zeit investieren müssen wie jetzt wohl Erich…
Nebenbei, ich denke, dass das (ggf auch ohne lange Laufzeiten) lösbar ist!
Luc :-?


  

Betrifft: AW: Typischer Fall (wie aus dem Lehrbuch für ... von: Alifa
Geschrieben am: 16.11.2014 21:21:28

Ich denke, du hast viel zu viel Zeit für dieses Thema investiert, Luc! Wen kümmert deine "Hilfe"? Wohl keinen!
Alifa


  

Betrifft: Wenn du dich da nicht mal irrst, ... von: Luc:-?
Geschrieben am: 17.11.2014 15:09:11

…Erhard;
schau einfach mal über den Tellerrand deiner selbstgemachten Probleme! :->
Ich habe auch eine Lehrberechtigung und in dem dafür erforderlichen Kurs ist genau das von dir hier gezeigte und von mir beschriebene Verhalten thematisiert worden. Es ist also in Fachkreisen bekannt und du bist, falls dich das tröstet, beileibe kein Einzelfall. Allerdings macht es unter diesen Umständen wenig Freude, dir helfen zu wollen, weshalb ich das auch nur in Einzelfällen wie hier versuche. Natürlich wiedermal umsonst…
Könnte an unseren, evtl (weit zurückliegend) gemeinsamen Vorfahren liegen, dass wir beide relativ kompliziert denken. Nur kommt bei mir auch etwas allgemein Brauchbares dabei heraus (könnte aber auch der preußische Einfluss beteiligt sein)…! ;-]
Gruß, Luc :-?

Besser informiert mit …