Hallo,
ich möchte ein Feld in Excel Prüfen, ob zum Beispiel 5 Mal eine 0
aneinander gereiht ist. Dabei sollen auch Diagonalen mit einbezogen
werden.
Das Feld sieht zum Beispiel so aus:
Meine Idee war eigentlich mit Bereich verschieben die Anzahl der Nullen
mit einem bestimmten Wert zu vergleichen. Wie man im Beispiel 4 aber
sieht, ist dies nicht möglich. Soweit ich weiß kann Excel auch nicht
Diagonal vorgehen.
Hat jemand eine Lösungsidee bzw weiß, ob dies Überhaupt machbar ist?
Die Diagonale Komponente muss leider mit rein.
Tja, eigentlich ganz einfach: Lauter Wenn()-Anweisungen benutzen.
Oder vielleicht doch ein VBA-Skript...das macht auch Arbeit, aber
weniger Schmerzen.
Ist das Feld beliebig groß, oder bleibt es bei 5x5? Was wird das? Eine
Excel-Variante von vier gewinnt in Excel, da der Chef den
Internetverkehr auf Browsergames überwacht? (Ich warte ja darauf, das
jemand mal Bomberman oder ein Flugzeugspiel in Excel realisiert... :D)
Wühlhase schrieb:> Internetverkehr auf Browsergames überwacht? (Ich warte ja darauf, das> jemand mal Bomberman oder ein Flugzeugspiel in Excel realisiert... :D)
Schach in Excel mit schönen Spielfiguren macht auch Spass.
Nachdenken muss man nur kurz beim Färben des Spielfelds.
sgd schrieb:> Geht bestimmt noch schöner.
Was ist schön?
Elegant wäre eine benutzerdefinierte Excelfunktion, die eine 5x5-Matrix
nimmt und einen Wahrheitswert zurückgibt.
So schön die sind, haben solche Funktionen bei mir die Neuberechnung
eines simplen Tabellenblatts immer ausgebremst.
Wühlhase schrieb:> Ist das Feld beliebig groß, oder bleibt es bei 5x5?
es sollte beliebig groß sein.
Wühlhase schrieb:>> 5 Summen horizontal,>> 5 Summen vertikal,>> 2 Summen diagonal
klingt schon mal gut, realisiere ich das wie folgt:
A1+B2+C3+D4+E5 als erste diagonale
E1+D2+C3+B4+A4 als zweie diagonale
Wie erweitere ich das auf eine beliebige Anzahl?
Ich müsste da praktisch immer Bereich verschieben nutzen oder?
m. s. schrieb:> Wie erweitere ich das auf eine beliebige Anzahl?> Ich müsste da praktisch immer Bereich verschieben nutzen oder?
Ich sehe keine tabellenblattorientierte Lösung, es sei denn eine
benutzerdefinierte Funktion.
m. s. schrieb:> Wie erweitere ich das auf eine beliebige Anzahl?
Wird die zu überprüfende Reihe dann auch immer angepasst, also
5x5 -> 5
6x6 -> 6
(...)?
Dann gibt es immer nur diese zusätzlichen zwei Diagonalen
zu den "einfachen" Reihen und Spalten.
Ich würde das dynamisch in VBA lösen.
Ich würde es auch per VBA versuchen, ist finde ich deutlich schneller zu
realisieren als über tausende WENN() abfragen...
Diagonalabfragen für beleibig große Felder...
Zeile 1 stehen lassen, Zeile 2 um eins nach links verschieben, Zeile 3
um zwei nach links verschieben... usw
Das gleiche dann noch mit nach rechts verschieben, dann musst du nur
noch vertikal und horizontal prüfen und das ist wirklich schnell
erledigt
Nop schrieb:> als über tausende WENN() abfragen...
Sind doch nur 3.
So aus dem Kopf:
WENN (A1=0; WENN (A2=0 ...
WENN (A1=0; WENN (B1=0 ...
WENN (A1=0; WENN (B2=0 ...
Bei größeren Feldern ist A1 dann eine "relative Adresse" die (in 5er
Schritten) durchgezählt wird
Moin,
ich fand das Problem interessant darum hab ich mal ne Excel gebastelt.
Ist vielleicht nicht schön aber es funktioniert.
Für jede Zeile bildest du die Summe über die ensprechende Anzahl der
Zellen in denen maximal eine 0 vorkommen darf. Dasselbe für Spalten und
Diagonalen und am Ende guckst du ob in den so enstandenen Matritzen eine
0 steht. Wenn ja, dann hast du irgendwo deine Zeile/Spalte/Diagonale mit
den x nullen.
Ist schwer zu erklären darum guck dir einfach mal die Excel an.
Vielleicht hilfts ja.
Ansonsten ist es mit VBA ein 3-Zeiler. (Vielleicht 5 :D )
Das funktioniert jetzt super!
Vielen Dank!
Meine Überlegung wäre jetzt noch:
Ist es möglich, das ganze so zu ergänzen, dass zusammenhängende Felder
mit dem Wert 0 gezählt werden, egal ob die horizontal, vertikal oder
anders zueinander liegen?
Meine Idee dafür wäre, dass ich jedes Feld auf den Wert 0 Prüfe.
Wenn das Feld 0 ist, soll die Zeile-1 Spalte-1, Zeile-1, zeile-1
Spalte+1,
spalte-1,spalte+1 etc berechnet werden, um die umliegenden felder dann
auch jeweils auf den wert zu prüfen. Gleichzeitig soll ein Zähler für
die Maximale Anzahl erreicht werden. ist dieser erreicht, dann soll es
stoppen.
Ich weiß, dass dieses Vorgehen ein riesen Code für excel wäre, aber es
wäre interessant.
Hi,
sicher nicht die sauberste Lösung, aber es könnte zum Denken anregen:
1
Sub test()
2
Dim rng As Range
3
Set rng = Range("A1")
4
5
Debug.Print ThrewSize(rng)
6
End Sub
7
8
Function ThrewSize(First As Range)
9
Dim allCols As Range
10
Dim test As Boolean
11
12
test = True
13
14
lastCol = First.End(xlToRight).Column
15
lastRow = First.End(xlDown).Row
16
17
Set allCols = Range(First, Cells(lastRow, lastCol))
18
19
'test first row horincontal
20
For Each hc In Range(First, Cells(First.Row, lastCol)).Cells
21
If TestVertical(hc, allCols.Rows.Count) Then
22
test = False
23
Exit For
24
End If
25
Next hc
26
27
'test first col vertical
28
29
ThrewSize = test
30
End Function
31
32
Function TestVertical(cell, Size As Integer)
33
Dim test As Boolean
34
test = True
35
36
For i = 0 To Size - 1
37
If cell.Offset(i, 0).Value = 1 Or Not test Then
38
test = False
39
Exit For
40
End If
41
Next i
42
43
TestVertical = test
44
End Function
ich habe jetzt nur Horinzontal gemacht...
=> geprüft müssen ja nur (wenn ichs richtig verstanden habe) die erste
Zeile, die erste Spalte und die beiden Max-Diagonalen...
im Sub test, gibst du die erste Zelle an... daraus kann man dann die
Matrix erkennen <- egal wie groß... sollte die Matrix nicht Quadratisch
sein müsste man halt das selbe Spiel für die Diagonalen machen und die
0er mitzählen... aber Offset(1,1) ist ja jetzt auch keine kunst <-
ebenso negativ...
Ab jetzt sollte es für jemanden der den VBA-Editor aufbekommt eigentlich
von alleine gehen... die einzige offene Frage ist geht es evtl. "noch
eleganter"
=> z.B. Summen Bilden, <- wobei das in den Diagonalen trotzdem auf
solche for eaches hinauslaufen würde
cheers pet
Maddin S. schrieb:> Das wird in Excel nichts. Selbst in VBA ist das keine leichte Aufgabe,> weil du nicht weißt wie groß der Bereich mit zusammenhängenden nullen> ist.
So als Idee:
Was wäre wenn die Tabelle auf ein zweites Tabellenblatt gespiegelt wird
wo die Nullen als Einsen und alle anderen Zahlen als minus 1 Million
erscheinen?
Dann könnte doch die Summe des Bereichs so langen berechnet werden bis
Sie negativ wird. Das muss man dann vermutlich horizontal und vertikal
machen.
Ich habe es jetzt so verstanden, dass gezählt werden soll wie viele
nullen in dem gesamten Bereich zusammenhängend sind.
0 1 1 0 0
1 0 0 1 1
0 0 1 1 0
1 0 1 0 1
0 0 0 1 0
Hier sind zum Beispiel alle nullen zusammenhängend. Die Ausgabe müsste
dann die Anzahl der nullen sein also 14. Hab ich das richtig verstanden?
Und wenn man das Beispiel leicht ändert hat man plötzlich zwei Gruppen
zusammenhängender nullen:
0 1 1 0 0
1 0 0 1 1
1 1 1 1 0
1 0 1 0 1
0 0 0 1 0
5 oben und 7 unten. Denkbar wäre dann eine Ausgabe, dass jede null durch
die Anzahl der angrenzenden nullen ersetzt wird. also so:
5 1 1 5 5
1 5 5 1 1
1 1 1 1 7
1 7 1 7 1
7 7 7 1 7
Maddin S. schrieb:> 5 oben und 7 unten. Denkbar wäre dann eine Ausgabe, dass jede null durch> die Anzahl der angrenzenden nullen ersetzt wird. also so:>> 5 1 1 5 5> 1 5 5 1 1> 1 1 1 1 7> 1 7 1 7 1> 7 7 7 1 7
Hallo Maddin, das sieht super aus!
Wie hast du das gemacht ?
X4U schrieb:> Was wäre wenn die Tabelle auf ein zweites Tabellenblatt gespiegelt wird> wo die Nullen als Einsen und alle anderen Zahlen als minus 1 Million> erscheinen?>> Dann könnte doch die Summe des Bereichs so langen berechnet werden bis> Sie negativ wird. Das muss man dann vermutlich horizontal und vertikal> machen.
Das habe ich nicht ganz verstanden
Petra schrieb:> Sub test()> Dim rng As Range> Set rng = Range("A1")>> Debug.Print ThrewSize(rng)
Danke für deine Mühe Petra. VBA mag ich aber leider gar nicht und es
sollte automatisch erfolgen :/
m. s. schrieb:> Petra schrieb:>> Sub test()>> Dim rng As Range>> Set rng = Range("A1")>>>> Debug.Print ThrewSize(rng)>> Danke für deine Mühe Petra. VBA mag ich aber leider gar nicht und es> sollte automatisch erfolgen :/
Eine VBA-Funktion läßt sich einfach in einer Formel benutzen. Die wird
dann, wie alle anderen auch, automatisch berechnet.
m. s. schrieb:> Maddin S. schrieb:>> 5 oben und 7 unten. Denkbar wäre dann eine Ausgabe, dass jede null durch>> die Anzahl der angrenzenden nullen ersetzt wird. also so:>>>> 5 1 1 5 5>> 1 5 5 1 1>> 1 1 1 1 7>> 1 7 1 7 1>> 7 7 7 1 7>> Hallo Maddin, das sieht super aus!> Wie hast du das gemacht ?
Das war leider nur ein Beispiel wie die Ausgabe aussehen könnte, weil
ich mir auch nicht sicher war, ob du das so gemeint hast.
Ich hab jetzt auch nochmal längere Zeit nachgedacht und selbst in VBA
fällt mir keine Lösung für das Problem ein, weil es doch viel komplexer
ist als ich zunächst dachte. Bin gespannt ob da jemand ne Idee hat.
Nochmal die Frage, soll es bei den 5x5 Feldern bleiben oder können die
sich auch in der Größe unterscheiden (25x25? Oder vielleicht auch nicht
quadratisch?)?
Und bleibt es auch bei dem Inhalt von 1en und 0en?
Wie genau soll das später in deinem Excel Workbook aussehen? Sind
mehrere Tabellen auf einem Arbeitsblatt oder nur eine die dann beliebeig
groß ist?
Ein paar Informationen bräuchten wir schon wenn du eine fertige Datei
haben möchtest oder zumindes passende Informationen.
Aber der Ansatz mit der Überprüfung ob sich in einem benachbarten Feld
einen entspechende Zahl befindet würde ich weiter befolgen. Ich denke
auch nur so lässt sich das sinnvoll "berechnen".
Oder reicht es dir zum Beispiel auch wenn alle 0en eingefärbt werden und
du sie dann selber zählen müsstest?
Die Feldgröße darf variabel sein.
Es ist nur eine Tabelle auf einem Arbeitsblatt. Diese hat eine feste
Größe von 800*600.
Im Prinzip reicht mir die "einfachere Lösung" für ein 5x5 Feld, dann
kann ich mir den Rest selbst zusammen bauen.
Es steht nur 0 oder 1 in jeder Zeile
Also wenn dir das einfärben reichen sollte (musst dann halt selber noch
die zusamnhänge erkennen und die Blöcke zählen), dann sollte das
funktionieren:
1
Private Sub test()
2
Dim LetzteZeile As Integer, LetzteSpalte As Integer
3
Dim Matrix() As Variant
4
Dim MatrixZeile As Integer, MatrixSpalte As Integer
Das Programm erkennt aber nicht deine usprüngliche Frage mit fünf 0en in
Reihe usw.
Sollen es denn immer fünf 0en in Reihe sein oder ändert sich die Zahl
auch dynamisch mit der Feldgröße?
Ich kann dir dann eine fertige Excel hier hochladen
Die Feldgröße ist Dynamisch. Die gesucht Zahl ist aber immer 0.
Ich möchte praktisch immer wissen, wie groß die größte zusammenhängende
"Null-Folge" ist, sprich der höchsten Anzahl von zusammenhängenden
Nullen.
Vielleicht könnte man das so lösen:
0 suchen, von 0 ausgehend alle 8 angrenzenden Zellen kontrollieren, ob
dieser benachbarten Zellen ebenfalls 0 ist. Falls ja, Adresse dieser 0
merken und das Selbe Prinzip weiterlaufen.
Dabei wäre nur drauf zu achten, dass man die Adresse der letzten 0 nicht
berücksichtigt, das dies dann eine Endlosschleife wäre.
Leider kenne ich mich in VBA gar nicht aus :/
Me schrieb:> Ich kann dir dann eine fertige Excel hier hochladen
Das wäre super.
Wenn nicht nur Reihen, sondern auch Spalten und Diagonalen
berücksichtigt werden könnten und die Feldgröße variabel ist, wäre dies
perfekt.
Zu den Diagonalen habe ich hier etwas gefunden:
http://www.excelformeln.de/formeln.html?welcher=88
Variable Zeilen und Spalten lassen sich eigentlich über Summen ganz gut
lösen, indem man die Startadresse vorgibt und als Endadresse zum
Beispiel startadresse+8 eingibt, über indirekt().
Vielleicht hilft dir das
m. s. schrieb:> Ich möchte praktisch immer wissen, wie groß die größte zusammenhängende> "Null-Folge" ist, sprich der höchsten Anzahl von zusammenhängenden> Nullen.
Ich glaube wir reden immer noch aneinander vorbei...
Du hast in deinem ersten Post ein Beispiel gemacht, in der du meintest
wenn in einem 5x5 Feld 5 mal eine 0 in Reihe, Spalte oder diagonal
vorkommt sell es gemeldet werden. In deinem "alles OK" Beispiel sind 3
0en diagonal. Soll in dem Fall diese gemeldet werden. Wann gebau soll
denn jetzt eigentlich ein Fehler kommen? Wenn eine ganze Reihe voll mit
0en ist oder nur fünf am Stück? Deine jetzige Aussagen passen irgendwie
nicht mehr zu deinem ersten Post...
Falls es dir wirklich nur um benachbarte 0en und deren benachbarte 0en,
und deren benachbarte... Usw... geht... Das wird schwierig, daher das
Skript das die alle 0en einfärbt und du sie eben selber noch zahlen
musst
Guck dir mal mein Beispiel von oben an. mit den 5 nullen in einer
Reihe/Spalte/Diagonale hat das nichts mehr zu tun. Er möchte, dass die
maximale Anzahl zusammenhängender nullen zurückgegeben wird. Die können
irgendwie zusammenhängen, solange sie sich quer, längs oder diagonal
berühren.
Maddin S. schrieb:> Guck dir mal mein Beispiel von oben an. mit den 5 nullen in einer> Reihe/Spalte/Diagonale hat das nichts mehr zu tun. Er möchte, dass die> maximale Anzahl zusammenhängender nullen zurückgegeben wird. Die können> irgendwie zusammenhängen, solange sie sich quer, längs oder diagonal> berühren.
Danke, so eine Aussage habe ich gesucht.
Und die Antwort ist...
Soetwas wird kaum realisierbar sein.
m.s. dein Ansatz ist richtig und so wollte ich es auch angehen, es ist
jedoch "etwas" schwieriger als gedacht...
Außerdem werde ich dafür nicht bezahlt :D
Mit einem 5x5 Quadrat würde es mir auch schon reichen.
Auch wenn nur Vertikal und Horizontal drin sind.
Diagonal wäre ein guter Zusatz, aber kein muss!
Es würde auch reichen, wenn mir jemand ein Programm zeigt, dass
in einem X mal X großem Feld (größe dürft ihr euch aussuchen) die anzahl
der aneinander hängenden nullen zählt.
Dann würde ich mein variables Feld einfach mit vielen dieser Quadrate
abdecken (bereich verschieben) .
m. s. schrieb:> Es würde auch reichen, wenn mir jemand ein Programm zeigt, dass> in einem X mal X großem Feld (größe dürft ihr euch aussuchen) die anzahl> der aneinander hängenden nullen zählt.>> Dann würde ich mein variables Feld einfach mit vielen dieser Quadrate> abdecken (bereich verschieben) .
Du bist gut... Programm zeigen und dann nicht mal wissen wie man einen
VBA Code in Excel einfügt...
Was auch immer du jetzt schon wieder mit der horizontalen und vertikalen
meinst...
Was willst du denn jetzt eigentlich??!!!
Aneinanderreihen ODER horizontal, vertikal und diagonal??
Das ist was komplett unterschiedliches!
Ich glaube du solltest dir erst mal im klaren sein was du eigentlich
willst und nicht jeden Tag etwas anderes fordern...
Für die Aneinanderreihung aller 0en habe ich jetzt eine funktionierede
Datei, welche auch anzeigt wie viele 0en aneinandergereiht sind
Me schrieb:> Was auch immer du jetzt schon wieder mit der horizontalen und vertikalen> meinst...> Was willst du denn jetzt eigentlich??!!!> Aneinanderreihen ODER horizontal, vertikal und diagonal??> Das ist was komplett unterschiedliches!
Naja, ich sag es mal so:
Das horizontale und vertikale , bzw Zeilen und Spaltenweise prüfen, wie
viele Nullen aneinander hängen, ist sozusagen eine Vereinfachung der
anderen Version.
Da zu der komplexen Aufgabe niemand ein Idee hatte, wollte ich wissen,
ob vielleicht jemand diese Vereinfachung lösen kann.
Me schrieb:> Für die Aneinanderreihung aller 0en habe ich jetzt eine funktionierede> Datei, welche auch anzeigt wie viele 0en aneinandergereiht sind
Du hast das hier aber super gelöst.
Das ist genau das was ich brauche! Sieht super aus!
Wie hast du es gemacht?
Komplett in VBA gelöst.
Als erstes wird jeder 0 ein Index zugewiesen, also eine fortlaufende
Zahl.
Im zweiten Schritt prüfe ich dann jedes benachbarte Feld jedes einzelnen
Felds auf eine 0 ab. Ist es eine 0, dann bekommen sie den gleichen Index
wie sie selbst.
Ist das erledigt, gibt es immer noch zu viele Indizes, daher lasse ich
den Vorgang öfters durchlaufen.
Danach werden größere benachbarte Felder zusammengefügt indem alle
Indizes eines Feldes gleich dem andern Feld gesetzt werden.
Anschließend werden dann die Indizes neu nummeriert, sodass diese wieder
eine fortlaufend Nummer sind. Jedes 0er Feld hat nun seine eigene
Indexnummer.
Anhand dieser Nummer wird dann die Farbe bestimmt.
Fehlt nur noch die Anzahl der 0en pro Index zu zählen und das in das
jeweilige Excel-Feld zu schreiben.
Respekt!
Das ist genau das, was ich gesucht habe!
Vielen Dank für deine Mühe, ich weiß diese zu schätzen!
Du hast deinen Code mit einem Kennwort versehen, ich würde diesen Code
gerne um einige Zeilen und Spalten erweitern, verrätst du mir das
Kennwort?
Ja habe ich.
Wie gesagt, dein Feld kann so groß sein wie es will.
Es wird immer erkannt und das Makro skaliert dynamisch mit. Nur die
Makrolaufzeit wird logischerweise eben höher.
Du musst keine Spalten oder Zeilen hinzufügen...
Und nein, sonst hätte ich es nicht so eingestellt :)
Me schrieb:> Es wird immer erkannt und das Makro skaliert dynamisch mit.
Das ganze funktioniert aber nicht, wenn sich in leeres Feld dazwischen
befindet.
Wenn ich in Zeile 38 ein paar Nullen einfüge, aber ein Feld freilasse,
dann funktioniert das ganze nicht mehr
Du kannst auch nicht einfach eine Zeile oder Spalte freilassen, da ich
auf leere Zeilen/SPalten abfrage und so die Feldgröße bestimme...
Außerdem kannst du da nicht einach im Code eine Spalten kunzufügen...
hahaha
m.s. schrieb:> Es ist nur eine Tabelle auf einem Arbeitsblatt.
Hier das hast du geschreiben und so habe ich es umgesetzt!
Es war nie die Rede von Leerzeilen un deiner Tabelle...
Wo wir wieder bei dem Punkt sind, klar und präzise Forderungen stellen
und die NICHT im Laufe des Projekts oder noch besser nach Abschluss
ändern...
Me schrieb:> Wo wir wieder bei dem Punkt sind, klar und präzise Forderungen stellen> und die NICHT im Laufe des Projekts oder noch besser nach Abschluss> ändern...
Nicht meckern.... " eine Tabelle" heißt nicht, dass in jeder Zelle etwas
stehen muss ;)
Und ich weiß wirklich nicht, wieso du ein Passwort eingefügt hast.
Mittlerweile weiß jeder, dass man den Code in VBA einfach lesen kann,
wenn man es in OpenOffice öffnet. Oder eben mit einem Hex Konverter
entfernt.
Was wolltest du mit dem Passwort bezwecken?
Wenn du dich so gut auskennst hätte es kein Problem für dich sein können
den ersten Code einfach in vba den debugger einzufügen... Dumm anstellen
und eine fertige Datei fordern... Clever
Mach was du willst, entfernt das Passwort und änder den Code, ist mir
egal... Ich lasse mich nicht für dumm verkaufen
Ich bin raus, jetzt muss du halt vba lernen, wäre sowieso nicht
schlecht.
Und das nächste mal nimm dir das zu Herzen
Me schrieb:> Wo wir wieder bei dem Punkt sind, klar und präzise Forderungen stellen> und die NICHT im Laufe des Projekts oder noch besser nach Abschluss> ändern...
Das hat nichts mit meckern zu tun