Live-Forum - Die aktuellen Beiträge
Datum
Titel
23.04.2024 14:59:21
23.04.2024 14:47:39
23.04.2024 14:23:45
Anzeige
Archiv - Navigation
1728to1732
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

Suche: Schnellere Prüfroutine als mit If

Suche: Schnellere Prüfroutine als mit If
20.12.2019 11:06:06
Daniel
Hallo zusammen,
ich habe eine kleine if-Schleife, die jedoch über 8.000 Zeilen durchlaufen muss und daher extrem lange dauert:
With tblRCA
lngZeileMax = .Cells(.Rows.Count, 11).End(xlUp).Row
Set rngBereich = .Range("K2:K" & lngZeileMax)
For Each rngZelle In rngBereich
lngNummer = rngZelle.Row
If .Range("P" & lngNummer).Value = "Open" And .Range("W" & lngNummer).Value = "Yes" And .Range("Y" & lngNummer).Value "" Then
.Range("AF" & lngNummer).Value = "Re-Open-Overdue"
ElseIf .Range("P" & lngNummer).Value = "Open" And .Range("W" & lngNummer).Value = "Yes" Then
.Range("AF" & lngNummer).Value = "Open-Overdue"
ElseIf .Range("P" & lngNummer).Value = "Open" And .Range("Y" & lngNummer).Value "" Then
.Range("AF" & lngNummer).Value = "Re-Open"
Else
.Range("AF" & lngNummer).Value = .Range("P" & lngNummer).Value
End If
Next rngZelle
End With
Kann man das vielleicht irgendwie ressourcenschonender darstellen?
Vielen Dank und viele Grüße
Daniel

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suche: Schnellere Prüfroutine als mit If
20.12.2019 11:08:16
Hajo_Zi
Hallo Daniel,
find
Set Rafound1 = Columns(1).Find("Erledigt", Range("A" & Rows.Count), xlFormulas, _
xlWhole, , xlNext)

AW: Suche: Schnellere Prüfroutine als mit If
20.12.2019 11:35:51
Beverly
Hi Daniel,
würdest du nur nach dem Begriff "Open" in Spalte P suchen, könnte man es mittels FindNext-Methode realisieren (so wie von Hajo vorgeschlagen). Du du jedoch nicht nur nach dem Begriff "Open" suchst sondern auch einen Else-Zweig hast, in dem alles andere außer "Open" in den Zellen stehen könnte, wird dir nichts weiter übrig bleiben, als alle Zeilen zu durchlaufen.
Man könnte es vielleicht auch mittels Autofilter versuchen, indem man einmal nach "Open" und einmal nach "Open" filtert und dabei nur die sichtbaren Zeilen bearbeiten - ob das jedoch schneller ist habe ich nicht getestet.


Anzeige
AW: Array
20.12.2019 11:31:54
Fennek
Hallo,
kopiere zuerst alle benötigten Spalten in ein Array:

Ar = Range(K1:AF8000")
Dann für alle Berechungen im Array durch. Schleifen in den Zellen sind recht langsam, in Array _ sehr schnell. Wenn das fertig ist, schreibe das Array auf einmal zurück:

Range("K1").resize(Ubound(Ar), Ubound(Ar,2)) = Ar
Es sollte nicht länger als 1-2 Sekunden brauchen.
mfg
AW: Array
20.12.2019 11:32:48
Fennek
Hallo,
kopiere zuerst alle benötigten Spalten in ein Array:

Ar = Range(K1:AF8000")
Dann für alle Berechungen im Array durch. Schleifen in den Zellen sind recht langsam, in Array sehr schnell.
Wenn das fertig ist, schreibe das Array auf einmal zurück:

Range("K1").resize(Ubound(Ar), Ubound(Ar,2)) = Ar
Es sollte nicht länger als 1-2 Sekunden brauchen.
mfg
Anzeige
AW: Suche: Schnellere Prüfroutine als mit If
20.12.2019 11:37:41
Nepumuk
Hallo Daniel,
teste mal:
Public Sub test()
    
    Dim tblRCA As Worksheet
    Dim lngZeileMax As Long
    Dim avntInputValues As Variant, avntOutputValues() As Variant
    Dim ialngIndex As Long
    
    Set tblRCA = Tabelle1
    
    With tblRCA
        
        lngZeileMax = .Cells(.Rows.Count, 11).End(xlUp).Row
        
        avntInputValues = .Range(.Cells(1, 1), .Cells(lngZeileMax, 25)).Value2
        
        avntOutputValues = .Range(.Cells(1, 32), .Cells(lngZeileMax, 32)).Value2
        
        For ialngIndex = LBound(avntInputValues) + 1 To UBound(avntInputValues)
            
            If avntInputValues(ialngIndex, 16) = "Open" And avntInputValues(ialngIndex, 23) = "Yes" And Not IsEmpty(avntInputValues(ialngIndex, 25)) Then
                
                avntOutputValues(ialngIndex, 1) = "Re-Open-Overdue"
                
            ElseIf avntInputValues(ialngIndex, 16) = "Open" And avntInputValues(ialngIndex, 23) = "Yes" Then
                
                avntOutputValues(ialngIndex, 1) = "Open-Overdue"
                
            ElseIf avntInputValues(ialngIndex, 16) = "Open" And Not IsEmpty(avntInputValues(ialngIndex, 25)) Then
                
                avntOutputValues(ialngIndex, 1) = "Re-Open"
                
            Else
                
                avntOutputValues(ialngIndex, 1) = avntInputValues(ialngIndex, 16)
                
            End If
            
        Next
        
        .Range(.Cells(1, 32), .Cells(lngZeileMax, 32)).Value = avntOutputValues
        
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Suche: Schnellere Prüfroutine als mit If
20.12.2019 12:40:17
Daniel
Hi
Das beste wäre hier, wenn du die Prüfung als Formel erstellt un dann das Makro die Formel in die Zellen schreiben lässt. Hinterher kannst du Formeln durch Werte ersetzen.
With rngBereich
.FormulaLocal = "=Deine Formel in Deutsch"
.Formula = .Value
End with
Gruß Daniel
AW: Suche: Schnellere Prüfroutine als mit If
20.12.2019 16:15:50
Daniel
Vielen Dank euch allen!
@Nepumuk: das hat super geklappt.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige