Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1744to1748
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
Inhaltsverzeichnis

Veringerung der Codelänge

Veringerung der Codelänge
23.03.2020 16:27:39
Steve

Moin Leute,
ich habe da zwei Fälle mit derselben Fragestellung. Ich habe zwei Codeteile die mir etwas lang erscheinen. Ich frage mich nun, wie ich diesen Code verringern kann.
Es handelt sich hier um zwei unterschiedliche Makros, auch wenn es vielleicht wegen dem Range nicht so aussieht.
Makro 1.
Hier wird der Inhalt einer Zelle mit dem Namen Objekt an vier andere Zellen übergeben. Die Zielzellen sind die Spalte 2 von intelligenten Tabellen. Jeder der 4 Tabellen befinden sich in einem eigenen Sheet. Das Makro funktioniert einwandfrei, nur gefällt mir der aufbau nicht. Kann man das nicht was kompakter machen? Habe versucht alle Ranges in einer Klammer zu schreiben und mit Komma zu trennen, aber das ging nicht. Was habe ich da für Möglichkeiten?
Sub yfertigDATEN()
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True, AllowUsingPivotTables:=True
ActiveWindow.SelectedSheets.Visible = False
Range("N_Objekt").Copy
Range("N_Objekt1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("N_Objekt2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("N_Objekt3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("N_Objekt4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Startseite").Select
End Sub
Makro 2
Beim Erstellen eines neuen Arbeitsblattes werden Einträge in verschiedene Tabellen gemacht. die Spalten 1 & 2 der Tabellen sind immer gleich, der Rest ist unterschiedlich. Es soll immer nach Spalte 2 sortiert werden. Auch hier funktioniert der Code. Kann ich das irgendwie entschlacken? Es soll übrigens lediglich nach Alphabet bzw. Größe sortiert werden. A bzw. 1 oben.
Die Überschrift der Spalte 2 KANN sich ändern (wenn dann aber für ALLE Tabellen) Das geschieht dann mit dem oben stehenden Makro 1.
ActiveWorkbook.Worksheets("Startseite").ListObjects("tabStart").Sort.SortFields _
.Clear
ActiveWorkbook.Worksheets("Startseite").ListObjects("tabStart").Sort.SortFields _
.Add2 Key:=Range("N_Objekt1"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Startseite").ListObjects("tabStart").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("LISTE").ListObjects("Liste1").Sort.SortFields _
.Clear
ActiveWorkbook.Worksheets("LISTE").ListObjects("Liste1").Sort.SortFields _
.Add2 Key:=Range("N_Objekt2"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("LISTE").ListObjects("Liste1").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Ich frage mich, ob man das nicht was kompakter gestalten kann. Allerdings befinden sich diese Tabellen ja alle in einem eigenen Sheet. Ich frage mich allerdings ob das nicht egal ist, da intelligente Tabellen ja einen Namen haben und mein Laienverständnis mir sagt, das diese wie eine Zelle die einen Namen hat direkt angesprochen werden kann.
(Hoffe jemand kann verstehen was ich meine.)
Was allerdings anders ist, ist das die zu sortierende Spaltenüberschrift einen Namen hat mit einer Fortlaufenden Nummer. Vielleicht kann man statt den Namen irgendwie die zweite Spalte unabhängig vom Namen oder Inhalt ansprechen.
Liebe Grüße
Steve

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Veringerung der Codelänge
23.03.2020 16:30:15
Hajo_Zi
Range("N_Objekt1","N_Objekt2", "N_Objekt3", "N_Objekt4").PasteSpecial Paste:=xlPasteValues
testeten kann ich es nicht.
Zu Deiner Datei kann ich nichts schreiben, was wohl daran liegt das ich nicht auf fremde Rechner schaue.Ich baue keine Datei nach.
Sollte die Datei verlinkt werden?
Wenn du an Stelle einer Demomappe deine Originalmappe hochladen willst, diese aber sensible Daten enthält, kannst du diese Daten
http://www.ms-office-forum.de/forum/showthread.php?t=322895
änderrn.
Das ist nur meine Meinung zu dem Thema.

Anzeige
AW: Veringerung der Codelänge
23.03.2020 17:39:29
Steve
Moin Hajo,
das hatte ich versucht, zwar ohne die Leerzeichen dazwischen, aber leider funktioniert das nicht.
Leider funktioniert auch deine Lösung nicht. Oder habe ich was falsch gemacht?
Ich sende dir gerne die Datei.
Das Makro zu Frage eins befindet sich in Modul Yfertig und ist das Makro yfertigDATEN
Der relevante Button dazu befindet sich im Sheet DATEN und heisst Fertig
Das Makro zu Frage zwei befindet sich in Modul ERSTELLEN ganz unten
Der relevante Button dazu befindet sich im Sheet Startseite und heisst NEU
Ich hänge dir die Datei gerne an. Es ist ein ZIP. Darin befindet sich aber nur eine Datei. Die unterordner werden nur benötigt, damit auch alles funktioniert.
https://www.herber.de/bbs/user/136052.zip
Ich danke dir für deine Hilfe.
Liebe Grüße
Steve
Anzeige
AW: Veringerung der Codelänge
23.03.2020 19:22:45
AlterDresdner
Hallo Steve,
zu Makro1:
Sub yfertigDATEN()
Dim i As Integer
Range("N_Objekt").Copy
For i = 1 To 4
Range("N_Objekt" & i).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Next i
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True, AllowUsingPivotTables:=True
ActiveWindow.SelectedSheets.Visible = False
Sheets("Startseite").Select
End Sub

Makro2 nur der Schluss (ungetestet):
    With ActiveWorkbook.Worksheets("LISTE").ListObjects("Liste1").Sort
.SortFields .Clear
.SortFields.Add2 Key:=Range("N_Objekt2"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With ActiveWorkbook.Worksheets("INFO").ListObjects("Liste2").Sort
.SortFields .Clear
.SortFields.Add2 Key:=Range("N_Objekt3"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Um Deinen Code übersichtlicher zu machen, empfehle ich mehr mit With... zu arbeiten.
Gruß der AlteDresdner
Anzeige
AW: Veringerung der Codelänge nochmal
23.03.2020 20:40:00
AlterDresdner
Hallo Steve,
nach nochmal Hingucken:
Unterprogramme (Sub oder Function) sind hervorrragende Instrumente zur Codevereinfachung.
Nur der Schluss von Makro2:
    Filtersetzen "LISTE", "Liste1", "N_Objekt2"
Filtersetzen "INFO", "Liste2", "N_Objekt3"
''''BILDSCHIRMAKTUALISIERUNG EINSCHALTEN
Application.DisplayAlerts = False
End Sub
Function Filtersetzen(Blatt, ListOb, Schluessel)
With ActiveWorkbook.Worksheets(Blatt).ListObjects(ListOb).Sort
.SortFields .Clear
.SortFields.Add2 Key:=Range(Schluessel), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Function

Die Ergänzung für etwas weiter oben kreigst Du selber hin...
Gruß der AlteDresdner
Anzeige
AW: Veringerung der Codelänge nochmal
23.03.2020 22:36:22
snb

Sub M_snb
Range("N_Objekt1,N_Objekt2,N_Objekt3,N_Objekt4").Value=Range("N_Objekt").Value
End Sub

AW: Veringerung der Codelänge nochmal
24.03.2020 10:50:49
Steve
Moin AlterDresdener,
ich danke dir für deine Hilfe. Deinen ersten Beitrag bezüglich Makro 1 habe ich umgesetzt. Diese Lösung verstehe ich. Da die Zielobjekte eine Fortlaufende Zahl haben (also Objekt1,2,3,4) werden die mit jedem Durchgang durch "i" umgesetzt. Dadurch muss der ganze Vorgang selber nur einmal notiert werden.
Was ich aber nur bedingt verstehe ist dein zweiter Beitrag. Ich nehme an durch Filtersetzen sage ich dem Code er soll zu der entsprechenden Funktion gehen. Diesen arbeitet er ab und springt dann zurück. Wenn ich das richtig verstanden habe, muss ich keine Schleife erstellen weil Blatt, ListOb und Schlüssel ihre Werte immer aus den zuvor angegebenen Stellen am Codeende beziehen. Der code springt also von selbst immer wieder zur Funktion und zurück. Liege ich da richtig?
Wahrscheinlich nicht, denn es funktioniert nicht. Also, ich bekomme keine Fehlermeldung, es passiert aber auch nichts. Sicher habe ich einen Denkfehler. Kannst du mir einen Tipp geben bitte?
PS: Ich habe noch das Filtersetzen für die Startseite hinzugefügt.
Aber ich nehme nicht an, das du das meintest mit: Die Ergänzung für etwas weiter oben kreigst Du selber hin...
Liebe Grüße
Steve
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige