Anzeige
Archiv - Navigation
820to824
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
820to824
820to824
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Array-Funktionen

Array-Funktionen
19.11.2006 12:22:38
a.gerken
Hi @ all
ich bräuchte einen sub, der in einem bereich jeweis einen Sub ausführt. Das ist zur zeit mein sub:
For Each solve_range In Sheets("Tabelle1").Range(SUDOKU_RANGE)
If 81 - WorksheetFunction.CountIf(Sheets("Tabelle1").Range(SUDOKU_RANGE), "") = NUMBER_OF_VALUES And Not NUMBER_OF_VALUES = 0 Then GoTo ende
If Not solve_range = "" Then
Call erase_one_value_and_test(solve_range.Row - 1, solve_range.Column - 1)
End If
Next solve_range
das ganze wird aber jetzt in der richtigen reihenfolge gemacht. Ich möchte das aber in einer zufälligen reihenfolge machen, damit wenn der sub frühzeitig abgebrochen wird (if 81-...then goto ende) nicht nur die zahlen im oberen bereich bearbeitet wurden sondern irgendwelche.
dabei soll aber keine Zelle doppelt bearbeitet werden und wenn alle zellen bearbeitet wurden, soll der sub abbrechen.
hoffe ihr habt alles verstanden.
grüße hans bärle ;)

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array-Funktionen
19.11.2006 13:12:05
Ralf
Hi Hans,
setz die Sprungmarke for die Next Anweisung...
Ciao, Ralf
AW: Array-Funktionen
19.11.2006 13:24:16
Daniel
Hallo
hoffe mal, daß ichs richtig verstanden habe.
1. in FOR-EACH-Schleifen kannst du die Reihenfolge nicht beeinflussen.
dh. du du musst hier eine Do- oder For-Schleife mit Zählvariable verwenden und auf deinen Zellbereich direkt mit Index zugreifen, dh.
"Set solve_range = Range(SUDOKU_RANGE)" einfügen und dann je nach Indexvariable "solve_range(i)" verwenden.
2. Zufallsreihenfolge
Das ist schon etwas komplizierter, da du ja wahrscheinlich doppbearbeitungen auch vermeiden willst.
ich würde dazu so vorgehen:
- Zusatztabelle anlegen
- in Spalte A 81 Zufallszahlen einfügen
- in Spalte B die Rangfolge der jeweiligen Zufahlshzahl festlegen
Dann hast du in Spalte B die Zahlen 1 bis 81 ohne Dublikate in zufälliger Reihenfolge stehen (dh. daß ohne Dublikate ist nicht ganz sicher, aber sehr unwahrscheinlich. Zur Absicherung könntest du aber die Rang-Nummerierung mit ZÄHLENWENN prüfen und ggf. die Zufallszahlen neu ermitteln lassen)
Diese Zahlenreihenfolge in Spalte B kannst du dann als Index für "Solve_Range" verwenden.
Gruß, Daniel
Anzeige
Sudoku
19.11.2006 14:27:55
a.gerken
danke daniel
ich habe leider noch was vergessen :/ ich will das ganze zu 99% in VBA machen und nur die ausgabe in excel.
dh. ich wollte das ganze eigentlich in einem zwei dimensionalen array machen (9x9), wo immer die werte 1 (true) und 0 (false) stehen. wenn eine zelle bearbeitet wurde soll der array eintrag (array(sudoku_range.row(-2),sudoku_range.column(-2)))auf 1 gesetzt werden. nur ich bräuchte eine array-funktion, die sowas wie zählenwenn macht nur mit dem array.
dachte nur vll. fällt jemandem was besseres ein, da beschreib ich einfach mal mein problem.
ich hab grad mal meine idee in ein sub gepackt:
Do 'until (Hier fehlt die bedingung für das ende
x = Round((Rnd() * 8), 0)
y = Round((Rnd() * 8), 0)
Set solve_range = Sheets("tabelle1").Cells(x + 2, y + 2)
If tested_cells(x, y) = 0 Then
If Not solve_range = "" Then
cal erase_one_value_and_test(x + 1, y + 1)
End If
tested_cells(x, y) = 1
End If
Loop
Anzeige
AW: Sudoku
19.11.2006 14:30:27
a.gerken
ach ja ich weiß schon, dass ich eigentlich ne funktion selber schreiben könnte und ich weiß auch wie aber die ausführung würde denkich mal recht lange dauern. und warum selber schreiben wenns schon eine gibbet?
AW: Sudoku
19.11.2006 15:06:13
Daniel
Hallo
du kannst alle Excel-Funktionen auch in VBA verwenden.
Einige sind direkt implementiert, die anderen bekomst du über:
WORKSHEETFUNKTION.
Beispiel:
Zählenwenn: worksheetfunction.countif(...)
Anzahl: worksheetfunction.count()
Die Parameter innerhalb der Klammer sind die gleichen wie in den Excelfunktionen, allerdings kanst du auch die passendne VBA-Variablen verwenden.
Gruß, Daniel
Anzeige
AW: Sudoku
19.11.2006 15:40:51
a.gerken
hab das ganze jez mal probiert: ich weiß nicht wie ich das auf ein array anwenden soll:
WorksheetFunction.CountIf(Tested_cells(,), "") :Typen unverträglich
WorksheetFunction.CountIf(Tested_cells(), "") :""
WorksheetFunction.CountIf(Tested_cells, "") :""
WorksheetFunction.CountIf(Range(Tested_cells(0, 0), Tested_cells(8, 8)), "") : Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen
AW: Sudoku
19.11.2006 16:00:46
daniel
Hallo
die Worksheetfunktions gehen nur teilweise mit Arrays.
CountIF braucht als eingabe ein Rangeobjekt, dh. die Infos müssten in einem Tabellenblatt abgelegt werden.
Da du aber eh nur den Wert 1 ins Array reinschreibst, kannst du statt Worksheetfunction.Countif auch Worksheetfunction.Sum verwenden. Das Ergebnis wird das gleiche sein.
Worksheetfunction.Sum kann auch Arrays verarbeiten.
Solltest du auch CountIF auf das Array anwenden wollen, wirst du nicht drumherumkommen, es nachzuprogrammieren, oder die Arraydaten auf ein Tabellenblatt rauszuschreiben.
Allerdings ist der Makroablauf wesentlich schneller, wenn nur Array-Variablen und keine Range-Objekte. In der Performance bekommst du zumindest kein Problem
Gruß, Daniel
Anzeige
AW: Sudoku
19.11.2006 16:58:18
a.gerken
Ja dankeschön
da es mir auf das speed ankahm, habe ich das ganze jetzt eleganter ;) über vba gelöst.

Sub new_sudoku()
Do Until Untested_cells() = False Or (81 - WorksheetFunction.CountIf(Sheets("Tabelle1").Range(SUDOKU_RANGE), "") = NUMBER_OF_VALUES And Not NUMBER_OF_VALUES = 0)
x = Round((Rnd() * 8), 0)
y = Round((Rnd() * 8), 0)
If Tested_cells(x, y) = 0 Then
If Not Sheets("tabelle1").Cells(x + 2, y + 2) = "" Then
Sheets("tabelle1").Cells(x + 2, y + 2).Interior.ColorIndex = 4
Call erase_one_value_and_test(x + 1, y + 1)
Sheets("tabelle1").Cells(x + 2, y + 2).Interior.ColorIndex = 3
End If
Tested_cells(x, y) = 1
End If
Loop
End Sub


Function Untested_cells()
Untested_cells = False
For x = 0 To 8
For y = 0 To 8
If Tested_cells(x, y) = 0 Then
Untested_cells = True
Exit Function
End If
Next y
Next x
End Function

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige