Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

nächstes Tabellenblatt





Frage

Servus Leute, [i](Entschuldigung für langes Schreiben, aber ich versuche mich präzise auszudrücken)[/i] ich habe ein Makro, das nur in einem Sheet läuft (unabgesehen davon, dass mehrere Sheets aktiviert/selektiert sind), und das ich in ca. 80 bestimmten Sheets von insgesamt 85 Sheets einer Arbeitsmappe ausführen soll, was etwas umständlich ist. Die benötigten 80 Sheets sind nacheinander geordnet nach ersten fünf Sheets, die ich nicht brauche(kann vielleicht [b]Gibt es Möglichkeit, das Makro so zu gestallten, dass das Makro doch gleich in mehreren Sheets ausgeführt wird?[/b] Ich habe es mir auch überlegt und denke, dass es klappen würde, wenn ich in meinem Makro eine Art Schleife bilden könnte, etwa so: ich gehe zuerst auf das erste von 80 benötigten und nacheinanderstehenden Sheets und ausführe das Makro: [i]"grüne Zellen bekommen den Wert "1", dann übergeht es zum nächstgeordnetem Sheet, und wieder bekommen die grünen Zellen den Wert "1"... und so weiter bis zum letzten Sheet."[/i] (am besten natürlich bis zu einem bestimmten Sheet, z.B. bis zum 10. Sheet nach dem Sheet mit dem ich angefangen habe). oder wenn ich die benötigten Sheets richtig zusammenfassen könnte, etwa so: [b]For Sheets("1", "2", "3") In ActiveWorkbook[/b] Dim Cell As Range On Error Resume Next For Each Cell In ActiveSheet.UsedRange If Cell.Interior.ColorIndex = 4 Then Cell = 1 End If Next Next aber so geht es ja nicht. [b]PS: [/b]meine Fragen mögen wahrscheinlich albern oder banal sein, aber ich bin ja noch kein Profi - erst letzte Woche habe ich die Begriffe "VB" und "Makro" kennengelern. MfG Iwan

Antwort 1 von JoeKe

Moin Iwan,

versuchsmal so:

Sub eins_einfügen()
Application.ScreenUpdating = False
Dim Zelle As Range, ws As Integer
On Error Resume Next
For ws = 6 To Sheets.Count
Sheets(ws).Select
For Each Zelle In ActiveSheet.UsedRange
If Zelle.Interior.ColorIndex = 4 Then Zelle = 1
Next
Next
Application.ScreenUpdating = True
End Sub


Gruß

Jörg

Antwort 2 von piano

Hallo
Um die Lösung von @Jörg dynamischer zu gestalten, konnte man eine Tabelle mit den Sheet-Nummeren einführen und abarbeiten:

Sub eins_einfügen()
Application.ScreenUpdating = False
Dim ListeArray
ListeArray = Array(1, 3, 4, 10, 60)
Dim Zelle As Range, ws As Integer
On Error Resume Next
For ws = 0 To Sheets.Count - 1
Sheets(ListeArray(ws)).Select
For Each Zelle In ActiveSheet.UsedRange
If Zelle.Interior.ColorIndex = 4 Then Zelle = 1
Next
Next
Application.ScreenUpdating = True
End Sub

in diesem Fall die sheets 1, 3, 4, 10, 60.


Gruß piano

Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
- probieren geht über studieren -

Antwort 3 von RIDDIK

Danke, Jörg.

So finktioniert es. Habe aber weitere Fragen:

1. For ws = 6 To ...heisst, dass das Einfügen läuft in allen Sheets ab dem Sheet mit lfd. Nr. 6.
Wenn meine Sheets aber alle einen Namen haben und ein anderer Anwender ein neues Sheet vor Sheet 6 ertstell, in dem das Makro nicht ausgeführt werden soll, wird es aber trotzdem ausgeführt, da das neuerstellte Sheet dann die lfd. Nr. 6 übernimmt.
Kurz: Kann ich da anstatt lfd.Nr. den Namen des Sheet verwenden?

2. Was ist, wenn die Sheets, die ich für diese Anwendung benötige nicht nacheinander geordnet sind, sondern mit anderen Sheets durcheinander. Kann ich da bestimmte Sheets für diese Anwendung auswählen?

3. Wofür steht "ws"? Ist es eine freie Variable, die du selbst gewählt hast? Wenn ja, dann könnte es genauso "abc" heissen?

4. Ihr schreibt in euren Codes immer "Zelle" und ich muss es immer korrigieren in "Cell", sonst läuft das Makro bei mir nicht. Habt Ihr eine andere Version, oder kann ich es irgend wie einstellen, dass bei mir "Zelle" auch erkannt wird?

Antwort 4 von RIDDIK

Hi, piano.

Die gleiche Frage an dich: kann ich anstatt lfd. Nr. die Sheetsnamen verwenden?

z.B.: anstatt 10 eine "Auswertung Team A"?

Antwort 5 von RIDDIK

und was heisst "To Sheets.Count - 1"?

Antwort 6 von RIDDIK

und wo kann ich ein Feedback abgeben,
ob der Lösungsvorschlag mein Problem gelöst hat.

Antwort 7 von JoeKe

Hallo Iwan,

das sind aber ne menge Fragen auf einmal!
Als erstes die Leichteste:
Feedback gibts du in dem Thread ab, der dann erfolgreich beendet wurde. Also wenn sich dein oben stehendes Problem gelöst hat schreibst du es hier. Da dies unser einziger "Lohn" ist, sind alle Helfer sehr dankbar dafür.

Nun zu den anderen Fragen.
ws und Zelle sind beides frei gewählte Variable. Du kannst sie nennen wie du es möchtest z.B. auch abc. Weshalb du die Variable "Zelle" in "Cell" umwandeln musst versteh ich nicht, wenn du unsere Codes so übernimmst wie wir sie hier einstellen müsste es funktionieren ohne das du etwas änderst. Mit welcher Excel - Version arbeitest du denn?

Sheets können auf zwei Arten angesprochen werden. Einmal über den Namen. Dies ist dann natürlich immer eindeutig. Bedeutet aber unter umständen eine Menge Schreibarbeit beim programmieren.
Die zweite Variante ist über den Index. Jedes Blatt hat eine von Excel vorgegebenen Index. Wenn du eine neue Mappe öffnest mit z.B. x Blättern ist der "Tabelle1" der Index 1 zugeordnet, der "Tabelle2" der Index 2 usw. Diesen Index behalten sie bei auch wenn du sie umbenennst oder die Reihenfolge änderst. Ein neu eingefügtes Blatt erhält den nächsten freien Index.

Für das was du vor hast ist es einfacher die Sheets über den Index anzusprechen.
Vielleicht beschreibst du nochmal nach welchen Kriterien die Blätter ausgewählt werden sollen, welchen Namen die Blätter haben usw. Das würde es erleichtern eine Lösung zu finden.


MfG

Jörg

Antwort 8 von JoeKe

Hallo Iwan,

hier mal eine Möglichkeit das über den Namen der Blätter zumachen. Als erstes muss du ein neues Blatt mit dem Blattnamen "Namen" anlegen. Dort trägst du in Spalte A die Blattnamen der zuüberprüfenden Blätter ein.
Dann muss du nur noch den Code durch diesen ersetzen:

Sub eins_einfügen()
Application.ScreenUpdating = False
Dim ListeArray, Blatt As String, i As Integer
For i = 1 To 60
Blatt = Sheets("Namen").Cells(i, 1)
ListeArray = Array(Blatt)
Dim Zelle As Range, ws As Integer
On Error Resume Next
For ws = 0 To Sheets.Count - 1
Sheets(ListeArray(ws)).Select
For Each Zelle In ActiveSheet.UsedRange
If Zelle.Interior.ColorIndex = 4 Then Zelle = 1
Next
Next
Next
Application.ScreenUpdating = True
End Sub


MfG

Jörg

Antwort 9 von RIDDIK

Hallo, Jorg.

Unter lfd.Nr. habe ich ja auch Index gemeint.
Ich arbeite mit Excel 2000
Wie gelange ich zum Thread?

Ich mache zur Zeit ein Praktikum in einem Spritzgussbetrieb. Ich habe ein Tool mit 86 Sheets erstellt zur Auswertung der monatl. Maschinenauslastung. Es wird in Zukunft von einem Mitarbeiter für jeden Monat zuerst vorgerichtet (wegen versch. Monatsdaten), dann werden die Werte eingetragen (Ausfall-, Rüstzeiten, Produktion usw.).

Das Tool schaut so aus: 1.Sheet: Vorrichtungskonzept; 2.Sheet: "Diagrammen"; 3.Sheet: "Auswertung der Maschinenauslastung"; 4.Sheet: "Teamsauslastung"; 5.Sheet: "Technikumsauslastung"; 6.Sheet: "Einrichterauslastung"; 6.-86.Sheets: "NoName"(Maschinennummern) für die Datenerfassung.

Die Sheets habe ich nicht der eigentlichen Ordnungsreihenfolge erstellt. Z.B. das Scheet "Diagrammen" steht habe ich zuletzt erstellt, dann hat es Index 86 obwohl es an der 2. Stelle steht(dir nach). Auserdem, wenn ich weg bin, kann das Tool von jemand anderem geändert werden: Maschinen werden verschrottet, oder kommen neue usw. Oder werden die Indexe bei Verschiebung von Sheets auch so wie die Stellennummern mitgeändert? Wenn nicht, dann habe ich ein Problem:
Wie kriege ich diese "primäre" Sheets-Indexe raus?

Nicht desto trotz: ich würde es auch gerne für mich wissen, wie "eins_einfügen" über die Sheetsnames geht. Es kann ja sein das ich ein Tool habe über 200 Sheets mit richtigen Indexen, und ein Makro soll in den Sheets "bla", "bla-bla" und "bla-bla-bla" ausgeführt werden. Dann wäre es doch umständlich immer wieder nachzählen, welche Stellennummer bzw. Indexe diese Sheets haben, oder? Da könnte ich einfach im Makro den/die Sheetsnamen ändern.

MfG Iwan

Antwort 10 von RIDDIK

Und noch eine kurze Frage: Spalte heisst ja Column, und wie heisst Zeile?

Antwort 11 von ChatAlligator

Adresse der der Zellen - z.B. Zelle A2
Range("A2") oder Cells(2,1)
Dies gilt für eine absolute Position
Steht einer der Ausdrücke hinter einem Selection. oder anderem Range(), so verschiebt sich der Bezug, als ob die vorangende Adresse = Zelle A1 wäre

Gruß CA

Antwort 12 von ChatAlligator

Sorry, habe Zelle statt Zeile gelesen

Zeile = Row

Antwort 13 von piano

Hallo
noch abschließend zur Frage
Zitat:
und was heisst "To Sheets.Count - 1"?
:
Ein Array beginnt mit Index 0, das ist in diesem Fall die "Tabelle1". Daher geht die Abfrage bis zur "Anzahl Tabellen im Worksheet" - 1 (das ist die letzte!)
mfg
piano

Antwort 14 von RIDDIK

Hallo Leute,

Ich glaube ich weiss schon selber nicht mehr, was ich brauche und denke, dass es mir für heute reicht. Meine graue Zellen sind voll von Informaton.

Vielen Dank für Eure Tips, waren alle nützlich.
Ausser die letzte Code von Jörg: da bleibt das Programm hängen (er denkt und denkt und denkt...) Ich habe schon mit i=1 to 5 probiert - trotzdem nicht gegangen, Wahrscheinlich ein Fehler drin, oder es liegt an der Deutsch-Englisch-Nichtkompatibilität meines Excels?

Oh, Entschuldigung! Es geht doch! Hat aber lange gebraucht, ca 10 min. Viel länger als über die Indexe. Woran kann es liegen. Kann man das optimieren und die Ausführungszeit verkürzen?

Schönen Abend noch und bis morgen.

MfG
Iwan

Antwort 15 von JoeKe

Moin Iwan,

Unter einem Thread (engl. thread = Faden, Strang) versteht man im Usenet, aber auch in anderen virtuellen Diskussionsforen wie Mailinglisten und einigen Webforen eine Folge von Diskussionsbeiträgen, die hierarchisch organisiert sind. (von Wikipedia).
Sobald du eine Frage stellst eröffnest du einen Thread. Wenn deine Frage dann erfolgreich beantwortet wurde endet in der Regel der Thread, was du mit "Danke funktioniert" darstellen kannst. Hast du auch schon in deinen anderen Threads gemacht.

Um die Sheets über den Namen anzusprechen kannst du @pianos Code verwenden und die Zahlen durch die Blattnamen ersetzen.

Sub eins_einfügen()
Application.ScreenUpdating = False
Dim ListeArray
ListeArray = Array("Maschine1", "Maschine2") ´hier die Namen anpassen
Dim Zelle As Range, ws As Integer
On Error Resume Next
For ws = 0 To Sheets.Count - 1
Sheets(ListeArray(ws)).Select
For Each Zelle In ActiveSheet.UsedRange
If Zelle.Interior.ColorIndex = 4 Then Zelle = 1
Next
Next
Application.ScreenUpdating = True
End Sub


Tretten allerdings Veränderungen ein, müssen die Namen im Code angepasst werden.

Das mein letzter Code so lange läuft liegt daran, dass er erst auf dem Blatt "Namen" einen Blattnamen holt dann das Blatt sucht. Wenn er es findet durchsucht er das Blatt nach den formatierten Zellen und schreibt eine 1 hinein. Danach geht er wieder zu Blatt "Namen" und holt sich den nächsten Blattnamen usw.
Damit der Code schneller läuft, müsste man den Suchbereich sowohl bei den Blattnamen als auch bei dem Bereich auf dem jeweiligen Tabellenblatt so gering wie möglich halten. Das heißt z.B. die Blattnamen auf dem Blatt "Namen" nur auf die infrage kommende Tabellen beschränken.
Gibt es eigentlich auch Blätter auf die keine 1 eingesetzt werden soll Zellen die grün sind?
Wenn nicht wäre es ja nicht notwendig bestimmte Blätter anzusprechen.

Um dir aber effektiv helfen zu können, wäre es hilfreich deine Mappe mal vor Augen zu haben. Falls es dir möglich ist mir die Mappe zu schicken seh mal in dein Pager dort findest du mein e-mail addi.

MfG

Jörg

Antwort 16 von RIDDIK

Danke Jörg; wie üblig: es läuft ohne Probleme ab und dazu noch ziemlich schnell.

Ich habe mich heute mehr bedankt, als Fragen gestellt. Ich glaube, ich habe heute "ThanksGiving". muss aber sein, die Anzahl der Fragen und der Danksagungen muss sich ausgleichen, um die natürliche Balance zu erhalten unt stabilisieren.

Aber jetzt weg von Philosophie und ran ans neue Fragen Stellen!