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

VBA Code beschleunigen/optimieren

VBA Code beschleunigen/optimieren
05.05.2014 00:29:46
Ingo
Hallo
Ich habe eine Excel Tabelle mit ca. 1000 Zeilen und ca 40 Spalten.
Ich habe darin ein VBA-Scriot, welches mir aus den Datensätzen (Inhalte der Zellen einer Zeile) jeweils eine HTML-Datei schreibt.
Manchmal habe ich den Bedarf, dieses HTML-Schreiben für alle 1000 Datensätze/Zeilen auf einmal durchführen zu lassen.
Dafür habe ich folgendes Script:
Dim zeile As Long
zeile = 2
Do
If ActiveSheet.Cells(zeile, 3) = "" Then Exit Do
ActiveSheet.Cells(zeile, 3).Activate
Call Neuer_Artikel_Alle
zeile = zeile + 1
Loop
Wenn ich das ausführe, sehe ich, wie die Zeilen meiner Exeltabelle der Reihe nach (sehr schnell) nacheinander aktiv werden und das Script sozusagen von oben nach unten "durchflitzt".
Bitte entschuldigt, wenn ich das so komisch beschreibe, aber mir fällt nichts besseres ein, umd das zu beschreiben.
Meine Frage ist nun, ob es für diese komplette Ausführung mittels des obigen Scriptes überhaupt notwenig ist, dass das Script sozusagen für mich sichbar Zeile für Zeile der Excel-Tabelle abarbeitet (wenn auch sehr schnell).
Insgesamt dauert so ein Durchganh aber do ca. 30 Sekunden oder so.
Kann ich das noch irgendwie beschleunigen, so dass der Durchgang quasi sofort erfolg.
Hoffentlich konnte ich einigermaßen klarmachen, was ich eigentlich will :-)
Gruß
Ingo

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Code beschleunigen/optimieren
05.05.2014 02:46:50
MatthiasG
Hallo Ingo,
spare dir das Selektieren der Zelle, bevor du die Prozedur "Neuer_Artikel_Alle" aufrufst, sondern übergebe stattdessen die Zelle als Argument an die Prozedur:

Dim zeile As Long, z as Range
zeile = 2
Do
If Cells(zeile, 3) = "" Then Exit Do
Neuer_Artikel_Alle Cells(zeile, 3)
zeile = zeile + 1
Loop
Allerdings musst du dann die Prozedur Neuer_Artikel_Alle noch anpassen (Argument einfügen).
Vielleicht postest du noch die Prozedur, dann könnte ich Dir weiterhelfen.
Gruß Matthias

AW: VBA Code beschleunigen/optimieren
05.05.2014 08:00:22
Ingo
Mit "Prozedur" ist sicher das Makro gemeint, welches für alle Zellen meiner Excel Tabelle ausgeführt werden soll, richtig? Hier ist es (gekürzt):
Sub Neuer_Artikel_Alle()
Dim iT As Integer
Dim iFile As Integer
Dim iRow As Long
Dim iAnz As Integer
Dim i As Integer
Dim petFile As String
If bolAbbruch Then Exit Sub
iFile = FreeFile
iRow = ActiveCell.Row
petFile = LCase(Range("BestNr").Cells(iRow)) & ".php"
Open "D:\" & petFile For Output As iFile
Print #iFile, "blablabla"
Close iFile
End Sub

Anzeige
AW: VBA Code beschleunigen/optimieren
05.05.2014 12:37:31
MatthiasG
Hallo Ingo,
wenn die Prozedur immer auf das aktive Arbeitsblatt angewendet wird, kannst du es so machen:

Dim zeile As Long, z as Range
zeile = 2
Do
If Cells(zeile, 3) = "" Then Exit Do
Neuer_Artikel_Alle zeile
zeile = zeile + 1
Loop
Und dann die Unterroutine:

Sub Neuer_Artikel_Alle(Optional iRow)
Dim iT As Integer
Dim iFile As Integer
Dim iAnz As Integer
Dim i As Integer
Dim petFile As String
If bolAbbruch Then Exit Sub
iFile = FreeFile
'Zeile nur ermitteln, wenn nicht als Argument mitgegeben:
If IsMissing(iRow) Then iRow = ActiveCell.Row
petFile = LCase(Range("BestNr").Cells(iRow)) & ".php"
Open "D:\" & petFile For Output As iFile
Print #iFile, "blablabla"
Close iFile
End Sub
Wobei ich diesen Ausdruck nicht ganz verstehe:
Range("BestNr").Cells(iRow)
Was kommt dabei raus?
Application.ScreenUpdating muss nur eingesetzt werden, wenn die Selektion von Zellen unvermeidbar ist.
Eine hilfreiche Abhandlung über Selektieren in VBA-Code findest du hier:
http://de.wikibooks.org/wiki/VBA_in_Excel/_Selektieren
Gruß Matthias

Anzeige
AW: VBA Code beschleunigen/optimieren
05.05.2014 14:23:36
Ingo
OK vielen lieben Dank.

AW: VBA Code beschleunigen/optimieren
05.05.2014 11:11:35
Ingo
Ich habe übrigens gerade noch diese Möglichkeit hier gefunden, die Bildschirmaktualisierung beim Ausführen zu deaktivieren:
Application.ScreenUpdating = False
Das beschleunigt die Ausführunf ja auch schon mal wieder etwas ... richtig?

AW: Werte erst in ein Array einlesen, dann Schleif
05.05.2014 15:34:55
Daniel
man kann die Bildschirmaktualisierung abschalten, um den Vorgang zu beschleunigen.
man kann aber auch gleich vernünftig programmieren was meistens noch schneller ist.
in deinem Fall heißt das, dass man die Werte zuerst in ein Array einliest und dann die Schleife über das Array laufen lässt.
Schleifen über Arrays sind sehr schnell
Schleifen über Excelzellen sind langsam.
Schleifen über Excelzellen, bei denen man die Zellen selektiert, sind sehr langsam.
in deinme Fall könnte der Code - zu einem Makro zusammengefasst - so aussehen:
Sub Makro()
Dim i As Long
Dim arr
Dim petFile As String
arr = Range("BestNr").Value
For i = 2 To UBound(arr, 1)
If arr(i, 1)  "" Then
petFile = LCase(arr(i, 1)) & ".php"
Open "D:\" & petFile For Output As iFile
Print #iFile, "blablabla"
Close iFile
End If
Next
End Sub
Gruß Daniel

Anzeige
AW: Werte erst in ein Array einlesen, dann Schleif
05.05.2014 17:57:03
Ingo
OK danke auch Dir.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige