Code optimal?

Moderator: ModerationP

Code optimal?

Beitragvon Zitrone50 » 04. Okt 2017, 14:35

Guten Morgen

Ich habe mal via VBA einen Code genieriert und frage mich, ob dieser optimiert werden kann, da bei 33000 Zeilen es doch eine Weile dauert :(

Code: Alles auswählen
Sub testi()
    Set w = ThisWorkbook.Worksheets("Tabelle1")
    i = 2
    Do While w.Cells(i, 8) <> ""
        If IsEmpty(w.Cells(i, 1)) Then
            For y = 1 To 7
                If Cells(i, y) = "" Then Cells(i, y) = Cells(i - 1, y)
            Next
        End If
        i = i + 1
    Loop
End Sub


Der Code macht folgende Funktion:
Solange in Spalte H einen Wert steht, soll er die entsprechende Zeile "untersuchen":
Falls irgend eine Spalte A bis G leer ist, so soll er den Wert oberhalb dieser Zeile schreiben (es kann sein, dass A6 leer ist, dann schreibt er dort den Wert von A5 rein, aber es bedeutet nicht unbedingt, dass die ganze Zeile A6 bis G6 leer ist).

Nun muss das Programm also knapp 230'000 Zellen untersuchen und das dauert 'ne Weile.

Auf Lösungsvorschläge bin ich gespannt :)
Danke.
Zitrone50
 

Re: Code optimal?

Beitragvon Zitrone50 » 04. Okt 2017, 14:39

Nachtrag:


Falls Ax gefüllt ist, so weiss ich, dass Bx bis Gx auch gefüllt ist.
Zitrone50
 

Re: Code optimal?

Beitragvon Storax » 04. Okt 2017, 14:40

This isn't a code writing service, you need to do some research and have a go at writing some of your own code.
Benutzeravatar
Storax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2221
Registriert: 22. Okt 2013, 18:18

Re: Code optimal?

Beitragvon Zitrone50 » 04. Okt 2017, 14:48

Danke, ich versuchs mal :)
Bin aber bei den ersten 2 mal durchlesen noch nicht ganz schlau geworden, wie ich dies umsetzen muss.
Melde mich aber nochmals.
Zitrone50
 

Re: Code optimal?

Beitragvon RPP63 » 04. Okt 2017, 14:52

Innerhalb der For…Next beziehst Du Dich auf das aktive Blatt, außerhalb auf Tabelle1
Das kann böse in die Hose gehen!

Zum Thema!
Abseits der Arrays:
F5, Inhalte, Leerzellen, OK
Wenn die aktive Zelle (also die erste Leerzelle im Bereich) B5 wäre, dann
=B4
mit Strg+Enter abschließen!!!
Markierung bestehen lassen,
kopieren,
als Wert einfügen

Kannst Du genauso mittels VBA machen;
geschätzte Laufzeit:
< 0,1 Sekunden! 8-)

Gruß Ralf
Benutzeravatar
RPP63
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8429
Registriert: 19. Okt 2012, 17:41
Wohnort: mitten im Pott

Re: Code optimal?

Beitragvon slowboarder » 04. Okt 2017, 15:44

Hi

der Vorschlag von Ralf geht super nur muss man ihn an einer Stelle noch korrigieren:

zum Kopieren und Einfügen der Formeln als Wert musst du vorher wieder die ganzen Spalten A:G markieren!
Wenn du die Markierung auf den (ehemaligen) Leerzellen stehen lässt, kann das nicht funktionieren.



Die Umsetzung als Makro sieht so aus:
Code: Alles auswählen
With Range("A:G")
    .SpecialCells(xlcelltypeblanks).FormulaR1C1 = "=R[-1]C"
    .Formula = .Value
End with


Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 23588
Registriert: 18. Apr 2009, 13:33

Re: Code optimal?

Beitragvon Pearli123 » 04. Okt 2017, 16:04

Wenns unbedingt als Schleife sein soll und ich mir die Arbeit nicht umsonst gemacht haben will:
Code: Alles auswählen
Sub m()
    sn = Worksheets("Tabelle1").Range("A1").CurrentRegion
    For i = LBound(sn) To UBound(sn)
        For j = 1 To 7
            If sn(i, j) = "" And i <> 1 Then
                sn(i, j) = sn(i - 1, j)
            End If
        Next
    Next
    Worksheets("Tabelle1").Range("A1").CurrentRegion = sn
End Sub
Pearli123
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 870
Registriert: 20. Feb 2017, 13:38

Re: Code optimal?

Beitragvon Zitrone50 » 05. Okt 2017, 21:23

Danke an alle.

ich versteh nur nicht ganz, wie der komplette code von rpp63 aussehen soll.

@slowboarder: ist dein code vollständig? ich verstehs nicht wie dieser minicode mein problem löst da ich ja nirgends eine Formel drin habe.

@pearli ich werd auch deinen Code auf Schnelligkeit testen. Danke.
Lg
Zitrone
Zitrone50
 

Re: Code optimal?

Beitragvon slowboarder » 05. Okt 2017, 21:37

Hi

jup, mein code ist vollständig.
die Erklärung steht ja bei Ralf

falls du ihn nicht verstehst, hier nochmal die Beschreibung, wie man diese Aufgabe ohne Makro lösen könnte.
Das Marko führt dann diese drei schritte aus..

1. alle Leerzellen in den gewünschten Spalten auswählen. Dazu gibt's im Menü Start - Bearbeiten - Suchen und Auswählen - Inhalte eine eigene Funktion
2. in die Leerzellen wird dann sinngemäß die Formel eingetragen =Wert von Zelle obendrüber (dh wenn A2 Leer ist, ist die eingetragene Formel: =A1)
wenn mans von Hand macht, kann man durch Eingabe von STRG+ENTER die Formel in alle markierten Zellen übernehmen.
3. zum Schluss noch die Formeln durch Werte ersetzen.

mehr braucht es nicht.


hier nochmal der Code in farbe, damit du siehst wo die drei Schritte stattfinden:

With Range("A1").CurrentRegion.Resize(, 7)
.SpecialCells(xlcelltypeblanks)
.FormulaR1C1 = "=R[-1]C"
.Formula = .Value
End with

der Code von Pearli dürfte noch schneller sein als das.
Dafür kannst du diese Methode im Bedarfsfall auch mal von Hand einsetzen, ohne vorher ein Makro schreiben zu müssen.
(und wenn man komplexere Codes entwickelt und die im Einzelstepmodus testen muss, ist man froh um jede Schleife die sich vermeiden lässt)

Gruß Daniel
slowboarder
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 23588
Registriert: 18. Apr 2009, 13:33


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: jhunter und 15 Gäste