Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1536to1540
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
Code schneller machen?
22.01.2017 10:50:37
Henno
Hallo Forum,
ich habe folgenden Code per Recorder aufgezeichnet, der auch funktioniert-zumindest wenn die parameter stimmen.
Allerdings dauert es sehr lange.
Der Code wird über einen CommandButton ausgeführt.
Kann mir einer den Code umschreiben, dass er schneller ausgeführt wird?

Private Sub Sortieren_Click()
ActiveSheet.Unprotect Password:="passwort"
Dim zeile As Integer ' blendet die Zeilen aus
zeile = 1
For zeile = 17 To 120
If Range("d" & zeile).Value = "" Then
Rows(zeile).Hidden = True
Else
End If
Next zeile
Rows("17:120").Select ' dieser Bereich soll sortiert werden nach Werten in Spalte G Werte 1- _
5, funktioniert nur, wenn Anzahl 1 konstant,
Anzahl 2 konstant, usw., kann aber in der Tabelle variabel sein
ActiveWorkbook.Worksheets("Jahresübersicht").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Jahresübersicht").Sort.SortFields.Add Key:=Range( _
"G17:G120"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Jahresübersicht").Sort
.SetRange Range("A17:UQ120")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Rows("17:122").Select ' ausgeblendete Zeilen wieder einblenden
Selection.EntireRow.Hidden = False
Range("C12").Select
ActiveSheet.Protect Password:="Passwort", DrawingObjects:=False, Contents:=True, Scenarios:= _
_
_
_
_
_
True, AllowFormattingCells:=True, AllowUsingPivotTables:=True
Range("C12").Select
End Sub

Falls jemand Bock darauf hat, vielen Dank im voraus,
Gruß Henno

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code schneller machen?
22.01.2017 11:00:02
Henno
Kleine Ergänzung:
Werte in Spalte G sind formatiert als Zahlen ohne Dezimalstellen.
Aufgenommen wurde per Recorder in Excel 2013, sollte aber auch unter 2010 laufen ;)
AW: Code schneller machen?
22.01.2017 11:16:14
Gerd
Hallo Henno,
ungetestet:
Private Sub Sortieren_Click()
Dim Blatt As Worksheet
Set Blatt = ActiveWorkbook.Worksheets("Jahresübersicht")
Blatt.Unprotect Password:="passwort"
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Blatt.Sort.SortFields.Clear
Blatt.Worksheets("Jahresübersicht").Sort.SortFields.Add Key:=Range( _
"G17:G120"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= xlSortNormal
With Blatt.Sort
.SetRange Blatt.Range("A17:UQ120")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Range("C12").Select
Blatt.Protect Password:="passwort", DrawingObjects:=False, Contents:=True, Scenarios:= _
True, AllowFormattingCells:=True, AllowUsingPivotTables:=True
End Sub

Gruß Gerd
Anzeige
AW: Code schneller machen?
22.01.2017 11:35:53
Henno
Hallo Gerd, danke schon mal.
Bei
Blatt.Worksheets("Jahresübersicht").Sort.SortFields.Add Key:=Range( _
"G17:G120"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= xlSortNormal
wird ".Worksheets" markiert mit der Fehlermeldung "Methode oder Datenobjekt nicht gefunden".
Hab selber ausgewechselt in Sheets und ganz weggelassen, selber Fehler ;)
Gruß Hendrik
AW: Code schneller machen?
22.01.2017 11:41:48
Gerd
Joi,
genau da muss natürlich
Worksheets("Jahresübersicht").
raus.
Sorry!
Gerd
AW: Code schneller machen?
22.01.2017 12:23:43
Henno
Wieso sorry, vielen Dank ;)
Der Code funktioniert, ABER.....
Er löscht ja alle Zeilen, wo keine Inhalte drin sind.....diese hatte ich bei mir ja ausgeblendet und dann sortiert, anschließend wieder eingeblendet, damit die Tabelle nach dem sortieren so ausschaut wie vorher...nur sortiert *gg*
https://www.herber.de/bbs/user/110790.xlsm
Das ist meine Beispieldatei.
Ich habe 5 Abteilungen, und es passiert, das Mitarbeiter a von Abteilung 1 zu Abteilung 3 wechselt usw.
Die maximale Anzahl der Mitarbeiter je Abteilung ist vorgegeben, sie muss aber nicht ausgenutzt werden, daher die Leerzeilen in den jeweiligen Abteilungen.
Die aktuelle Abteilung steht als Zahl in Spalte G, die Idee ist, diese Zahl bei Abteilungwechsel entsprechend abzuändern und neu zu sortieren, die bisherigen Schichten der Mitarbeiter sollen dabei aber nicht "verloren gehen".
Ich hoffe, das ist einigermaßen verständlich ;)
Anzeige
AW: Code schneller machen?
22.01.2017 23:23:23
snb
Dann reicht diese Code:
Sub M_snb()
For Each it In Columns(4).SpecialCells(2).Areas
If it.Count > 1 Then it.Offset(, -2).Resize(, 562).Sort it.Offset(, 5)
Next
End Sub

AW: Code schneller machen?
24.01.2017 11:02:06
Henno
@snb
bei
it.Offset(, -2).Resize(, 562).Sort it.Offset(, 5)
kommt Laufzeitfehler "1004 - Verbundene Zellen müssen die gleiche Größe haben".
Bezieht sich dieser Fehler in deinem Code auf das gesamte Blatt oder nur auf den Bereich (4), also Spalte D?
Da habe ich nämlich keine verbundenen Zeilen, allerdings ein Listenfeld Formularsteuerung...kann das der Auslöser sein?
Gruß
Anzeige
AW: Code schneller machen?
22.01.2017 21:55:26
Gerd
Hallo Henno,
es ist ein interessantes Feature, dass ausgeblendete Zeilen bei diesem Sort nicht mitsortiert werden.
Private Sub Sortieren_Click()
Dim Blatt As Worksheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Set Blatt = ActiveWorkbook.Worksheets("Jahresübersicht")
With Blatt
.Unprotect Password:="passwort"
.Range("D17:D120").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range( _
"G17:G120"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.SetRange Blatt.Range("A17:UQ120")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.Range("D17:D120").EntireRow.Hidden = False
.Range("C12").Select
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
.Protect Password:="passwort", DrawingObjects:=False, Contents:=True, Scenarios:= _
True, AllowFormattingCells:=True, AllowUsingPivotTables:=True
End With
Set Blatt = Nothing
End Sub
Gruß Gerd
Anzeige
AW: Code schneller machen?
23.01.2017 00:34:30
Henno
Danke Gerd, das passt schon sehr gut.
Hab jetzt allerdings festgestellt, wenn jetzt die jeweiligen Abteilungen durch einen Wechsel "voll" gemacht werden, bringt die Sortierung das Ergebnis, dass derjenige für Abteilung 1 auf erste Position von Abteilung 2 rutscht....logisch, diese "freie Reihe" mit dem freien Platz wurde ja ausgeblendet....
@SNB....ich kann nur Recorder *gg*...siehe Ursprungscode....wo soll dein Schnipsel für was eingestzt werden?
Gruß Henno
AW: Code schneller machen?
23.01.2017 09:25:51
snb
Ersetze deine Makro von meiner. Das ist alles was du brauchst. (Steht schon im meinen Post).
AW: Code schneller machen?
25.01.2017 01:56:53
Henno
Funzt leider auch nicht....hab da glaube n Denkfehler drin im ganzen Ablauf. Trotzdem Danke.
Anzeige

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige