Clever-Excel-Forum

Normale Version: Schleifen programmieren Hilfe
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe Community,

ich habe folgendes Problem vor dem ich stehe.
Bis vor wenigen Tagen habe ich mich mit Excel VBA noch nicht wirklich auseinander gesetzt. Jedoch bin ich im Rahmen meiner Arbeit im Praxissemester gezwungen dies nachzuholen.
Ich habe Grundkenntnisse in Java und habe daher ein wenig Ahnung vom Programmieren (Deklaration von Variablen, Schleifen, if-else...)

Aufgabe/ Problem:

Ich habe eine Excel Tabelle, in der Daten aus einem externen Programm manuell eingefügt werden.
Diese Daten (4 Spalten) sortiere ich über eine Hilfsspalte (5. Spalte) nach einer benutzerdefinierten Liste.
Diesen Vorgang möchte ich nun über eine Schaltfläche automatisieren.
Dazu habe ich folgende Überlegungen getroffen.

Wenn ich den Button drücke soll folgendes passieren.
Die 5 Spalten sollen markiert werden und nach meiner benutzerdefinierten Liste sortiert werden.
Dieses Makro habe ich mit dem Makrorekorder aufgezeichnet, und für den ausgewählten Bereich funktioniert dies auch gut.
Hier der Code dazu:

Range(A4:E700).Select
ActiveWorkbook.Worksheets("Datenspeicher")Sort.Sortfields.Clear
ActiveWorkbook.Worksheets("Datenspeicher").Sort.SortFields.Add Key:=Range(_
"E4:E700"), SortOn:=xlSortOnValues, Order :=xlAscending, CustomOrder:=_
"LED Status, Lichtleiter Status, Justage Status, Spalt Justage", _DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Datenspeicher").Sort
.SetRange.Range("A4:E700E)
.Header=xlGuess
.MatchCase = Flase
.Orientation=xlTopToBottom
.SortMethod=xlPinYin
.Apply
End With

Danach füge ich manuell wieder 4 Spalten direkt daneben (also in Spalte F4 ein), die Hilfspalte entsteht automatisch und das gleiche Makro soll erneut ablaufen, nur in dem neuen Bereich um 5 Spalten nach rechts verschoben.
-->
Range(F4:J700).Select
ActiveWorkbook.Worksheets("Datenspeicher")Sort.Sortfields.Clear
ActiveWorkbook.Worksheets("Datenspeicher").Sort.SortFields.Add Key:=Range(_
"J4:J700"), SortOn:=xlSortOnValues, Order :=xlAscending, CustomOrder:=_
"LED Status, Lichtleiter Status, Justage Status, Spalt Justage", _DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Datenspeicher").Sort
.SetRange.Range("F4:J700")
.Header=xlGuess
.MatchCase = Flase
.Orientation=xlTopToBottom
.SortMethod=xlPinYin
.Apply
End With

Ich habe mir überlegt, dass eine do while Schleife optimal wäre, da am Anfang der Schleife die Abfrage stattfinden soll.
Die Bedingung für den Start der Schleife soll sein, dass die Spalte A, F, K... Inhalt hat, ansonsten soll ein Abbruch stattfinden. Besser gesagt soll das Makro solange laufen, wie Daten in einer Spalte vorhanden sind.

Und genau hier scheitert mein VBA Verständnis.
Ich weiß, dass die Range variable sein soll, also pro Schleifendurchlauf um 5 zunehmen soll.
Ich weiß aber nicht wie ich die Range als Variable deklarieren soll (Datentyp). Ich bräuchte wenn ich mich nicht irre 2 Variablen. Einmal Spalte 1( ab hier startet das Makro) und einmal Spalte 5 (um den Bereich zu markieren und dann zum sortieren)

Des Weiteren weiß ich nicht wie ich die Bedingung in der Schleife formulieren soll, damit die Schleife prüft, ob die Spalte Inhalt besitzt. Mir fehlen da schlicht die Befehle.
Und zu guter Letzt benötige ich noch den Befehl innerhalb der Schleife, sodass die Spalten um 5 erhöht werden (A-->F-->K..)


Ich wäre sehr verbunden wenn mir jemand Ratschläge, Tipps, und eventuell sogar die notwendigen Befehle geben könnte.
In einem anderen Forum konnte mir niemand wirklich helfen.

Mit freundlichen Grüßen

Christian
Hallo Christian,

das könnte z.B. so aussehen:
Sub Makro1()
 Dim i As Long
 Dim rngSort As Range
 For i = 1 To Columns.Count Step 5
   If Not IsEmpty(Cells(4, i)) Then
     Set rngSort = Cells(4, i).Resize(697, 5)
     With ActiveSheet.Sort
       .SortFields.Clear
       .SortFields.Add _
         Key:=rngSort.Columns(5), _
         SortOn:=xlSortOnValues, _
         Order:=xlAscending, _
         CustomOrder:="LED Status,Lichtleiter Status,Justage Status,Spalt Justage", _
         DataOption:=xlSortNormal
       .SetRange rngSort
       .Header = xlYes
       .MatchCase = False
       .Orientation = xlTopToBottom
       .SortMethod = xlPinYin
       .Apply
     End With
   Else
     Exit For
   End If
 Next i
End Sub
Gruß Uwe
Hallo an beide,

ıch weiss nicht welches Makro besser laeuft, habe versucht das von Christian auf eine Loop Schleife umzuschreiben.
Habe die Lösung von Uwe gerade gesehen, wollte aber meine nicht in die Tonne werfen. Jetzt hat Christian zwei...

@ Hallo Uwe  ich bin die alte Sortroutine von 2003 gewohnt, die neuen Varianten mit SortField.Clear und Sort.Add habe ich noch nicht begriffen. Was geschieht bei Sort.Clear, was wird da gelöscht, und Warum in Sort ein Add??  Das ist mir noch völlig unklar??   

mfg  Gast 123 

Code:
Option Explicit   '25.9.2016   Gast 123   für Clever Forum
Const Spv = 5     'Spalten Verschiebung


Sub Sortieren_mit_verschieben()
Dim lpz As Integer      'Loop Zaehler  1-n
Dim Bereich As String   'Bereich Adresse
Dim sSpalte As String   'Sortier Spalte
 
  Bereich = "A4:E700"  '1.Bereich Adresse
  sSpalte = "E4:E700"  '1.Sortier Spalte
 
Do Until lpz = 3
  'Prüft ob die 1.Zelle im Bereich gefüllt ist
  If Range(Bereich).Cells(1, 1) <> Empty Then
    Range(Bereich).Select
    ActiveWorkbook.Worksheets("Datenspeicher").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Datenspeicher").Sort.SortFields.Add _
    Key:=Range(sSpalte), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
    "LED Status, Lichtleiter Status, Justage Status, Spalt Justage, DataOption:=xlSortNormal"
   
    With ActiveWorkbook.Worksheets("Datenspeicher").Sort
    .SetRange.Range (Bereich)
    .Header = xlGuess
    .MatchCase = Flase
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With
  End If

  '** hier wird der Bereich und die Spalte verschoben
  Bereich = Range(Bereich).Offset(0, Spv).Address
  sSpalte = Range(sSpalte).Offset(0, Spv).Address
  lpz = lpz + 1  'Loop Zaehler
Loop

End Sub

'nur zum Spalten Testen
  'Range(Bereich).Select
  'MsgBox Selection.Address
  'Range(sSpalte).Select
  'MsgBox Selection.Address
[attachment=7166]Vielen Dank euch beiden, ich werde beides einmal ausprobieren und bescheid geben wenn's klappt. :thumps_up

mfg
Christian




________________________________
habe das ganze grad in Excel ausprobiert mit einer Beispieltabelle.
Das Makro sortiert zwar was aber nicht in der Reihenfolge wie ich es gern hätte

Ich habe die Beispieldatei mal in den Anhang gepackt.

________________________________
ok habe den Fehler gefunden, das Makro soll ja die Zeilen nach einer Hilfspalte sortieren. Diese Hilfsspalte erzeuge ich mittels einer Funktion (=Teil(A4;4;20) damit ich es schaffe die Zeile zu sortieren.

Kann mir einer vielleicht einen Tipp geben wie ich die Hilfspalte ersetzten kann, aber trotzdem die Zeilen nach meiner benutzerdefinierten Liste sortieren kann?
Das Problem ist, Der Inhalt der Zelle ist wie folgt aufgebaut:
A01 LED
A01 Lichtleiter
A01 Justage
A02 LED
A02 Lichtleiter
A02 Justage
.
.
.

Die Reihenfolge soll so aussehen:
A01 LED
A02 LED
.
.
A01 Lichtleiter
A02 Lichtleiter
.
.
A01 Justage
A02 Justage

Mit der Hilfsspalte hat das manuelle Sortieren funktioniert.
Hallo Christian,

(25.09.2016, 18:13)xChristianx schrieb: [ -> ]Mit der Hilfsspalte hat das manuelle Sortieren funktioniert.

in Deiner Beispieldatei funktioniert das auch nicht manuell.
Die Hilfsspaltenformel ist falsch, da sie führende Leerzeichen ergibt.
Richtig ist =TEIL(A4;5;20)

Da Du keine Überschriften hast, musst Du
.Header = xlYes
durch
.Header = xlNo
ersetzen.

Gruß Uwe
Achso, das wusste ich nicht.
Danke für den Hinweis, jetzt funktioniert alles wie es soll.
Vielen lieben Dank

mfg
Christian