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

Code beschleunigen

Code beschleunigen
06.01.2004 14:29:34
Franz W.
Hallo Fachleute,

Ich hoffe, ich kann verständlich machen, worum es mir geht:

Um einen Kalender (Tage untereinander, Monate nebeneinander) zu füllen, gibt es folgende Schleifen:

For m = 1 To 120 Step 10
For t = 3 To 33
For e = 3 To ziel
Next e
Next t
Next m

m die Spalten
t die Zeilen
e sind die eingelesenen Daten, in diesem Fall sind es Feiertage.

Die Schleife durchläuft nun mit jedem eingelesenen Eintrag(e) - also mit allen Feiertagen - zuerst den 1.1.04, dann den 2.1.04 bis zum 31.12.04.

Lässt es sich nicht irgendwie schreiben, dass, nachdem ein Datum gefunden wurde, das Durchsuchen des Datums mit den restlichen Feiertagen aufhört. Dass außerdem das Durchsuchen des restlichen Kalenders aufhört, sobald ein Eintrag identisch war? (Konnte ich klar machen, was ich meine?)

Ich habe mich mit verschiedenen Schleifenvariationen, auch mit Do while ... Loop u.ä. versucht, kriege aber nichts hin. Geht das überhaupt?

Vielen Dank schon mal im Voraus und Grüße
Franz

30
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code beschleunigen
06.01.2004 15:09:21
Lutz
Hallo Franz,

setze zu Beginn Deines Codes Variablen (zB. mVar, tVar) auf Null und nach Finden des Datums auf 1. Dann brauchst Du in den Schleifen nur über eine Wenn-Abfrage diese Variablen abfragen und bei Variable=1 zum entsprechenden NEXT springen.

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
AW: Code beschleunigen
06.01.2004 15:46:37
Franz W.
Hallo Lutz,

vielen Dank für Deinen Einsatz, ich komme aber noch nicht alleine klar: woher bekomme ich den Punkt an dem er ein Datum gefunden hat, wie weiß ich an welcher Stelle das ist, wo ich ja dann die Variable auf 1 setzen kann??

Vielen Dank schon mal und Grüße
Franz
Anzeige
AW: Code beschleunigen
06.01.2004 15:48:58
Lutz
Hallo Franz,

poste doch bitte mal Deinen Code.

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
AW: Code beschleunigen
06.01.2004 16:02:29
Franz W.
Hallo Lutz,

sorry, musste den Code erst aufs Nötige reduzieren:


Sub Termine_eintragen()
Application.ScreenUpdating = False
Worksheets("Kalender").Unprotect
Dim termf(300) As Date, feiert(300)
Dim termg(300) As Date, namg(300), alte(300)
Dim termt(300) As Date, termin(300)
Dim termk(300) As Date
Dim textComm As String
With Worksheets("Daten")
'## Feiertage einlesen:
z = 3                                                   ' Startzeile für Schleife
Do While .Cells(z, 1) <> ""                         ' Schleifenbedingung (laufe solange Zelle gefüllt ist)
termf(z) = Left(.Cells(z, 1), 6) + _
Right(Worksheets("Kalender").Cells(1, 1), 2)    ' Datum (sechs Zeichen von links) + aktuelle Jahreszahl
feiert(z) = .Cells(z, 2)                        ' Namen der Feiertage Auslesen
z = z + 1                                           ' Schleifenzähler
Loop                                                ' Wendemarke für Schleife
' Zielwert für Terminschleife:
ziel = .Cells(2, 13)
End With
Worksheets("Kalender").Activate                         ' Kalenderblatt aktiv schalten
'######## Alte Einträge löschen ##############################################################################
For m = 1 To 120 Step 10
With Range(Cells(3, m), Cells(33, m + 3))
.ClearComments
.Font.ColorIndex = -4105
.Interior.ColorIndex = -4142
.Font.Bold = False
End With
With Range(Cells(3, m), Cells(33, m + 1))
.Font.Size = 8
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
End With
With Range(Cells(3, m + 2), Cells(33, m + 2))
.Interior.ColorIndex = 19
.Font.Bold = False
End With
Next
'Application.ScreenUpdating = True
Application.ScreenUpdating = False
'####### Feiertage:   #######################################
For m = 1 To 120 Step 10                                    ' Schleife für Monate
For t = 3 To 33                                         ' Schleife für Tage pro Monat
For e = 3 To ziel                                   ' Schleife für Termine
If Cells(t, m) = termf(e) Then                  ' Wenn Feiertag dann...
If Not Cells(t, m).Comment Is Nothing Then Cells(t, m).Comment.Delete
If Not Cells(t, m) = 0 Then
Set cmt = Cells(t, m).AddComment _
(Text:=Chr(10) & " " & feiert(e) & " " & Chr(10) & " ")
With cmt.Shape
.TextFrame.AutoSize = True
.Fill.ForeColor.SchemeColor = 10
.TextFrame.Characters.Font.Size = 8
.TextFrame.Characters.Font.ColorIndex = 2
.TextFrame.Characters.Font.Bold = True
End With
End If
End If
Next e
Next t
Next m
Cells.WrapText = False
Call sndPlaySound32("e:\Sounds\Phone.wav", 1)
Worksheets("Kalender").Protect
End Sub


Grüße
Franz
Anzeige
AW: Code beschleunigen
06.01.2004 16:12:15
Martin Beck
Hallo Franz,

ohne den Code im einzelnen zu analysieren, setze vor das letzte End If mal die Zeile

Exit For.

Gruß
Martin Beck
AW: Code beschleunigen
06.01.2004 16:28:14
Franz W.
Hallo Martin,

ja, ist schon besser. Allerdings durchläuft er damit nach wie vor an den Nichtfeiertagen, an denen es also keine Terminübereinstimmung gibt, trotzdem wieder alle eingelesenen Feiertage.

Grüße
Franz

P.S.: Es ist mir klar, dass es hier keine sonderlichen Geschwindigkeitsrekorde geben wird. Es geht mir mit diesem Beispiel um die Theorie/ums Lernen. Der letztendliche Code ist weitaus umfangreicher und da erhoffe ich mit dann Verbesserungen.
Anzeige
AW: Code beschleunigen
06.01.2004 16:27:56
Lutz
Hallo Franz,

versuche es doch mal mit Find:



'####### Feiertage:   #######################################
    
    For e = 3 To ziel                                   ' Schleife für Termine
        On Error Resume Next
        Set x = Sheets("Kalender").Cells.Find(termf(e)) ' Finde Feiertag...
        t = x.Row
        m = x.Column
        If Not Cells(t, m).Comment Is Nothing Then Cells(t, m).Comment.Delete
        If Not Cells(t, m) = 0 Then
            Set cmt = Cells(t, m).AddComment _
                (Text:=Chr(10) & " " & feiert(e) & " " & Chr(10) & " ")
            With cmt.Shape
                .TextFrame.AutoSize = True
                .Fill.ForeColor.SchemeColor = 10
                .TextFrame.Characters.Font.Size = 8
                .TextFrame.Characters.Font.ColorIndex = 2
                .TextFrame.Characters.Font.Bold = True
            End With
        End If
    Next e

     Code eingefügt mit Syntaxhighlighter 2.1



Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
Anzeige
nein, leider so nicht
06.01.2004 16:36:08
Franz W.
Hallo Lutz,

nein, leider so nicht. Dauert massiv länger und tut nicht ein Mal, was er soll. D.h. schreibt keinen einzigen Kommentar.

Grüße
Franz
AW: nein, leider so nicht
06.01.2004 16:48:32
Lutz
Hi Franz,

woran scheiterts ? Hast Du mal im Einzelschritt durchlaufen lassen ?
Zeile müßte auch so heißen:
Set x = Sheets("Kalender").Range("A3:DP33").Find(termf(e)) ' Finde Feiertag...

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
AW: nein, leider so nicht
06.01.2004 17:03:37
Franz W.
Hallo Lutz,

er versucht sämtliche eingelesenen Feiertage termf(e) in Cells(t, m)= Cells(0, 121) zu finden. Wer er alle Feiertage durch hat, ist Schluss. Auch mit Deiner neuen Zeile.

Grüße
Franz
Anzeige
Beispiel
06.01.2004 17:04:18
Lutz
Hi Franz,

ich habe hier mal ´ne Mappe in abgespeckter Version, also nur den Teil des Codes, der für die Kommentareintragung zuständig ist. Bei mir läuft das Ding ratzfatz durch...

https://www.herber.de/bbs/user/2786.xls

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
AW: Beispiel
06.01.2004 17:12:56
Franz W.
Hi Lutz,

ja läuft bei mi rauch. Was ich vorhin vergessen habe: x ist immer "Nothing", er findet also wohl nix. Muss da vielleicht irgendeine Format-Anweisung mit rein, ohne die Find nicht auskommt? Die Zellen sind formatiert benutzerdefiniert einfach als "T" (ohne HOchkomma). Kann es daran liegen?

Grüße
Franz
Anzeige
AW: Beispiel
06.01.2004 17:21:07
Lutz
Bei x = Nothing hat er nix gefunden...
Kannst Du die Datei mal schicken ? Wäre vielleicht etwas einfacher....

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
AW: Beispiel
06.01.2004 17:33:24
Lutz
Hi Franz,

habe jetzt auch mal mit Format probiert und die Daten auch in termf eingelesen...läuft ohne Probleme...

https://www.herber.de/bbs/user/2787.xls

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
Anzeige
AW: Beispiel
06.01.2004 17:37:38
Franz W.
Hi Lutz,

hier die Datei:

Die Datei https://www.herber.de/bbs/user/2788.xls wurde aus Datenschutzgründen gelöscht


Grüße
Franz
AW: Beispiel
06.01.2004 19:33:17
Lutz
Hi Franz,

habe mal rumprobiert. Stimmt, die Find-Methode läuft nicht. Muß ich nochmal checken.
Ich glaube aber, dass Dein Code nicht an dieser Stelle so lange brauchte, sondern bei "Alte Daten löschen". Habe 3 Bereiche angelegt, schau mal, ob es jetzt schneller läuft...

https://www.herber.de/bbs/user/2789.xls

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
Anzeige
AW: Beispiel
06.01.2004 20:33:19
Franz W.
Hallo Lutz,

gute Idee das mit den Bereichen, bringt tatsächlich was. Wenn ich's richtig sehe, weil nicht eine Schleife durchlaufen werden muss, sondern weil es mit einem Wisch erledigt wird?

Komisch das mit dem Find, habe Deines, das funktioniert, noch mal mit meinem verglichen - und ich kann den Unterschied nicht erkennen, scheint doch identisch aufgebaut/formatiert oder was auch immer zu sein ?!?

Grüße
Franz
AW: Beispiel
06.01.2004 21:35:26
Lutz
Hi Franz,

das Problem bei Find liegt darin, dass in den betreffenden Zellen kein richtiges Datum sondern Formeln (A4 = A3+1) stehen.
Werde aber trotzdem noch ein wenig rumprobieren, vielleicht krieg ich ja noch ein Sekündchen raus. Wie lange brauch der Code jetzt bei Dir ?

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
Anzeige
AW: Beispiel
06.01.2004 21:55:04
Franz W.
Hi Lutz,

Wahnsinn und absolut super, dass Du Dich da immer noch reinkniest, vielen Dank dafür! Wenn das an der Formel liegt, kann man dann nicht sowas wie auf den Value der Zelle verweisen? Dass er also nicht die ZEllen absuchen soll, sondern die Cells.value oder so ähnlich?

Ja der gesamte Code braucht inzwischen statt über 15 Sekunden inzwischen so um die 10 :-)))), ist immerhin ein Drittel. Und da er mehrmals täglich zu laufen hat, ist das schon sehr wertvoll!!

Grüße
Franz

P.S.: mein erstes Ziel war ursprünglich gar nicht die Beschleunigung (das ist jetzt nur ein begehrenswerter Nebeneffekt ;-))!!). Es war so: bei der Suche nach einem Fehler bin ich in Einzelschritten durch den Code und hab dabei festgestellt, dass er unsinnige Dinge macht - sprich das da Schleifen laufen, wo es sowieso nihcts zu tun gibt. Dabei kam ich drauf, dass da ja auch Zeit sparen könnte...
AW: Beispiel
06.01.2004 21:59:57
Lutz
Hi Franz,

also wenn ich ein Jahr hoch oder runter schalte, brauch er bei mir ca 3 sek....wieso bei Dir so lange ???
Mit Value hab ich auch schon probiert...ohne Erfolg...bis jetzt zumindest

Gruß Lutz

Das Forum lebt auch von den Rückmeldungen !
AW: Beispiel
06.01.2004 22:39:06
Franz W.
Hi Lutz,

das mit den Feiertagen ist nur ein Teil des Ganzen, da werden noch Termine eingetragen, doppelte Termine am selben Tag extra markiert, Ferien und Urlaub berechnet,.... schau mal im Blatt Daten in der obersten ZEile die Kommentare in den blauen ZEllen an. Außerdem gibt es auf einem anderen Blatt noch einen Geburtstagskalender, dessen Daten auch übernommen werden, und auch da werden Kommentare dazugeschrieben, runde Geburtstage in einer anderen Farbe geschrieben.... Die Sachen und den Code dazu hab ich der Übersichtlichkeit wegen rausgestrichen und nur die Feiertagsgeschichte als Beispiel drin gelassen, wäre sonst viel zu groß das Ding.

Grüße
Franz

P.S.: ich hab auch noch ein bisschen probiert und bin nicht weitergekommen, aber was mich angeht, wage ich nicht "bis jetzt zumindest" zu sagen, denke meine Möglichkeiten sind erschöpft...
AW: Neugierig
06.01.2004 23:03:34
Martin Beck
Hallo Franz, Hallo Lutz,

ich bin jetzt (wieder) neugierig geworden. Steht irgendwo auf Hans' Server die aktuellste Fassung der Datei/des Codes? Würde mich gerne auch noch an der Optimierung des Codes beteiligen (=sportlicher Ehrgeiz).

Evtl. könnte Franz ja noch einmal einen neuen Thread eröffnen.

Gruß
Martin Beck
Ok, werd ich machen, Martin
06.01.2004 23:10:21
Franz W.
AW: Ok, werd ich machen, Martin
08.01.2004 17:41:33
Jörg
ich habe keine Ahnung wollte aber am Ende der langen Schlange stehen.
:-)
nur eine schleife?
06.01.2004 16:10:14
IngoG
Hallo Franz,

da du ja das Datum kennst, kannst Du auch mit nur einer schleife arbeiten;-)

ich nehme mal an, du suchst in den Schleifen die zelle, in die du schreiben möchtest...

dann mach es einfach folgendermassen: (nur skizzierte Lösung, da ich den genauen aufbau nicht kenne
tt=tag des feiertages
mm=monat des feiertages

cells(2+tt,1+(mm-1)*10).value= "Feiertag"

die 3 befehle setzt du in eine schleife und durchläufst alle Feiertage...

Vielleicht hilft dir der ansatz ja weiter.

Gruß Ingo

PS eine Rückmeldung wäre nett...
AW: nur eine schleife?
06.01.2004 16:29:43
Franz W.
Hallo Ingo,

vielen Dank, aber das muss ich erst kapieren. Den Code hab ich übrigens inzwischen "unterhalb Lutz" gepostet.

Danke und Grüße
Franz
AW: nur eine schleife?
06.01.2004 16:55:13
ingoG
Hallo Franz,

ich meinte damit folgendes:

du durchläufst nicht alle Tage des Jahres und vergleichst mit allen vorkommenden Terminen sondern machst folgendes.

da du das datum ja kennst, das du eintragen möchtest kannst du auch die zelle berechnen, an der dieses Datum steht...
das sollte mit obiger formel ungefähr möglich sein (evt kleine änderungen...)

damit sparst Du auf jeden fall 2 ineinandergeschachtelte schleifen

Du brauchst also nur eine schleife, mit der du alle Termine oder Feiertage durchläufst und die entsprechenden einträge machst.

Ich hoffe, das hilft dir weiter

Gruß Ingo

PS eine Rückmeldung wäre nett...
AW: nur eine schleife?
06.01.2004 17:14:54
Franz W.
Hallo Ingo,

den Sinn und Zweck hab ich verstanden, nur noch nicht auf die Schnelle, wie ich das einbaue, da brauch ich noch ein bissl für sowas :-))). Versuche es aber umzusetzen.

Grüße
Franz
AW: Code beschleunigen
06.01.2004 15:33:54
Martin Beck
Hallo Franz,

leider schreibst Du nicht, was innerhalb der letzten For-Next Schleife geschieht. Dort könnte man im Prinzip die Schleife mit

Exit For

abbrechen. Genaueres nur dann, wenn der komplette Code bekannt ist.

Gruß
Martin Beck
AW: Code beschleunigen
06.01.2004 15:43:26
Franz W.
Hallo Martin,

vielen Dank für Deine Antwort. Ich versuche jetzt mal das, was mir Lutz empfohlen hat zu kapieren und umzusetzen, melde mich dann wieder.

Vielen Dank erst mal und Grüße
Franz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige