Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1280to1284
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Kennzahl ermitteln
15.10.2012 07:46:51
Alifa
Hallo
für 7-stellige Zahlen, deren Ziffern 1,2 und 3 sind, ist die "Kennzahl" k bekannt. k ist die Summe der Punkte. 333=3Punkte; 22=2 Punkte: 1=1 Punkt. 1233233 hat k=1. Für 1223331 ist k=1+2+3+1=7; 1122233 hat k=0. Gültig sind Zahlen mit k=1,2,3,4,5,6 und 7. Gegeben ist die Zahl und k. Die Funktion soll Boolean Werte zurückgeben. Also 1122312 mit k=4 ist False. 1122312 mit k=3 ist WAHR(2+1=3). Danke im Voraus für die Hilfe.
Gruß, Alifa

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kennzahl ermitteln
15.10.2012 08:47:30
{Boris}
Hi Alifa,
vielleicht bin ich ja nur zu blöd, aber ich kann das Muster zwischen k und der Zahl beim besten Willen nicht erkennen...
VG, Boris

AW: Kennzahl ermitteln
15.10.2012 09:33:17
Alifa
Hi Boris,
für k=7 habe ich diese Zahlen gefunden: 1333221,1333122,1223331,2213331,3331221,1221333,1221221,3331333.
Meine Funktion:

Function Mia(ByVal z1 As Long, p) As Boolean
Dim i As Byte
For i = LBound(p) To UBound(p)
If z1 = p(i) Then
Mia = True
End If: Next
End Function

z1 ist die Zahl und p das Array mit den plausibeln Zahlen. Im Fall k=7, p=Array(1333221,1333122,...1221221,3331333)
If Mia(Clng(v1 & v2....& v7),p) Then....
v1,v2...v7 sind die 7 Ziffern(Variabeln von 1-3) von z1
Gruß, Alifa

Anzeige
Kennzahl ermitteln und prüfen
16.10.2012 11:27:56
Erich
Hi Erhard,
hier mein Vorschlag:
 ABCDE
1Vorgabengerechnet
2ZahlKennzahlrichtigKennzahlOK
312233317WAHR7WAHR
412233326WAHR6WAHR
512345671WAHR1WAHR
612332331WAHR1WAHR
711222330FALSCH2FALSCH
811223124FALSCH3FALSCH
933312216FALSCH7FALSCH

Formeln der Tabelle
ZelleFormel
C3=KennzRichtig(A3;B3)
D3=KennZahl(A3)
E3=KennzahlOK(A3;B3)

mit diesen Funktionen:

Option Explicit
Function KennzahlOK(zz As String, kk As Integer) As Boolean
KennzahlOK = KennZahl(zz) = kk
End Function
Function KennZahl(zz As String) As Integer
Dim ii As Integer, tt As String, pp As Integer, ee As Integer
For ii = 1 To 3
tt = WorksheetFunction.Rept(CStr(ii), ii)
pp = InStr(zz, tt)
While pp
If Mid(zz & "X", pp + ii, 1)  tt Then ee = ee + ii
pp = InStr(pp + ii + 1, zz, tt)
Wend
Next ii
KennZahl = ee
End Function
Function KennzRichtig(zz As String, kk As Integer) As Boolean
Dim ii As Integer, tt As String, pp As Integer, ee As Integer
For ii = 1 To 3
tt = WorksheetFunction.Rept(CStr(ii), ii)
pp = InStr(zz, tt)
While pp
If Mid(zz & "X", pp + ii, 1)  tt Then ee = ee + ii
pp = InStr(pp + ii + 1, zz, tt)
Wend
If ee > kk Then Exit For
Next ii
KennzRichtig = kk = ee
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Kennzahl ermitteln und prüfen
16.10.2012 18:22:32
Alifa
Hallo Erich,
wenn ich im Direktfenster eingebe:
?KennzahlOK(1113331,5) dann erkennt die Funktion WAHR. Doch es ist FALSCH. Die 1 zählt nur einzeln.
333=3 Punkte
1=1 Punkt
Die 1 am Anfang zählt nicht, weil sie nicht einzeln ist. Oder habe ich etwas falsch verstanden?
Gruß, Erhard

