Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1344to1348
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

Makro vereinfachen..... aber wie....?

Makro vereinfachen..... aber wie....?
21.01.2014 08:59:52
Toumas
Hallo zusammen,
Ich habe, dank der Hilfe hier im Forum, unten aufgeführtes Makro erstellt.
Es überprüft mir meine Spalte B und bei gewissen Funden schreibt es mir in Spalte E entsprechend was rein. Nun habe ich natürlich das Problem, das Makro braucht ewig um bei 10.0000 Zeilen alles zu überprüfen.
Kann man das ganze Ding "beschleunigen" also wesentlich einfacher und effizienter machen ? (und wenn ja, wie)
Als Idee hatte ich schon, dass ich vorher schon Abfrage ob in Spalte E bereits etwas steht und diese Zeilen dann ausspare, aber dann hätte ich nochmals eine Abfrage die das ganze wohl eher noch verlangsamen würde.
Könntet ihr so freundlich sein und mir unter die Arme greifen ?
Wenn möglich die Tipps für das Makro so gestalten, dass ich sie nachvollziehen kann, möchte es schließlich ja auch noch weiter lernen ;-)
Vielen Dank im Voraus
Viele Grüße
Toumas
Das Makro :
Sub Fiktive_Stapelbezeichnung_Gegenstandsart()
Dim Zelle As Range
Sheets("TEST").Select
For Each Zelle In Range(Cells(1, 2), Cells(Range("B10000").End(xlUp).Row, 1))
Select Case True
Case Zelle = "4003": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "4700": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "4701": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6201": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6202": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6204": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6205": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6206": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6301": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6302": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6303": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6304": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6305": Zelle.Offset(0, 3) = "Abgabe01"
Case Zelle = "6850": Zelle.Offset(0, 3) = "Abgabe01"
End Select
Next Zelle
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro vereinfachen..... aber wie....?
21.01.2014 09:34:16
Rudi
Hallo,
erst mal:
Sub Fiktive_Stapelbezeichnung_Gegenstandsart()
Dim lngCalc As Long
Dim Zelle As Range
Sheets("TEST").Select
With Application
lngCalc = .Calculation
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
For Each Zelle In Range(Cells(1, 2), Cells(Range("B10000").End(xlUp).Row, 1))
Select Case Zelle
Case "4003", "4700", "4701", "6201", "6202", "6204", "6205", _
"6206", "6301", "6302", "6303", "6304", "6305", "6850"
Zelle.Offset(0, 3) = "Abgabe01"
End Select
Next Zelle
Application.Calculation = lngCalc
End Sub

Wenn sich keine Formeln im Bereich B:E befinden, kann man den Bereich erst in ein Array einlesen und dann zurückschreiben.
Sub Fiktive_Stapelbezeichnung_Gegenstandsart_a()
Dim lngCalc As Long
Dim arr, i As Long
Sheets("TEST").Select
With Application
lngCalc = .Calculation
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
arr = Range(Cells(1, 2), Cells(Rows.Count, 2).End(xlUp)).Resize(, 4)
For i = 1 To UBound(arr)
Select Case arr(i, 1)
Case "4003", "4700", "4701", "6201", "6202", "6204", "6205", _
"6206", "6301", "6302", "6303", "6304", "6305", "6850"
arr(i, 4) = "Abgabe01"
End Select
Next i
Cells(1, 2).Resize(UBound(arr), 4) = arr
Application.Calculation = lngCalc
End Sub

Gruß
Rudi

Anzeige
AW: Makro vereinfachen..... aber wie....?
21.01.2014 09:37:31
Toumas
Hallo Rudi,
danke dir, ich werde es gleich testen

AW: Makro vereinfachen..... aber wie....?
21.01.2014 09:43:52
Toumas
Hallo Rudi,
nachdem ich die paar Formeln ausgelagert habe, funktionieren beide Lösungen super gut, vielen Dank für deine Mühe.
viele Grüße
Toumas

anderer Ansatz: Autofiler
21.01.2014 10:35:00
Klaus
Hallo Thoumas,
ein ganz anderer Ansatz:
ich habe das ganze mit dem Autofilter gelöst.
Sub Fiktive_Stapelbezeichnung_Gegenstandsart()
'Bildschirmflackern-Krücke abschalten
Application.ScreenUpdating = False
'Willst du es wirklich selektieren? ....
Sheets("TEST").Select
'... oder nur referenzieren?
With Sheets("TEST")
'Autofilter aussschalten, falls er an ist
If .AutoFilterMode Then .Cells.AutoFilter
'letzte Zeile
lRow = .Cells(.Rows.Count, 2).End(xlUp).Row
'Autofilter auf Spalte B legen
.Range("B2:B" & lRow).AutoFilter
'Filtern
.Range("B2").AutoFilter Field:=1, Criteria1:=Array( _
"4003", "4700", "4701", "6201", "6202", "6204", "6205", "6206", "6301", "6302", " _
6303", "6304", "6305", "6850"), Operator:=xlFilterValues
'Einträge schreiben
.Range("E3:E$" & lRow).SpecialCells(xlCellTypeVisible).Value = "Abgabe01"
'Autofilter wieder abschalten
.Cells.AutoFilter
End With
Application.ScreenUpdating = True
End Sub
Rudi beschleunigt das ganze, indem er die Schreibvorgänge der Schleife VBA-intern im Array erledigt, statt langsam auf dem Tabellenblatt.
Mein Ansatz beschleunigt, indem er ganz auf die Schleife verzichtet. Was am Ende schneller / für dich besser ist, musst du austesten :-)
Grüße,
Klaus M.vdT.

Anzeige
AW: anderer Ansatz: Autofiler
21.01.2014 11:50:38
Toumas
Hallo Klaus,
danke für den anderen Tipp, ich werde ihn auch gleich mal testen....
und ja mit dem Select hast du natürlich Recht.... ich bekomme es nicht so schnell aus dem Kopf raus... ;-)
Viele Grüße
Toumas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige