VBA Makro: per For Schleife Spalten im Bereich durch Variable ersetzten
#1
Hallo Forum,

ich habe in Excel das Problem, das ich von Spalte B bis Spalte S in einem Bereich von Zeile 5 bis Zeile 28 sortieren muss.

In den Zellen sind Eurobeträge enthalten.

Habe ich z. B. den Bereich von B5:B28, so kann das Makro unten wie gewünscht sortieren.

Jetzt wollte ich mit einer Schleife, die Spalten "B" bis "S", in den identische Zeilen, durchlaufen lassen und im Makro die Spalte per Variable der Schleife ersetzten.
Soweit ja ok.

Hier stehe ich nun etwas auf dem Schlauch, da die Spalten ja Buchstaben sind, und keine Ziffern.

Die Schleife müsste also nacheinander B5:B28, C5:C28, D5:D28 usw. generieren.


Wie kann man denn das Problem lösen?


Danke schon mal im Voraus für eure Hilfe!

MfG

Code:
Sub Makro3()
'
' Makro3 Makro
'

'
    Range("B5:B28").Select
    ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add2 Key:=Range( _
        "B5:B28"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Tabelle1").Sort
        .SetRange Range("B5:B28")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
Antworten Top
#2
Hallo,

lade bitte eine Beispieldatei hoch. Anhand des Quelltextes wird die niemand nachbauen wollen. Aus deiner Beschreibung wird man auch nicht so richtig schlau.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#3
Moin Python,

neben der Zelladressierung A1, B1 usw. gibt es in VBA noch die Möglichkeit sowohl Spalte als auch Zeile numerisch anzusprechen. Gerade für FOR-Schleifen ein gutes Feature.

Die Syntax ist etwas anders als bei der A1-Adresse, hier steht nicht die Spalte sondern die Zeile vorne. Beispiele:


Code:
With ActiveWorksheet
     .Cells(1,1) ' =A1
     .Cells(2,1) ' =A2
     .Cells(1,2) ' =B1
End With

Viel Erfolg!

d`r Bastler von den VBAsteleien.de
Win 10 & 11, Office 2019 & 2021 & macOS X.15, XL 2019
Antworten Top
#4
Hallo Python,

denkbar wäre auch so ein Lösungsansatz:

Code:
Option Explicit

Sub Spalten_sortieren()
    Dim varDatArr As Variant
    Dim intAnz As Integer
    Dim strSp As String
    varDatArr = Array("B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S")
    For intAnz = 0 To 17
    strSp = varDatArr(intAnz) & "5:" & varDatArr(intAnz) & "28"
        ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add2 Key:=Range( _
            strSp), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("Tabelle1").Sort
            .SetRange Range(strSp)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next intAnz
End Sub

Allerdings hat es sich für mich nicht erschlossen, aus welchem Grund du die Spalten einzeln sortieren möchtest.  Stelle doch bitte eine Beispieldatei mit dem händisch eingetragenen Wunschergebnis ein. Ich bin (fast) sicher, dass es einen einfacheren Weg gibt.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#5
Hallo,

so ist es noch einfacher:

Code:
Option Explicit

Sub Spalten_sortieren()
    Dim varDatArr As Variant
    Dim intAnz As Integer
    Dim strSp As String
    For intAnz = 66 To 83
    strSp = Chr(intAnz) & "5:" & Chr(intAnz) & "28"
        ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add2 Key:=Range( _
            strSp), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("Tabelle1").Sort
            .SetRange Range(strSp)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next intAnz
End Sub
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#6
Hallo,

danke für eure zahlreichen Antworten und Hilfe!


Ja, ich weiß, es immer schwierig sich in so ein Beschreibung hinein zu versetzen.


Anbei die Beispiel.xlsx, um mein Anliegen zu verdeutlichen.

• Jede Spalte hat eine Überschrift, hier eben "Spalte X", hellgrau hinterlegt.

• In der letzten Zeile ist eine Summe der Beträge in der Spalte, hellgrau hinterlegt.

• Nicht jede Spalte hat die gleiche Anzahl an ausgefüllten Zeilen, mache Spalten können auch leer sein.


Ziel soll sein, die Werte jeder der Spalten, ab eine Zeile unterhalb der Spaltenüberschrift, bis zur Summe am Ende, der Größe nach aufsteigend zu sortieren.

Die Sortierung soll nicht direkt während/nach der Eingabe geschehen, sondern nur per Makro, welches per Button angesprochen wird. Wie das geht ist klar.


Vielen Dank,
Astrophytum


Angehängte Dateien
.xlsx   Beispiel.xlsx (Größe: 11,04 KB / Downloads: 2)
Antworten Top
#7
Hallo, 19 

entweder die aktive Spalte, oder alle Spalten: 21
[attachment=43225]
Antworten Top
#8
Morgen Case,

danke für das Beispiel, ja so soll es sein. :)


Ich baue das jetzt nach meinem Bedarf um.

Schönen Sonntag noch,
Steffen
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste