10.10.2018, 17:24 (Dieser Beitrag wurde zuletzt bearbeitet: 10.10.2018, 17:27 von Käpt'n Blaubär.)
Hallo,
Zitat:Deswegen ist meine Frage ob man nicht auch alle Tabellenblätter, unabhängig wie diese heißen, miteinander vergleichen kann ?
ich würde bei jedem Starten der Datei alle Tabellenblattreiter einlesen lassen. Somit hätte ich eine aktuelle Übersicht und könnte im zweiten Teil dann wie folgt verfahren. Und hier gäbe es (siehe die Buttons), sogar schon einen, der in der Lage ist mal schnell eben die Registernamen neu einzulesen. Folglich würden mir auch keine neu hinzugekommenen oder nicht mehr vorhandenen Reiternamen entgehen.
Edit: Ich bin bisher davon ausgegangen, daß Du die Blätter drucken willst. Du willst sie aber nur vergleichen. Also paßt mein Vorschlag nicht wirklich, sorry.
Um erst nochmal auf die Antwort von Jörg zurückzukommen. Ich habe den Code mal bei B5 eigensetzt, allerdings erscheint dann bei mir eine Null bei den Geräte Nummern, irgendwas muss ich da falsch gemacht haben, weißt du was das ein könnte?
Dann zu der Antwort von Käpt´n Blaubär. Auch wenn dein Vorschlag nicht passt, bedanke ich mich trotzdem bei dir. Ich habe ja anfangs schonmal einen VBA Code in einer Nachricht hinterlassen. Ist denn mit dem nichts weiter anzufangen, beziehungsweise kann mir da jemand die Fragen beantworten, die ich dazu gestellt habe? Denn ich denke, die beste Möglichkeit meinen Wunsch zu erfüllen wird es sein, über VBA zu gehen.
Ich freue mich über jede Antwort und bedanke mich auch schonmal bei allen die mir helfen!
(11.10.2018, 14:07)lukas-2000 schrieb: Vielen Dank für Eure Antworten!
Um erst nochmal auf die Antwort von Jörg zurückzukommen. Ich habe den Code mal bei B5 eigensetzt, allerdings erscheint dann bei mir eine Null bei den Geräte Nummern, irgendwas muss ich da falsch gemacht haben, weißt du was das ein könnte? ... Gruß Lukas
Nö, weiß ich nicht. Weil ich nicht sehe, was du wie eingesetzt hast, Bei mir hat das funktioniert. Allerdings muss man die Datei als *.xlsm oder *.xlsb abspeichern - wegen der Makro4 Formel...
Gruß Jörg stolzes Mitglied im ----Excel-Verein Freund einer excellenten Power Query-Abfrage
Okay, dann weiß ich es auch nicht, ich habe nochmal alles nachgeschaut, konnte aber keine konkreten Fehler entdecken. Die Datei ist auch als .xlsm abgespeichert, daran kann es auch nicht liegen. Nichts gegen dich Jörg, aber ich denke für mich wäre es mit einem VBA Code am besten. Ich bedanke mich trotzdem sehr, für deine Hilfe! Ich habe mich jetzt nochmal ein bisschen mit dem VBA Code beschäftigt, dieser sieht jetzt so aus:
Code:
Sub Sortieren() ' Sortieren von Arbeitsblättern Dim i As Integer, j As Integer, k As Integer k = ActiveWorkbook.Worksheets.Count For i = 2 To k For j = i To k If Worksheets(j).Name < Worksheets(i).Name Then Worksheets(j).Move Before:=Worksheets(i) End If Next j Next i ' Ende Sortieren von Arbeitsblättern End Sub
Es geht hierbei nur erstmal um die Sortierung der Tabellenblätter. Am Anfang meiner Arbeitsmappe befindet sich ein Inhaltsverzeichnis, was dank dem Code auch am Anfang stehen bleibt. Allerdings habe ich das Problem, dass die Zahlen nur korrekt sortiert werden, wenn sich davor nullen befinden, also so: 001, 005, 017, 025, 056, 193, 378, … Kann man den Code auch noch irgendwie so anpassen, dass es auch ohne Nullen funktioniert oder das die Nullen automatisch eingefügt werden, je nach dem ob die Zahl ein- oder zweistellig ist?
ich habe noch zwei Codes im Angebot. Sie dürften alle Probleme lösen: Der erste Code listet nur die -sichtbaren Tabellen- im Inhaltsverzeichnis auf. Das ist je als Lösung gewünscht, oder? Der zweite Code benennt alle numerischen Tabellen in dreistellige Nummern um!! (durch vorsetzen von "00" oder "0")
Würde mich freuen wenn damit die letzten Proleme gelöst sind.
mfg Gast 123
Code:
Sub InhaltsverzeichnisErstellen() Dim Sht As String 'Inhaltsverzeichnis
anzahl = ThisWorkbook.Sheets.Count
For t = 2 To anzahl If ThisWorkbook.Sheets(t).Visible = True Then With ThisWorkbook.Sheets("Inhaltsverzeichnis") .Hyperlinks.Add Anchor:=.Cells(t, 1), Address:="", SubAddress:=ThisWorkbook.Sheets(t).Name & " Zum Gerät" End With End If Next t
End Sub
Sub Tabellen_umbenennen() Dim Sht As String anzahl = ThisWorkbook.Sheets.Count 'Numerische Tabellen auf dreistellig umbenennen
For t = 2 To anzahl Sht = ThisWorkbook.Sheets(t).Name If IsNumeric(Sht) Then If Len(Sht) = 1 Then Sht = "00" & Sht If Len(Sht) = 2 Then Sht = "0" & Sht ThisWorkbook.Sheets(t).Name = Sht End If Next t
genauso habe ich mir das vorgestellt. Vielen Dank!
Allerdings ist mir aufgefallen, dass Excel ein bisschen Zeit braucht, die ganzen Befehle auszuführen. Gibt es noch eine Möglichkeit das ganze zu verschnellern? Wenn es nicht funktioniert, ist es aber auch nicht schlimm.
Mein Code sieht jetzt so aus:
Code:
Sub TabellenUmbenennen() Dim Sht As String anzahl = ThisWorkbook.Sheets.Count 'Numerische Tabellen auf dreistellig umbenennen For t = 2 To anzahl Sht = ThisWorkbook.Sheets(t).Name If IsNumeric(Sht) Then If Len(Sht) = 1 Then Sht = "00" & Sht If Len(Sht) = 2 Then Sht = "0" & Sht ThisWorkbook.Sheets(t).Name = Sht End If Next t Call Sortieren End Sub
Sub Sortieren() ' Sortieren von Arbeitsblättern Dim i As Integer, j As Integer, k As Integer k = ActiveWorkbook.Worksheets.Count For i = 2 To k For j = i To k If Worksheets(j).Name < Worksheets(i).Name Then Worksheets(j).Move Before:=Worksheets(i) End If Next j Next i ' Ende Sortieren von Arbeitsblättern Call ScrollTo End Sub
Sub ScrollTo() Dim Adresse As String 'Gehe zu Adresse Application.Goto Reference:=Range("C9"), scroll:=False End Sub
If IsNumeric(Sht) And Len(Sht) < 3 Then ThisWorkbook.Sheets(t).Name = Format(Sht, "00#")
Falls Du Berechnungen in der Datei hast, könntest Du vor den Aktionen auch den Berechnungsmodus auf manuell stellen und hinterher wieder auf den alten Stand und berechnen.
Beim Verschieben könntest Du so vorgehen, dass Du das Blatt mit der größten Nummer ans Ende stellst und die anderen der Reihe nach davor einfügst. Falls die "Nummern-Namen" nicht durchgängig sind, erstellst Du Dir zuerst in einem Array eine Liste der belegten Nummern und arbeitest dann diese Liste ab..
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Zitat:If IsNumeric(Sht) And Len(Sht) < 3 Then ThisWorkbook.Sheets(t).Name = Format(Sht, "00#")
Danke, das hat schonmal funktioniert. Es funktioniert sogar äußerst gut. Bei dieser Variante erziele ich schon eine deutliche höhere Geschwindigkeit. Ich glaube das dieser Code, die Geschwindigkeit am meisten beeinflusst hat. Wenn es nicht schneller geht, wäre ich mit der aktuellen Geschwindigkeit, auch schon ganz zufrieden.
Das mit dem Berechnugsmodus hört sich schonmal garnicht schlecht an. Wie würde man so etwas denn per VBA realisieren, ich kenne mich dahingehend nicht so gut aus?
Die ,,Nummer-Namen" sind nicht durchgängig, also werden variabel eingetragen. Wie meinst du das genau mit dem Array, was meinst du mit dieser Liste? Ich verstehe das nicht so ganz...
Sub Makro2() 'Variablendeklarationen Dim arrSheets, iCnt% 'Berechnung auf manuell Application.Calculation = xlManual 'Array mit Blattnamen bilden arrSheets = Array("001", "003", "005") 'Letztes Blatt ans Ende setzen Sheets("005").Move After:=Sheets(Sheets.Count) 'Schleife ueber alle anderen Blaetter For iCnt = 1 To 0 Step -1 'Blatt vor das naechste im Array setzen Sheets("001").Move before:=Sheets(arrSheets(iCnt + 1)) 'Ende Schleife ?ber alle anderen Blaetter Next 'Berechnung auf automatisch Application.Calculation = xlAutomatic End Sub
Das Array mit den Blattnamen könnte man auch automatisch bilden. Da die Blätter unsortiert sind, müsste man das Array dann noch sortieren.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Sub Makro2() 'Variablendeklarationen Dim arrSheets, iCnt% 'Berechnung auf manuell Application.Calculation = xlManual 'Array mit Blattnamen bilden arrSheets = Array("001", "003", "005") 'Letztes Blatt ans Ende setzen Sheets("005").Move After:=Sheets(Sheets.Count) 'Schleife ueber alle anderen Blaetter For iCnt = 1 To 0 Step -1 'Blatt vor das naechste im Array setzen Sheets("001").Move before:=Sheets(arrSheets(iCnt + 1)) 'Ende Schleife ?ber alle anderen Blaetter Next 'Berechnung auf automatisch Application.Calculation = xlAutomatic End Sub
Das Array mit den Blattnamen könnte man auch automatisch bilden. Da die Blätter unsortiert sind, müsste man das Array dann noch sortieren.
Hallo, ich habe mal ein bisschen mit dem Code herumprobiert und dabei ist mir eine Sache aufgefallen. Wenn ich kein Tabellenblatt mit dem Namen "001", "003" und "005" habe, hat ja quasi das Array keinen bezug mehr und es kommt somit eine Fehlermeldung auf. Das größte Probelm an der Sache ist nur, dass die Blattnamen variabel sind. Das heißt es muss kein Blatt geben was den Namen "001", "002", usw. hat. Gibt es in der Hinsicht noch eine andere Möglichkeit das Array zu bilden, also das es auch mit Variabelen Blattnamen funktioniert?
Die Sortierung könnte man ja dann mit dem QuickSort-Verfahren realisieren.