Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
672to676
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
672to676
672to676
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Makro beschleunigen

Makro beschleunigen
28.09.2005 09:10:08
Alexander
Hallo liebes Forum,
ich bin wiedermal soweit das ich Hilfe benoetige. Ich habe eine wunderschoene Exceltabelle gemacht, leider hat sie sich in der Praxis als etwas untauglich erwiesen. Ich lasse den VBA Code nach druecken der F9 Taste durchlaufen. Leider muss aber der VBA CODE immer rund 400 Zeilen durchlaufen und das dauert immer so 30 Sek, was ich fuer zu lange halte.
Gibt es irgendeine Moeglichkeit es nicht mit einer FOR Schleife zu loesen. Ich habe schon etwas mit If ActiveCell.Address und If Target.Address versucht aber ohne Erfolg. Theoretisch sollte es ja auch einfach mit Change funktionieren, also das updaten nach Aenderung einer Zelle. Allerdings muesste ich dafuer die aktuelle Zeile auslesen, um die FOR Schleife zu umgehen. Habe leider keine Ahnung wie das funktionieren soll.
Ich habe mal die BASIC Version meiner Exceltabelle mit hochgeladen. Fuer Hilfe bin ich auesserst dankbar. (Eigentlich sollte es auch moeglich sein Bier zu mailen, da mit man sich auch mal erkenntlich zeigen kann ;-)
Vielen Dank Alex
PS: Der Link zur Datei
https://www.herber.de/bbs/user/26994.xls

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro beschleunigen
28.09.2005 09:48:58
u_
Hallo,
Application.screenupdating=false am Anfang und =True am Ende kann Wunder wirken.
Gruß
Geist ist geil!
AW: Makro beschleunigen
28.09.2005 09:49:33
Nepumuk
Hallo Alex,
deim Makro duchläuft immer alle If - Abfragen. So sollte es schon etwas schnelle laufen:
Private Sub Update2_Click()
    Dim m As Long
    Application.ScreenUpdating = False
    For m = 8 To Range("a65536").End(xlUp).Row
        Select Case Cells(m, 7)
            Case "Stores"
                Cells(m, 7).Interior.ColorIndex = 5
                Cells(m, 7).Font.ColorIndex = 2
            Case "Goods Inwards"
                Cells(m, 7).Interior.ColorIndex = 53
                Cells(m, 7).Font.ColorIndex = 2
            Case "Procurement"
                Cells(m, 7).Interior.ColorIndex = 43
                Cells(m, 7).Font.ColorIndex = 1
            Case "Order Revised"
                Cells(m, 7).Interior.ColorIndex = 44
                Cells(m, 7).Font.ColorIndex = 1
            Case "Order on Hold"
                Cells(m, 7).Interior.ColorIndex = 27
                Cells(m, 7).Font.ColorIndex = 1
            Case "Order Late"
                Cells(m, 7).Interior.ColorIndex = 3
                Cells(m, 7).Font.ColorIndex = 2
            Case "Order Rejected"
                Cells(m, 7).Interior.ColorIndex = 45
                Cells(m, 7).Font.ColorIndex = 1
            Case "Short Delivery"
                Cells(m, 7).Interior.ColorIndex = 46
                Cells(m, 7).Font.ColorIndex = 1
            Case "Not Started"
                Cells(m, 7).Interior.ColorIndex = 2
                Cells(m, 7).Font.ColorIndex = 1
            Case "Free to Order"
                Cells(m, 7).Interior.ColorIndex = 38
                Cells(m, 7).Font.ColorIndex = 1
        End Select
    Next m
    Application.ScreenUpdating = True
End Sub

Noch besser wäre es, wenn du das ganze in eine Ereignisprozedur bringst. Damit müsste dann immer nur die geänderte Zeile bearbeitet werden. Beispielsweise so:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim objCell As Range
    If Target.Column = 7 Then
        For Each objCell In Target
            Select Case objCell.Text
                Case "Stores"
                    objCell.Interior.ColorIndex = 5
                    objCell.Font.ColorIndex = 2
                Case "Goods Inwards"
                    objCell.Interior.ColorIndex = 53
                    objCell.Font.ColorIndex = 2
                Case "Procurement"
                    objCell.Interior.ColorIndex = 43
                    objCell.Font.ColorIndex = 1
                Case "Order Revised"
                    objCell.Interior.ColorIndex = 44
                    objCell.Font.ColorIndex = 1
                Case "Order on Hold"
                    objCell.Interior.ColorIndex = 27
                    objCell.Font.ColorIndex = 1
                Case "Order Late"
                    objCell.Interior.ColorIndex = 3
                    objCell.Font.ColorIndex = 2
                Case "Order Rejected"
                    objCell.Interior.ColorIndex = 45
                    objCell.Font.ColorIndex = 1
                Case "Short Delivery"
                    objCell.Interior.ColorIndex = 46
                    objCell.Font.ColorIndex = 1
                Case "Not Started"
                    objCell.Interior.ColorIndex = 2
                    objCell.Font.ColorIndex = 1
                Case "Free to Order"
                    objCell.Interior.ColorIndex = 38
                    objCell.Font.ColorIndex = 1
            End Select
        Next
    End If
End Sub

Gruß
Nepumuk

Anzeige
AW: Makro beschleunigen
28.09.2005 10:18:24
Stefan
Hallo Alex,
vielleicht steigt ja die Geschwindigkeit, wenn
- Du Case Select wählst (wie von Nepumuk beschrieben)
- Du die aktuelle Zelle über set objZelle =cells(Zeile,Spalte) zuweist und dann nur noch die objZelle ansprichst
- Du die Eigenschaften erst ausliest und nur dann änderst, wenn diese zu ändern sind:
Bsp: if objCell.Interior.ColorIndex 44 then objCell.Interior.ColorIndex = 44
-Zusätzlich wie ebenfalls schon erwähnt:
Application.Calculation=xlmanual
Application.ScreenUpdating=false
Stefan
AW: Makro beschleunigen
28.09.2005 09:51:49
Volker
Hallo Alex,
um dir helfen zu können, müßte man wissen, was eigentlich wann passieren soll.
Vielleicht reicht ja als Ansatz eine kleines Bsp. zum Worksheet_Change Ereignis.
Es wird ausgelöst, wenn ein "neuer" Range selektiert wird. Das können auch mehrere Zellen sein.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Target ist die Range Variable mit Wert und Adresse
dim bereich,gebiet as range
dim wert
dim zeile
dim spalte
if target.count=1 then 'wenn nur eine Zelle selektiert
set bereich =taget.offset(1,1)
wert=target '=Inhalt der Zelle
zeile=target.row 'Zeilenindex von Target
spalte=target.column 'Spaltenindex von Target
endif
set gebiet=range("A1:C3")
if not (intersect(target,gebiet) is noting then 'wenn Target sich in A1:C3 befindet
end if
End Sub

Darüber hinaus gibt es noch jede Menge andere nützliche Ereignisse, sowohl im Arbeitsblatt als auch in der Arbeitmappe.
Hoffe, das bringt dich weiter
Gruß
Volker
Anzeige
AW: Makro beschleunigen
28.09.2005 10:24:15
Alexander
Hallo Volker,
muss zugeben ich habe den Ansatz nicht wirklich verstanden. Das ganz Ziel der Sache ist den Status automatisch zu aendern. Dafuer habe ich die ganzen IF Bedingungen aufgestellt. Die Sache soll weitestgehend automatisch erfolgen damit der Endnutzer nicht ueberlegen muss.
Das Problem ist, dass die reale Tabelle immer so um die 400 gefuellte Zeilen enthaelt. Da dauert es einfach zu lange bis er alle IF Schleifen durchlaueft, egal wie ich das Ereigniss ausloese. Meine Idee war den Code mit Change auszuloesen. Allerdings wollte ich die Variable m nicht durch eine einfach Forschleifen zaehlen lassen. Sondern ihr bei jeder Aenderung die aktuelle Zeile zuweisen. Aenderung natuerlich nur wenn ich was eintippe, nicht wenn ich im Sheet rumklicke. So muesste ich an meinem Code nichts aendern und es muesste wesentlich schneller laufen.
Danke Alex
Anzeige
AW: Makro beschleunigen
28.09.2005 10:25:45
Alexander
Hallo Volker,
muss zugeben ich habe den Ansatz nicht wirklich verstanden. Das ganz Ziel der Sache ist den Status automatisch zu aendern. Dafuer habe ich die ganzen IF Bedingungen aufgestellt. Die Sache soll weitestgehend automatisch erfolgen damit der Endnutzer nicht ueberlegen muss.
Das Problem ist, dass die reale Tabelle immer so um die 400 gefuellte Zeilen enthaelt. Da dauert es einfach zu lange bis er alle IF Schleifen durchlaueft, egal wie ich das Ereigniss ausloese. Meine Idee war den Code mit Change auszuloesen. Allerdings wollte ich die Variable m nicht durch eine einfach Forschleifen zaehlen lassen. Sondern ihr bei jeder Aenderung die aktuelle Zeile zuweisen. Aenderung natuerlich nur wenn ich was eintippe, nicht wenn ich im Sheet rumklicke. So muesste ich an meinem Code nichts aendern und es muesste wesentlich schneller laufen.
Danke Alex
Anzeige
AW: Makro beschleunigen
28.09.2005 13:38:41
Volker
Hallo Alex,
bei "VBA gut" wollte ich nicht bei Adam & Eva anfangen.
Du wolltest u.a. wissen, wie man bei Änderung des Sheets automatisch Aktionen auslösen kann. Ich hab dir nur ein Beispiel für eine von vielen Ereignisprozeduren gegeben.
Du wolltest wissen, wie du die aktuelle/geänderte Zelle direkt ansprechen kannst?
Auch das war in dem Beispiel:
"wert=target '=Inhalt der Zelle
zeile=target.row 'Zeilenindex von Target
spalte=target.column 'Spaltenindex von Target"
Nepomuks hat dasselbe vorgeschlagne und noch die Select-Anweisung eingebaut.
Das war's im Groben.
Gruß
Volker
Anzeige
AW: Makro beschleunigen
28.09.2005 13:41:19
Volker
Hallo Alex,
bei "VBA gut" wollte ich nicht bei Adam & Eva anfangen.
Du wolltest u.a. wissen, wie man bei Änderung des Sheets automatisch Aktionen auslösen kann. Ich hab dir nur ein Beispiel für eine von vielen Ereignisprozeduren gegeben.
Du wolltest wissen, wie du die aktuelle/geänderte Zelle direkt ansprechen kannst?
Auch das war in dem Beispiel:
"wert=target '=Inhalt der Zelle
zeile=target.row 'Zeilenindex von Target
spalte=target.column 'Spaltenindex von Target"
also:
If Cells(zeile,spalte)="Blabla" then
...
else if Cells(zeile,spalte)="Blablub" then
....
usw.
end if
Nepomuks hat dasselbe vorgeschlagen, die Verzweigung aber mit der Select-Anweisung realisiert.
Das war's im Groben.
Gruß
Volker
Anzeige
AW: Makro beschleunigen
28.09.2005 13:42:47
Volker
Hallo Alex,
bei "VBA gut" wollte ich nicht bei Adam & Eva anfangen.
Du wolltest u.a. wissen, wie man bei Änderung des Sheets automatisch Aktionen auslösen kann. Ich hab dir nur ein Beispiel für eine von vielen Ereignisprozeduren gegeben.
Du wolltest wissen, wie du die aktuelle/geänderte Zelle direkt ansprechen kannst?
Auch das war in dem Beispiel:
"wert=target '=Inhalt der Zelle
zeile=target.row 'Zeilenindex von Target
spalte=target.column 'Spaltenindex von Target"
also:
If Cells(zeile,spalte)="Blabla" then
...
else if Cells(zeile,spalte)="Blablub" then
....
usw.
end if
Nepomuks hat dasselbe vorgeschlagen, die Verzweigung aber mit der Select-Anweisung realisiert.
Das war's im Groben.
Gruß
Volker
Anzeige
AW: Makro beschleunigen
28.09.2005 16:25:53
Alexander
Hallo Volker,
ich steckte wohl noch im Mittagsschlaf jetzt funktioniert es einwanfrei, muss nur noch eine Kleinigkeit anpassen und dann wird es super. Vielen Dank fuer deinen Gedankenanstoss. Das mit den VBA Kenntnissen ist halt so eine Sache, ein bisle mehr als Makrorekorder bringe ich schon, aber gut?!?! Man sollte halt einen Status machen wie VBA Anfaenger oder so.
Nochmal vielen Dank
AW: Makro beschleunigen
28.09.2005 16:45:56
Volker
Jau, das mit dem Level war hier schon öfter mal Thema.
Ich halte mich bestenfalls für "fortgeschritten", was weniger als "gut" ist.
Aber über das Stadium des "nur mit Rekorder" bin immerhin bereits hinaus.
Der Rekorder ist aber immer noch nützlich, falls man eine Syntax nicht genau kennt.
Die wenigsten sind hier wandelnde VBA-Handbücher und darum werden Fragen häufig genau so beantwortet:
Aufzeichnen und das Ergebnis anpassen. Das könnten viele Anfänger auch, sie wissen es nur nicht.
Gruß
Volker
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige