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

Macro Geschwindigkeit

Macro Geschwindigkeit
17.10.2004 00:30:37
Rolf
Hallo liebe Fachleute,
vor ein paar Monaten hat mir hier ein sehr kompetenter Fachmann, ein tolles Makro geschrieben und mir damit sehr geholfen.
Darin ging es um die Darstellung verschiedener Werte in Zeile 3 wenn ein bestimmter Begriff in Zeile 1 geschrieben wird. Nachdem in Zeile 2 ein anderer Wert eingetragen wird, soll eventuell der Wert in Zeile 1 in Klammer gesetzt werden. Ich stelle das Makro dazu weiter unten ein.
Dazu werden die Kriterien und Werte in einem extra Datenblatt gepflegt.
Das funktioniert alles super, wenn man nur drei bsi vier Datenblätter in der Tabelle hat. Aber..... und nun kommt meine Frage.
Mittlerweile ist die Excelttabelle auf 13 Datenblätter angewachsen (alle in einer Datei). Im 14. Datenblatt sind die Kriterien hinterlegt.
Es dauert nun bis zu 80 Sekunden, bis ein Wert in einer Zelle angezeigt wird. Die Prozentanzeige, links unten im Datenblatt kriecht förmich vor sich hin, wenn eine Eingabe getätigt wird.
Kann man das irgendwie beschleunigen? Ich habe das Macro in jede Tabelle einkopiert. Vieleicht habe ich das auch falsch gemacht?
Ich habe kein Macrowissen.
Vielleicht könnt ihr mir helfen?
Ich bedanke mich schon einmal im Voraus, dass sich überhaupt jemand die Mühe macht mir zu helfen.
Auf Wunsch schicke ich euch auch gerne die Datei via eMail zu. Sie ist aber ca. 3 MB groß
Viele Grüße
Rolf
Hier kommt das Makro:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim wks As Worksheet
Dim iCol As Integer
Dim iHilf As Integer
If Target.Row Mod 3 = 0 Then Exit Sub
iHilf = Int((Target.Row + 2) / 3) - 1
Set wks = Worksheets("Data")
iCol = Target.Column
Application.EnableEvents = False
On Error GoTo ERRORHANDLER
If Not IsError(Application.Match(Cells(iHilf * 3 + 1, iCol).Value, wks.Columns(1), 0)) And _
Not IsError(Application.Match(Cells(iHilf * 3 + 2, iCol).Value, wks.Columns(3), 0)) Then
Cells(iHilf * 3 + 1, iCol) = "(" & Cells(iHilf * 3 + 1, iCol) & ")"
End If
If Not IsError(Application.Match(Cells(iHilf * 3 + 1, iCol).Value, wks.Columns(1), 0)) And _
IsError(Application.Match(Cells(iHilf * 3 + 2, iCol).Value, wks.Columns(3), 0)) Then
Cells(iHilf * 3 + 1, iCol).NumberFormat = "@"
End If
If Cells(iHilf * 3 + 2, iCol) = "" And Left(Cells(iHilf * 3 + 1, iCol), 1) = "(" Then
Cells(iHilf * 3 + 1, iCol) = Mid(Cells(iHilf * 3 + 1, iCol), 2, 1)
End If
ERRORHANDLER:
Application.EnableEvents = True
End Sub

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Macro Geschwindigkeit
Reinhard
Hi Rolf,
ohne den Code näher untersucht zu haben, schreib mal anfangs des Makros
Application.ScreenUpdating=False
am Ende
Application.ScreenUpdating=True
vielleichts hilfts
Gruß
Reinhard
AW: Macro Geschwindigkeit
17.10.2004 01:31:16
Rolf
Hallo Reinhard,
also wenn ich deinen Vorschlag an die richtige Stelle eingetragen habe, hat es nichts gebracht.
Gruß Rolf
AW: Macro Geschwindigkeit
17.10.2004 07:36:32
Nepumuk
Hallo Rolf,
Es scheint, dass in den Tabellen viele Formeln drin sind. Da hift nur eins:


Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wks As Worksheet
    Dim iCol As Integer
    Dim iHilf As Integer
    If Target.Row Mod 3 = 0 Then Exit Sub
    iHilf = Int((Target.Row + 2) / 3) - 1
    Set wks = Worksheets("Data")
    iCol = Target.Column
    With Application
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    On Error GoTo ERRORHANDLER
    If Not IsError(Application.Match(Cells(iHilf * 3 + 1, iCol).Value, wks.Columns(1), 0)) And _
        Not IsError(Application.Match(Cells(iHilf * 3 + 2, iCol).Value, wks.Columns(3), 0)) Then
        Cells(iHilf * 3 + 1, iCol) = "(" & Cells(iHilf * 3 + 1, iCol) & ")"
    End If
    If Not IsError(Application.Match(Cells(iHilf * 3 + 1, iCol).Value, wks.Columns(1), 0)) And _
        IsError(Application.Match(Cells(iHilf * 3 + 2, iCol).Value, wks.Columns(3), 0)) Then
        Cells(iHilf * 3 + 1, iCol).NumberFormat = "@"
    End If
    If Cells(iHilf * 3 + 2, iCol) = "" And Left(Cells(iHilf * 3 + 1, iCol), 1) = "(" Then
        Cells(iHilf * 3 + 1, iCol) = Mid(Cells(iHilf * 3 + 1, iCol), 2, 1)
    End If
    ActiveSheet.Calculate
ERRORHANDLER:
    With Application
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub


Gruß
Nepumuk
Anzeige
AW: Macro Geschwindigkeit
17.10.2004 13:18:32
Rolf
Hallo Nepumuk,
zuerst dachte ich dass dein Vorschlag die Lösung wäre.
Doch nun verhält sich Excel irgenwie sehr merkürdig.
Ich habe in allen Tabellenblättern dein Makro einkopiert.
Anfänglich lief es schnell und gut.
Dann habe ich die Tabelle gespeichert und erneut geöffnet.
Nun ist sie genauso langsam wie zuvor und zusätzlich werden manchmal die Werte in Zeile 3 nicht angezeigt, wenn man in Zeile 1 ein entsprechendes Kriterium eingibt. Dies aber auch nicht immer.
Dafür ist die Datei von ca. 3 MB auf 1,5 MB geschrumpft.
Kannst du dir das erklären?
Habe kein Virus o.ä. auf dem System. Norton InternetSecurity 2005 ist installiert.
Gruß Rolf
Anzeige
AW: Macro Geschwindigkeit
17.10.2004 13:34:02
Rolf
Noch etwas....
in der Tabelle sind gar nicht so viele Formeln eingebaut. Es sind in ca. 20 Zeilen je Blatt Summenformeln und in ca. 28 Spalten Zählen-Funktionen eingebaut.
In jeweils der 3. Zeile ist die Funktion SVERWEIS , welche auf die DATA Tabelle zielt.
Kenne mich zwar nicht so gut in Excel aus, aber ich glaube das ist nicht sehr viel, oder?
Soll ich hier einmal eine grundlegende Darstellung der Tabelle posten?
Grüße
Rolf
AW: Macro Geschwindigkeit
17.10.2004 14:07:29
Nepumuk
Hallo Rolf,
kannst du die Mappe mal in abgespeckter Form (eine Tabelle + die Tabelle Data) auf den Server laden? Sensible Daten kannst du ja durch Dummys ersetzen.
Gruß
Nepumuk
Anzeige
AW: Macro Geschwindigkeit
17.10.2004 14:34:43
Rolf
Hallo Nepumuk,
gut, ich versuche es.
Die Datei hat nur noch das Tabellenblatt mit dem Makro und die mit der DATA Tabelle.
Sie heißt Dienstplan 2005 - Test mit neuem Makro.xls und ist ca. 340 KB groß.
Viele Grüße
Rolf
AW: Macro Geschwindigkeit
17.10.2004 14:38:51
Rolf
Hallo Nepumuk,
oha, ich kann dir nicht sagen, ob der Uplaod funktioniert hat. Eine Fehlermeldung habe ich nicht bekommen, aber ich weiß auch nicht wohin die Datei kopiert wurde.
Kannst du sie irgendwie auf dem Server finden?
Sorry.... Rolf
AW: Macro Geschwindigkeit
17.10.2004 14:49:04
Nepumuk
Hallo Rolf,
ohne die Nummer nicht und wenn ein Fehler angezeigt wurde, dann ist meistens der Name der Mappe unzulässig. Nenn sie einfach "Mappe", das funktioniert immer. Die Verzeichnisstruktur solle auch nicht zu tief sein, also einfach noch C kopieren und von dort hochladen. Öffne am besten mit einem Rechtsklick die "Forums-Seiten" (ganz oben) - "Im neuen Fenster öffnen" dort findest du den Upload. Die Datei hochladen und den angezeigten Link im unteren Fenster in die Antwort kopieren.
Gruß
Nepumuk
Anzeige
AW: Macro Geschwindigkeit
Rolf
Hallo Nepumuk,
danke für die Hilfe.
Also, es lag an der Dateigröße. Es nur 300 kb erlaubt.
Ich musste die Tabelle nun etwas abspecken. Dadurch scheint sie auch schneller zu funktionieren. ;-)
Der Name lautet nun:
dienstplan 2005 makro.xls
Sie wäre unter folgendem Link zu finden:
https://www.herber.de/bbs/user/12239.xls
Viele Grüße
Rolf
AW: Macro Geschwindigkeit
17.10.2004 15:53:39
Nepumuk
Hallo Rolf,
es liegt wirklich an den Arrayformeln (Teufelszeug, würde ich nie verwenden). Da hilft nur eins. In das Klassenmodul "DieseArbeitsmappe" folgender Code:


Option Explicit
Private Sub Workbook_Activate()
    Application.Calculation = xlCalculationManual
End Sub
Private Sub Workbook_Deactivate()
    Application.Calculation = xlCalculationAutomatic
End Sub


Das Modul der Tabellen habe ich geändert. Denn, wenn in der oberen Zeile z.B. Ur stand, ich darunter k eingetragen habe, hat er aus UR - (Ur) gemacht. Habe ich das k wieder gelöscht, stand darüber nur noch U.


Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wks As Worksheet
    Dim iCol As Integer
    Dim iHilf As Integer
    If Target.Row Mod 3 = 0 Then Exit Sub
    iHilf = Int((Target.Row + 2) / 3) - 1
    Set wks = Worksheets("Data")
    iCol = Target.Column
    Application.EnableEvents = False
    On Error GoTo ERRORHANDLER
    If Not IsError(Application.Match(Cells(iHilf * 3 + 1, iCol).Value, wks.Columns(1), 0)) And _
        Not IsError(Application.Match(Cells(iHilf * 3 + 2, iCol).Value, wks.Columns(3), 0)) Then
        Cells(iHilf * 3 + 1, iCol) = "(" & Cells(iHilf * 3 + 1, iCol) & ")"
    End If
    If Not IsError(Application.Match(Cells(iHilf * 3 + 1, iCol).Value, wks.Columns(1), 0)) And _
        IsError(Application.Match(Cells(iHilf * 3 + 2, iCol).Value, wks.Columns(3), 0)) Then
        Cells(iHilf * 3 + 1, iCol).NumberFormat = "@"
    End If
    If Cells(iHilf * 3 + 2, iCol) = "" And Left(Cells(iHilf * 3 + 1, iCol), 1) = "(" Then
        Cells(iHilf * 3 + 1, iCol) = Mid(Cells(iHilf * 3 + 1, iCol), 2, Len(Cells(iHilf * 3 + 1, iCol)) - 2)
    End If
    ActiveSheet.Calculate
ERRORHANDLER:
    Application.EnableEvents = True
End Sub


Gruß
Nepumuk
Anzeige
AW: Macro Geschwindigkeit
17.10.2004 16:41:40
Rolf
Hallo Nepumuk,
vielen Dank für deine Mühen. Leider verhält sich die Tabelle noch genauso wie zuvor.
Manchmal werden die Zelleninhalte nicht aktuallisiert, wenn man einen Wert in Zeile 1 eingibt. Die Stundenzahl z.B. 7 in Zeile 3 wird nicht angezeigt. Erst wenn ich die Funktion SVERWEIS der NAchbarzelle in die Zeile 3 einkopiere, wird der Inhalt angezeigt.
Bei mehreren Tabellenblättern dauert es imme rnoch recht lange, bis überhaupt etwas dargestellt wird.
Du schreibst etwas von Arrayformeln und dass du das Teufelszeug nie verwenden würdest.
Darf ich dich fragen, wie du die Aufgabe gelöst hättest? Da ich mich absolut nicht mit der Sache auskenne, habe ich sie so hingenommen, wie sie mir hier angeboten wurde.
Soll ich dir mal die Sache genauer erklären, oder kannst du mit der Tabelle schon zurecht kommen?
Gruß Rolf
Anzeige
AW: Macro Geschwindigkeit
17.10.2004 16:49:54
Nepumuk
Hallo Rolf,
die Verwendung von Makros + Formeln in einer Tabelle ist immer problematisch. Wenn du mir die Funktionen der Arrayformeln (das sind die mit den geschweiften Klammern vorne und hinten) erklären könntest (damit habe ich nämlich nichts am Hut) dann stricke ich dir das ganze auf VBA um. Kann aber ein paar Tage dauern!
Gruß
Nepumuk
AW: Macro Geschwindigkeit
Rolf
Hallo Nepumuk,
ach so du meinst die Summenformeln am Ende der Spalten in der Tabelle?
=SUMME(WENN($B4:$B123="ex";WENN(I4:I123="F";1;0);0)+(WENN($B4:$B123="ex";WENN(I4:I123="F1";0,5;0);0))+(WENN($B4:$B123="ex";WENN(I4:I123="F2";1;0);0))+(WENN($B4:$B123="ex";WENN(I4:I123="GFI";0,7;0);0))+(WENN($B4:$B123="ex";WENN(I4:I123="CBF";1;0);0))+(WENN($B4:$B123="ex";WENN(I4:I123="MMF";1;0);0))+(WENN($B4:$B123="ex";WENN(I4:I123="KKI";0,6;0);0)))
Das sind ganz einfache Summenformeln (Funktionen), die in Anhängigkeit eines Eintrages, einen Wert zählen sollen. Wenn z.B. ein ex bei einem Mitarbeiter steht, dann zähle in mit 1 wenn dieser einen Dienst macht der F heißt. Wenn dieser Mitarbeiter einen KKI Dienst macht, dann zähle nur 0,6 als Zähler dazu und gebe ihn jeweils in einem besonderen Feld aus.
Mit diesen Funktionen war die Tabelle genau und recht flott. Erst als das Makro ins Spiel kam, wurde alles sehr langsam.
Da es sich um einen Dienstplan handelt, sollen die Anzahl der Mitarbeiter an den jeweiligen Tagen (Spalten) in Abhängigkeit des Dienstes eines Mitarbeiters und dessen Qualifikation gezählt werden. Die Tabelle handelt über 4 Wochen, oder auch 28 Tage, deswegen auch die 28 Spaltenzähler.
In den Spaltenzählern soll je nach Qualifikation stehen, wenn z.B. ein Mitarbeiter mit der Qualifikation ex einen S oder F Dienst hat. Das wird für verschiedene Qualifikationen ausgegeben. Gleichzeitig gibt es verschiedene Voraussetzungen, bei der keine Zählung in der Spalte erfolgen darf. Z.B. wenn der MA krank ist, den Dienst tauschen muss oder in Urlaub geht. Der Eintrag muss aber trotzdem angezeigt werden, da die Stunden auch bei K oder Ur aufgelistet bleiben und in der Zeile des Mitarbeiters rechts summiert werden.
Um dies zu erreichen, habe ich die Einträge des Dienstes einfach in Klammer gesetzt. Somit sind Zeilensummen erhalten geblieben, die Spaltensummen aber nicht.
Beispiel
Zeile 1 S
Zeile 2
Zeile 3 7
geändert
Zeile 1 (S)
Zeile 2 Ur
Zeile 3 7
Bisher wurden die Klammern von den Mitarbeitern manuell gesetzt. Da die Tabelle ständig Änderungen erfährt ist dies aber sehr mühsam. Dienst eintragen dann Klammern setzen und später wieder entfernen und an andrer Stelle setzen.
Also habe ich seinerzeit hier um Hilfe gebeten und jemanden gefunden der mir ein Makro programmiert hatte um die Klammern automatisch setzen zu lassen.
Da die Kriterien zum Setzen der Klammern und der Stundenanzeige der einzelnen Dienste Variable sind, habe ich mir mit der Hilfstabelle DATA geholfen.
Das hat eigentlich auch gut funktioniert, nur wurde das Ganze sehr langsam und somit unpraktikabel in der Praxis.
Da es sich um Variable handelt, brächte ich die Hilfstabelle mit der Möglichkeit hier Einträge vorzunehmen.
Du meinst, dass die Funktionen das Makro beinflussen?
Hm, Bisher habe ich in der 3. Zeile ebenso eine Funktion eingesetzt, welche mir den SVERWEIS erspart hatte. Durch die automatische Klammersetzung habe ich diesen aber gebraucht.
Was meinst du dazu?
Gruß Rolf
Anzeige
Zum Teufel mit den {Dingern}...
Boris
Hi Meister aller Codezeilen,
es liegt wirklich an den Arrayformeln (Teufelszeug, würde ich nie verwenden).
Irgendwann kriegen sie auch Dich...;-)
Grüße {Boris}
AW: Zum Teufel mit den {Dingern}...
17.10.2004 23:34:45
Nepumuk
Hi Boris,
ich gestehe: Ich habe schon mal eine Arrayformel in einer WorksheetFunction benutzt. (Aber nicht weitersagen). War auch sauschwer, bis ich dahinter kam, dass das ganze mit "Array(...)" funktioniert.
Gruß
Nepumuk

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige