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.
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.
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ß
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
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ß
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
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
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
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 :)
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
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ß
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
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
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
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
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
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
Danke!
Max