erwischt!
16.10.2012 20:14:10
Erich
Hi Erhard,
da hatte ich nur nach vorn geschaut, wobei doch Rücksicht genauso wichtig ist. :-)
Nicht nur dein Beispiel - Zeile 7 war auch falsch.
Hier mein 2. Vorschlag:
 ABCDE
1Vorgabengerechnet
2ZahlKennzahlrichtigKennzahlOK
312233317WAHR7WAHR
412233326WAHR6WAHR
512345671WAHR1WAHR
612332331WAHR1WAHR
711222330WAHR0WAHR
811223124FALSCH3FALSCH
933312216FALSCH7FALSCH
1011133315FALSCH4FALSCH
1111133314WAHR4WAHR

Formeln der Tabelle
ZelleFormel
C3=KennzRichtig(A3;B3)
D3=KennZahl(A3)
E3=KennzahlOK(A3;B3)

Und der Code:

Function KennZahl(zz As String) As Integer
Dim ii As Integer, tt As String, pp As Integer, ee As Integer
For ii = 1 To 3
tt = WorksheetFunction.Rept(CStr(ii), ii)
pp = InStr(zz, tt)
While pp
If Mid("X" & zz, pp, ii)  tt And _
Mid(zz & "X", pp + 1, ii)  tt Then ee = ee + ii
pp = InStr(pp + ii + 1, zz, tt)
Wend
Next ii
KennZahl = ee
End Function
Function KennzRichtig(zz As String, kk As Integer) As Boolean
Dim ii As Integer, tt As String, pp As Integer, ee As Integer
For ii = 1 To 3
tt = WorksheetFunction.Rept(CStr(ii), ii)
pp = InStr(zz, tt)
While pp
If Mid("X" & zz, pp, ii)  tt And _
Mid(zz & "X", pp + 1, ii)  tt Then ee = ee + ii
pp = InStr(pp + ii + 1, zz, tt)
Wend
If ee > kk Then Exit For
Next ii
KennzRichtig = kk = ee
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
nebenbei ...
16.10.2012 20:21:52
Erich
Hi Erhard,
... Günther hatte gleich die richtigen Ergebisse. :-)
Grüße aus Kamp-Lintfort von Erich

Schleifchen und noch 1 Lösung
17.10.2012 09:32:28
Erich
Hi Erhard,
damit habe ich 2233322 als 9. Lösung für k=7 gefunden:

Option Explicit
Sub schleifchen()
Dim jj As Long, zz As Long, ss As String
For jj = 0 To 5000
ss = CStr(Dez2Basis(jj, 3) + 1111111)
If Len(ss) > 7 Then Exit For
If KennZahl(ss) = 7 Then zz = zz + 1: Cells(zz, 1) = ss
Next jj
End Sub
Function Dez2Basis(ByVal Zahl As Long, basis As Integer) As String ' basis max. 16
Dim mask As Long, h
mask = 1
h = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F")
Do
mask = Zahl Mod basis
Zahl = Int(Zahl / basis)
Dez2Basis = h(mask) & Dez2Basis
Loop Until Zahl 
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Schleifchen und noch 1 Lösung
17.10.2012 12:11:43
Alifa
Hi Erich,
zunächst danke für die Hilfe!
Habe mein Makro 4 Stunden laufen lassen, ohne Erfolg. Nun will ich versuchen, zuerst alle plausibeln Zahlen zu ermitteln, so wie du für Kennziffer 7 die 9 Zahlen ermittelt hast. Dabei muss ich berücksichtigen, dass jeweils eine der 7 Ziffern vorgegeben ist. So habe ich die Sub "schleifchen" angepasst. Es entstehen Leerzellen. Kann man das auch einfacher machen?

Sub schleifchen1()
Dim jj As Long, zz As Long, ss As String
Dim s1$
For jj = 0 To 5000
ss = CStr(Dez2Basis(jj, 3) + 1111111)
If Len(ss) > 7 Then Exit For
If KennZahl(ss) = 7 Then
zz = zz + 1
If Mid$(ss, 5, 1)  2 Then ss = ""
Cells(zz, 5) = ss
End If: Next jj
End Sub

Anzeige
AW: Schleifchen und noch 1 Lösung
17.10.2012 12:42:26
Erich
Hi Erhard,
verstehe ich das richtiog, dass nur die ausgegeben werden sollen, die Kennzahl 7 haben
und wo an der 5. Stelle eine 2 steht?
Das würde ich so schreiben:

Sub schleifchen2()
Dim jj As Long, zz As Long, ss As String
Dim s1$
For jj = 0 To 5000
ss = CStr(Dez2Basis(jj, 3) + 1111111)
If Len(ss) > 7 Then Exit For
If KennZahl(ss) = 7 Then
If Mid$(ss, 5, 1) = 2 Then
zz = zz + 1
Cells(zz, 5) = ss
End If
End If
Next jj
End Sub
Sub schleifchen3()
Dim jj As Long, zz As Long, ss As String
Dim s1$
For jj = 0 To 5000
ss = CStr(Dez2Basis(jj, 3) + 1111111)
If Len(ss) > 7 Then Exit For
If KennZahl(ss) = 7 And Mid$(ss, 5, 1) = 2 Then
zz = zz + 1
Cells(zz, 5) = ss
End If
Next jj
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Variables Schleifchen
17.10.2012 11:44:15
Erich
Hi Erhard,
hier kannst du die Länge der Zahlen, die Ziffern und die Soll-Kennzahl vorgeben
und bekommst eine Liste der Lösungen:
https://www.herber.de/bbs/user/82157.xls
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Noch variableres Schleifchen
17.10.2012 20:48:16
Erich
Hi Erhard,
hier kann man auch noch eine feste Ziffer und die Position, an der sie stehen muss, vorgeben:
 ABCDE
1121333122  Vorgaben 
212212232233Länge9 
3122133312 Ziffern3 
4122322122333233322Kennzahl8 
5131333122 mit Ziffer2oder 0
6132233322 an  Position9oder 0
7133312122    
8133312212    
9133313122    
10133313332    
11133322322    
12212233322    

Das rechnet dieser Code:

Sub schleifchen()
Dim xLen As Long, xZif As Integer, xSol As Long
Dim xEin As String, xPos As Integer, bolJ As Boolean
Dim jj As Long, zz As Long, ss As String
xLen = Cells(2, 4)
xZif = Cells(3, 4)
xSol = Cells(4, 4)
xEin = Cells(5, 4)
xPos = Cells(6, 4)
Columns(1).Resize(, 2).ClearContents
For jj = 0 To 3000000
ss = CStr(0 + Dez2Basis(jj, xZif) + WorksheetFunction.Rept("1", xLen))
If Len(ss) > xLen Then Exit For
If KennZahlX(ss, xZif) = xSol Then
bolJ = False
If xEin = "0" Or xPos = 0 Then
bolJ = True
ElseIf Mid(ss, xPos, 1) = xEin Then
bolJ = True
End If
If bolJ Then
zz = zz + 1
Cells(zz, 1) = ss
Cells(2, 2) = zz
Cells(4, 2) = ss
DoEvents
End If
End If
Next jj
End Sub
Und hier die SpielMappe: https://www.herber.de/bbs/user/82170.xls
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Noch variableres Schleifchen
18.10.2012 00:14:08
Alifa
Hi Erich,
der Code passt. Doch in meiner Anwendung gibt es sehr viele Möglichkeiten, so dass es zeitlich hakt.
Beim Raster 4x4 ist die Lösung in Bruchteilen von einer Sekunde da. Beim Raster 7x7 kommt in 2 Stunden nichts zustande.
Gruß Erhard

etwas schnelleres Schleifchen
21.10.2012 12:56:59
Erich
Hi Erhard,
probier mal: https://www.herber.de/bbs/user/82237.xls
Ich wünsch Dir noch einen schönen Rest-Sonntag!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: etwas schnelleres Schleifchen
21.10.2012 16:32:59
Alifa
Hi Erich,
mittlerweile habe ich das 7x7 Raster lösen können, in 124 Sekunden. Mit Deinem Makro habe ich für die vorgegebenen Kennzahlen einige Bereiche ermittelt, wo es wenige Möglichkeiten gab. Diese 7-stelligen Zahlen jeweils in Array's verpackt. For Each (7-stellige) In Array...
Hoffentlich ist in Kamp-Lintfort auch so ein angenehmer Spätherbsttag!
Viele Grüße
Erhard

Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige