Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Optimierung von VBA-Code, bitte um Hilfe





Frage

Hallo, ich bin nicht so wirklich geübt im programmieren und möchte einen VBA-Code an einer Stelle optimieren, weil die Performance sehr drunter leidet. Man Code sieht in etwa so aus: ActiveSheet.UsedRange.Select For Each zelle In Selection If Left(zelle.Value, 8) = "12345678" Or Left(zelle.Value, 9) = "123456789" Then zelle.Value = Left(zelle.Value, 9) ElseIf Left(zelle.Value, 5) = "54321" Then zelle.Value = Left(zelle.Value, 7) End If Next zelle Den Inhalt der If-Bediengungen lassen wir mal außen vor. Mir geht es darum den "Select-Teil" zu eliminieren, weil dieser natürlich sehr viel Zeit in Anspruch nimmt, aber wie mache ich das? Dank & Gruß Max

Antwort 1 von fürLau

Hallo

Mach´ ein Application.ScreenUpdateing = False vor der Routine und Application.ScreenUpdateing = True danach.

Gruß[h3]{[h1]Ó¤[sup...fürLau
Signatur wurde ganz und gar ohne SNTool erstellt.

Antwort 2 von JoeKe

Hallo Max,

so:

For Each zelle In ActiveSheet.UsedRange


MfG

JöKe

PS: Das von @ fürLau angesprochene unterdrückt , sofern es auftritt, Bildschirmflattern bei Zellen-, Blatt- oder anderen Sprüngen.

Antwort 3 von JoeKe

Zur Erklärung:

Selection = das was selektiert wird ;-)

Deshalb kann in fast allen Fällen auf Select und Selection verzichtet werden.

Beispiel:

A=B und B=C also kann man doch gleich schreiben A=C!?

Gruß

Antwort 4 von MaxHecker

Hallo,

Die zweite Antwort ist die, die ich gesucht habe :)

Danke Jöke und auch an fürLau!

Die Erklärung kannte ich wohl, bloß ich wusste nicht wie ich es richtig umsetzen kann :-/

Aber trotzdem Danke!

Dauert zwar immer noch alles ein wenig, liegt dann aber mehr an der Größe des UsedRange, werde ich wohl noch ein wenig eindämmen müssen.

Gruß
Max

Antwort 5 von JoeKe

Hallo Max,

du könntest auch einen festen Bereich in dem gesucht werden soll vorgeben.

Z.B. so:

For Each zelle In Range("A1:A10")


Gruß

Antwort 6 von nighty

hi all :)

die findmethode koennte in die schleife eingearbeitet werden und bei fund dessen zeilennummer an die var der for next schleife uebergen,daher folgt ,es gibt nur soviel durchlaeufe wie es funde gibt :)

30 000 zeilen und 10 funde=ergibt bei dir 30 000 durchlaeufe

mein vorschlag mit der findmethode

30 000 zeilen und 10 funde=ergibt 10 durchlaeufe

gruss nighty

hier ein kleines beispiel

Option Explicit
Sub DynamischeSchleife()
Dim zeile As Long
Dim suche As Range
For zeile = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set suche = ActiveSheet.Range("A1:A65535").Find("DeinSuchBegriff bzw Range", LookIn:=xlValues)
If Not suche1 Is Nothing Then
Rem bei fund dein code
zeile = suche.Row
End If
Next zeile
End Sub

Antwort 7 von nighty

hi all :)

ups korrigiert :))

gruss nighty

Antwort 8 von nighty

hi all :)

das korrigierte grrr

Option Explicit
Sub DynamischeSchleife()
Dim zeile As Long
Dim suche As Range
For zeile = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set suche = ActiveSheet.Range("A" & zeile & ":A65535").Find("DeinSuchBegriff bzw Range", LookIn:=xlValues)
If Not suche1 Is Nothing Then
Rem bei fund dein code
zeile = suche.Row
End If
Next zeile
End Sub

gruss nighty

Antwort 9 von MaxHecker

@ Jöke

ich hätte jetzt die exakte Spalte angegeben.

ActiveSheet.UsedRange.Rows(25)

@ nighty

sieht auch interessant aus, werde ich mal versuchen zu übernehmen

Danke :)

Antwort 10 von nighty

hi MaxHecker :)

bin heut net bei der sache :)

suche1 muss die 1weg natuerlich

gruss nighty

Antwort 11 von JoeKe

Hallo Max,

wenn du es auf eine bestimmte Spalte eingrenzen willst, schreibe es so:

For Each zelle In Range("A:A")


oder noch besser unter Berücksichtigung der letzten belegten Zeile der Spalte:

Dim letzteZeile as long
letzteZeile=Cells(Rows.Count,1).End(xlup).Row
For Each Zelle In Range("A1:A" & letzteZeile)


In diesem Beispiel habe ich die Spalte A gewählt.
Sollte es bei dir eine andere Spalte sein musst die 1 bei Rows.Count, 1 durch die entsprechende Spaltennummer ersätzt werden.

Gruß

Antwort 12 von MaxHecker

Ist ja alles irgendwie beschämend :o/

Muss mich grad durch die Hilfe lesen, damit ich auch die Befehle verstehe. Also, ich verstehe schon was der Code bewirkt, aber ich kann nicht immer genau sagen was der einzelne Part macht.

@nighty

das mit der "1" habe ich auch noch raus bekommen :)

@JöKe

Sieht auch gut aus, darauf wäre ich alleine nicht so gekommen.. *hust*

Habt ihr noch einen Rat, womit ich mich am besten weiterbilden kann?

Ich habe hier nur so ein olles Excel-VBA Buch, welches mir nicht wirklich gefällt.

Vielen Dank noch mal!

Max

Antwort 13 von JoeKe

Hallo Max,

ein Buch kann ich dir leider nicht empfehlen. Ich habe das wenige was ich kann durch ausprobieren und eifriges stöbern in Foren wie diesem gelernt und lerne immer noch dazu.

Schönes WE

Jörg

Antwort 14 von MaxHecker

Ok, ich tu es dir ja derzeit gleich ;-)

Danke, dir auch ein schönes Wochenende!

Werde jetzt Feierabend machen :)

Gruß, Max

Antwort 15 von nighty

hi all :)

nun stimmts aber,alle guten dinge sind drei
bei nichtfund muss natuerlich auch die for schleife beendet werden,brauch wohl neue brille :)))

gruss nighty

Option Explicit
Sub DynamischeSchleife()
Dim zeile As Long
Dim suche As Range
For zeile = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set suche = ActiveSheet.Range("A" & zeile & ":A65535").Find("DeinSuchBegriff bzw Range", LookIn:=xlValues)
If Not suche Is Nothing Then
Rem bei fund dein code
zeile = suche.Row
Else
Exit For
End If
Next zeile
End Sub

Antwort 16 von nighty

hi all :)

nicht das meine augen schlechter geworden sind ich vermute eher eine abnutzung der brille :)))

gruss nighty

Antwort 17 von MaxHecker

Werde es Dienstag in der Firma mal testen... ;-)

Danke!

Max

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: