Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1820to1824
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

Liste schnell durchsuchen u. Zelle färbe

Liste schnell durchsuchen u. Zelle färbe
17.03.2021 16:02:21
Georg
Hallo VBA-Experten!
Eine aufsteigend sortierte Zahlenliste möchte ich möglich schnell "durchsuchen", um Zellen die den Wert 888 enthalten gelb zu färben.
Angelehnt an den Quicksort, halte ich es für recht effektiv, sich immer den Wert der vorher ermittelten Listenmitte anzuschauen, um dann wiederum von der ersten Hälfte wieder die Mitte zu ermitteln für die Wertüberprüfung, usw.
Dazu habe ich eine Skizze erstellt, die den Ablauf schematisch darstellt:
Userbild
Spalte A : aufsteigend sortierte Zahlenliste
Von der Gesamtzeilenanzahl wird zuerst die Mitte ermittelt
Dann wird der Wert von der Mitte mit 888 verglichen
Wenn kein 888 vorhanden, wird wieder die Mitte der oberen Hälfte ermittelt, usw.
Mein erstes Coding:
  • 
    Sub Test_Neu()
    Dim intUnten As Integer
    Dim intOben As Integer
    Dim intMitte As Integer
    Dim intZaehler As Integer
    Dim blnSchalterOben As Boolean
    Dim blnSchalterUnten As Boolean
    Dim blnSchalter As Boolean
    blnSchalterOben = False
    blnSchalterUnten = False
    intOben = 1
    intUnten = Cells(Rows.Count, 1).End(xlUp).Row
    intMitte = (intUnten + intOben) / 2
    Debug.Print intOben
    Debug.Print intMitte
    Debug.Print intUnten
    blnSchalter = True
    Do
    If Cells(intMitte, 1).Value = 801 Then
    intZaehler = intMitte
    Do Until Cells(intZaehler, 1).Value  888
    Cells(intZaehler, 1).Interior.Color = 65535 'gelb
    intZaehler = intZaehler - 1
    Loop
    blnSchalterOben = True
    intZaehler = intMitte
    Do Until Cells(intZaehler, 1).Value  888
    Cells(intZaehler, 1).Interior.Color = 65535 'gelb
    intZaehler = intZaehler + 1
    Loop
    blnSchalterUnten = True
    Else
    If blnSchalter = True Then
    intUnten = intMitte
    intMitte = (intUnten + intOben) / 2
    Else
    '                intUnten = intMitte
    intMitte = ((intMitte + intOben) / 2) + intMitte
    End If
    If intMitte = intUnten Then
    '                intOben = 1
    intUnten = Cells(Rows.Count, 1).End(xlUp).Row
    '                intMitte = (intUnten + intOben) / 2
    intOben = (intUnten + intOben) / 2
    blnSchalter = False
    End If
    End If
    Loop Until (blnSchalterOben = True And blnSchalterUnten = True) Or (intMitte = intUnten)
    End Sub
    

  • Vielen Dank für Eure Ideen.
    VG, Georg

    4
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Liste schnell durchsuchen u. Zelle färbe
    17.03.2021 16:10:14
    ralf_b
    käme eine bedingte Formatierung für dich in Frage?

    AW: Liste schnell durchsuchen u. Zelle färbe
    18.03.2021 10:25:30
    Georg
    Hallo Ralf,
    vielen Dank, eine bedingte Formatierung geht auch.
  • 
    Sub Bed_Formatierung()
    Columns("A:A").Select
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, Formula1:="=880",  _
    Formula2:="=890"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
    .Color = 65535  'gelb
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Range("A1").Select
    ActiveWorkbook.Save
    End Sub
    

  • Gruß, Georg

    Anzeige
    AW: Liste schnell durchsuchen u. Zelle färbe
    17.03.2021 16:14:01
    Rudi
    Hallo,
    wenn die Liste sortiert ist:
    ersteZeile = Application.Match(888,Columns(1), 0)
    letzteZeile = ersteZeile + Application.CountIf(columns(1), 888) - 1
    Gruß
    Rudi

    AW: Liste schnell durchsuchen u. Zelle färbe
    18.03.2021 09:20:48
    Georg
    Hallo Rudi,
    vielen Dank für Deine Lösung.
    Super einfach!
    Code funktioniert:
  • 
    Sub Test2()
    Dim ErsteZeile As Integer
    Dim LetzteZeile As Integer
    ErsteZeile = Application.Match(888, Columns(1), 0)
    LetzteZeile = ErsteZeile + Application.CountIf(Columns(1), 888) - 1
    Debug.Print ErsteZeile, LetzteZeile
    End Sub
    

  • Man müsste noch genauer das Workbook beschreiben, wenn man mehrere Exceldateien offen hat.
    Gruß,
    Georg
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige