Anzeige

VBA Excel - Sortierung nach Finden der Zelle


jerry0110

Erfahrenes Mitglied
#1
Hi,

ich habe in meinem Makro eine Sortierfunktion:

Visual Basic:
Private Sub Sortierung()

Dim wsData As Worksheet

Set wsData = ActiveWorkbook.Worksheets("Tabelle1")

wsData.Activate
Cells.Sort Key1:=Range.("K1"), Order1:=xlAscending, _
           Header:=xlYes, MatchCase:=False, _
           DataOption1:=xlSortNormal, DataOption2:=xlSortNormal

End Sub
Jetzt ist K1 die Überschrift "Prozess". Die steht aber nicht immer auf K1
Wie kann ich jetzt statt K1 das Wort "Prozess" suchen, damit er immer die richtige Spalte sortiert:

mein Versuch sah so aus:

Visual Basic:
Private Sub Sortierung()

Dim wsData As Worksheet

Set wsData = ActiveWorkbook.Worksheets("Tabelle1")

wsData.Activate
Cells.Sort Key1:=Range.Find(What:="Prozess", MatchCase:=True), Order1:=xlAscending, _
           Header:=xlYes, MatchCase:=False, _
           DataOption1:=xlSortNormal, DataOption2:=xlSortNormal

End Sub
Funktioniert aber nicht :(
 

Yaslaw

n/a
Moderator
#2
Erstens: Auch wenn die Makroaufzeichnungen mit Befehlen wi aktivate arbeiten. Mach das nicht. Ein Range ist an ein Worksheet gebunden
Also hast du wsData.Range.Find etc.

Beim find. solltest du noch die SearchOrder mitgeben, damit er von Zeile 1 nach Zeile x sucht. Und nicht Spalte A bis Spalte x. Ansonsten findet Excel das Wort Prozess ev. zuerst in den Daten...
Dann würde ich nicht alles verschachteln

Visual Basic:
    Dim wsData As Worksheet
    Dim rngSortCol As Range
    Set wsData = ActiveWorkbook.Worksheets("Tabelle1")
   
    Set rngSortCol = wsData.Cells.Find(what:="Prozess", searchorder:=xlByRows)
    wsData.Cells.Sort rngSortCol, xlAscending
 

jerry0110

Erfahrenes Mitglied
#3
Ok hab ich verstanden und auch umgesetzt.

Jetzt habe ich das versucht anzuwenden bei Zellen die farblich markiert werden sollen.

Visual Basic:
Sub Farbe_anpassen()

Dim source As Worksheet
Dim lastCol As Long
Dim lastRow As Long
Dim f As Long
Dim todorng As Range
Dim ergbnisrng As Range
Dim Prozesslangrng As Range


Set source = ActiveWorkbook.Worksheets("Tabelle1")
Set todorng = source.Cells.Find(what:="To do für", searchorder:=xlByRows)
Set ergbnisrng = source.Cells.Find(what:="Ergebnislang", searchorder:=xlByRows)
Set Prozesslangrng = source.Cells.Find(what:="Prozesslangtext", searchorder:=xlByRows)



'letzte Zeile & Spalte im Ziel berechnen
lastRow = xlsGetLastRow(source)
lastCol = xlsGetLastCol(source)


'    For f = lastRowNr(source) To 1 Step -1
'            If source.Range("N" & f) = "Ja" Then
'                source.Range("L" & f).Font.ColorIndex = 3
'                source.Range("L" & f).Font.Bold = True
'                source.Range("M" & f).Font.ColorIndex = 3
'                source.Range("M" & f).Font.Bold = True
'            End If
'    Next f

    For f = lastRowNr(source) To 1 Step -1
            If todorng = "Ja" Then
                ergbnisrng.Font.ColorIndex = 3
                ergbnisrng.Font.Bold = True
                Prozesslangrng.Font.ColorIndex = 3
                Prozesslangrng.Font.Bold = True
            End If
    Next f
 
End Sub
Das Auskommentierte stand vorher da.
Und so wie ich es jetzt verstanden habe suche ich nach der Zelle und verwende die als Indikator für die Zelle die dann farblich gekennzeichnet werden soll.
Klappt natürlich nicht.
 

Yaslaw

n/a
Moderator
#4
Ich versteh nicht, was das machen soll. Ist schwer anhand eines nicht funktionierenden Scriptes herauszufinden :)

item: lastrow und lastcol berchnung kannst du streichen, die brauchst du nachher nirgends.

item: Die Ranges, welche du mit find() findest ist immer nur das Feld. Wenn du die Formatierung über die ganze Spalte machen willst:
Visual Basic:
wsData.Columns(ergbnisrng.Column).Font.ColorIndex = 3
'Nicht vergessen, am Schluss die Titelzeile zu formatieren, da die Column-Formatierung auch die erste Zeile beinhltet
wsData.Rows(1).Font.ColorIndex = 1
item: Es ist zwar nicht notwendig, jedoch sauberer und später besser lesbar. Wenn du den Wert einer Ranges haben willst, nicht direkt den Range angeben sondern das Attribut value ansprechen
Visual Basic:
If todorng.value = "Ja" Then
 

jerry0110

Erfahrenes Mitglied
#5
Sorry du hast recht. Das lastRow = xlsGetLastRow(source) und das lastCol = xlsGetLastCol(source) waren von meinen Versuchen die einzelnen Spalten und Zeilen rauszusuchen.

Sinn hinter dem Script war, dass ich in der Zeile N gucke ob ein "ja" steht. Wenn ja dann soll er die Spalte L und M "fett" und "rot" markieren.
Dadurch das die Kollegen aber Reports mit falschen Überschriften, die nicht mehr zu der eigentlichen Überschrift passen, wollte ich das mit dem Suchen dann machen.

Suche nach der Überschrift und gucke dann ob in der Zeile "ja" steht und dann markiere wieder mit "fett" und "rot".
 
Anzeige

Neue Beiträge

Anzeige