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

Array anstelle von find

Array anstelle von find
22.04.2016 10:37:19
Felix

Hallo Excelfreunde,
ich habe mal wieder ein Problem und bin im Netz nicht so recht fündig geworden.
Und zwar habe ich performance Probleme bei meinem Makro.
Es dauert zu lang und ich versuche die Zeit zu reduzieren.
Events, automatische Berechnungen und Bildschirmaktualisierung sind bereits aus, Fenster wird minimiert.
Das hat auch alles seinen Zweck erfüllt, aber ich muss weiter optimieren.
Online habe ich gelesen, dass durch die Verwendung von Arrays statt Find eine Zeitersparnis möglich ist.
Siehe: https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/
Leider habe ich es nicht geschafft, daraus schlau zu werden, geschweige denn es auf mein Projekt zu übertragen.
Mein Code sieht die Verwendung von Find folgendermaßen vor:
https://www.herber.de/bbs/user/105144.xlsm


Public Geschlecht As String, Spartarten As String
Sub Leerzeilenlöschen()
'Es sollen die Bereiche gelöscht werden, bei denen alle drei Tageszeiten für Gesamt Frau und  _
Gesamt Mann jeweils 0 sind
'Die Suchmatrix mit dem String Mann/Frau ist die Spalte C
Set suche = Range("C1")
'in der Spalte N gibt es eine beliebige Anzahl an Sportarten, für die in den Spalten D, E unf F  _
_
Werte stehen
'Sie tauchen dort in Blockform auf und unterteilen sich noch einmal in Kategorien
'Die Sportarten müssen gezählt werden, damit die Blöcke nacheinander abgesucht werden können
Sportarten = Application.CountA(Sheets(xy).Range("N:N"))
'Wenn in den Zeilen Gesamt Frau/Mann jeweils die Spalten D, E und F 0 sind, wird der ganze  _
Block (-3 Zeilen nach oben) gelöscht
'Dazu werden zuerst die Zeilen der Frauen abgefragt
Geschlecht = "Frau"
'Wenn alle drei Werte 0, Zeilen löschen
Leerzeilen
'und das gleiche für die Männer
Geschlecht = "Mann"
'Wenn alle drei Werte 0, Zeilen löschen
Leerzeilen
End Sub
Sub Leerzeilen()
On Error Resume Next
'finde Geschlecht
Do
Set rngCell = ActiveSheet.Range("C1", "C500000").Find("Gesamt " & Geschlecht, LookAt:= _
xlWhole, LookIn:=xlValues, MatchCase:=True)
Set suche = rngCell.Offset(1, 0)
If rngCell.Offset(0, 1).Value = "0" And rngCell.Offset(0, 2).Value = "0" And rngCell.Offset( _
_
0, 3).Value = "0" _
Then Range(rngCell.Offset(0, 0), rngCell.Offset(-3, 0)).EntireRow.Delete
counter = counter + 1
Loop While counter < Sportarten
counter = 0
Set suche = Range("C1")
End Sub

Ich habe es der Übersicht halber reduziert.
Da es mehr Kriterien bei den Geschlechtern (ca. 120) gibt und die Sportarten bis zu 25 sein können, kommt es zu der erhöhten Dauer in meiner Prozedur.
Wenn eine Möglichkeit besteht hierfür die Array Funktion zu nutzen, welche eine zeitersparnis verspricht, bin ich für eure Hilfe sehr dankbar.

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: code schwer lesbar
22.04.2016 11:25:27
Fennek
Hallo,
In einer angemessenen Zeit könnte ich deinen code nicht lesen.
Um mit arrays zu filtern, gibt es den Befehl 'neuArray = filter(altArray, "Kriterium", wahr oder falsch)
Nach meinem Kenntnisstand geht das nur für ein-dimensionale Arrays.
Wie man Array's anlegt, bzw um-dimensioniert ist bei snb-vba.eu recht gut beschrieben.
Mfg

AW: Array anstelle von find
22.04.2016 13:25:23
ChrisL
Hi Felix
Array sind super, wenn du mit Daten/Berechnungen arbeitest, aber Formatierungen können nicht in ein Array übergeben werden. Somit müsstest du anschliessend die Formatierung wieder richtig stellen und ich bin mir darum nicht sicher, ob ein Array tatsächlich den gewünschten Effekt bringen würde.
Darum würde ich erst einmal das optimieren was du hast. Du schreibst zwar, dass die Berechnung aus ist, der Code sagt aber was anderes und du suchst bis Zeile C500000.
Zur Verbesserung der Performance:
- Wieso kommt es überhaupt soweit, dass du Mann und Frau je ein Block hast, den du anschliessend wieder löschen musst...
- Blöcke und Formatierungen sind generell ungünstig. Schön wäre ein Tabelle/Matrix z.B. Spalte A: Tanzen, Lachen, Singen, Zeile 1: Frau Morgen, Mittag, Abend, Mann Morgen Mittag Abend.
Und mal ein Optimierungsvorschlag auf bestehender Basis:
Sub Mach()
Dim iZeile As Long, letzteZeile As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("xy")
letzteZeile = .Cells(.Rows.Count, 3).End(xlUp).Row
For iZeile = letzteZeile To 1 Step -11
If WorksheetFunction.Sum(.Cells(iZeile - 1, 4), .Cells(iZeile - 1, 6)) = 0 Then _
.Rows(iZeile - 1 & ":" & iZeile - 4).Delete
If WorksheetFunction.Sum(.Cells(iZeile - 5, 4), .Cells(iZeile - 5, 6)) = 0 Then _
.Rows(iZeile - 5 & ":" & iZeile - 8).Delete
Next iZeile
End With
Application.Calculation = xlCalculationAutomatic
End Sub

cu
Chris

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige