Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA drängst sich in den Vordergrund

VBA drängst sich in den Vordergrund
16.02.2009 14:57:00
Michel
Hallo allerseits,
ich habe mal eine Frage!
Ich habe eine Umfangreiche Excel-Tabelle in der ein VBA-Script alle 5 Min läuft um neue Daten aus einer Access-Datenbank einträgt.
Doch springt die Excetabelle nach Beenden des VBA-Scripts immer in der Vorgrund, wenn ich z. B. eine Mail schreibe, oder jetzt auch gerade beim Schreiben dieses Textes. Ist das irgendwie zu verhindern?
Gruß
Michael

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
wie sieht der Code aus? (owT)
16.02.2009 15:00:00
Renee

AW: wie sieht der Code aus? (owT)
17.02.2009 07:51:00
Michel
mh, das hier rein zu stellen ist ein wenig schwierig. Es ist eine Mischung aus Excel 4 Makros und VBA.
Da die Ursprüngliche Tabelle zum Eintragend der Daten aus Access schon 6 Jahre alt ist und ich nur einige Sachen hinzuprogrammiert habe. Da ich mich allerdings mit diesen alten Makros nicht auskenne, habe ich sie drin gelassen. Das ganze besteht aus über 3000 Codezeilen.
Was ist denn wichtig? und was ist (owT)?
Gruß
Michael
AW: wie sieht der Code aus? (owT)
17.02.2009 09:38:00
Iro
Dann kann man nur ins Blaue raten. Welcher Codeteil sorgt denn dafür, dass das Makro alle 5 Minuten aktiviert wird? Das ist am ehesten der verantwortliche.
Anzeige
AW: VBA drängst sich in den Vordergrund
17.02.2009 14:02:00
Michel
Also wie gesagt alle 5 Min wird (fast) der ganze Code durchlaufen.
Ich versuche mal grob zu erklären was abläuft.
Es ist eine Abwesenheitsübesicht für über 200 Mitarbeiter in der die Täglichen Abwesenheiten für die nächsten 8 Monate dargestellt werden, auch die Plandaten (z.B) Sommerurlaub usw. Das ganze ist nach veschiedenen Betrieben und Schichtgruppen sortiert. Diese Daten werden in eine Access-Datenbank eingegeben und mit Excel hat viualisiert.
Über eine
Routine:
With Application
.OnTime Now + TimeValue("00:05:00"), "Aenderungdatum_ermitteln"
.StatusBar = "Zeit läuft bis " & Now + TimeValue("00:05:00")
End With
wird alle 5 Min eine VBA-Modul aufgerufen in diesem wird Excel 4 Makro aufgerufen, dieses wiederrum ruft im weiteren Verlauf eine weiteren VBA-Code auf.
In diesem VBA-Code werden.
1. die aktuelle Woche in der Übersicht grau gemacht und der Tag dunkelgrau
2. Es werden für jeden Mitarbeiter bei Abwesenheit ein X eingetragen. Die Anzahl der Anwesenden Leute pro Schicht (A, B, C, D) gezählt (Es arbeiten welche in 3 Schicht und andere in 4 Schicht). Die Aktuelle Schicht (F, S,N) über die Schichtgruppe geschrieben.
3. Die Große Tabelle (mit 200 MA) wird in 6 verschiedene kleinere, je nach Betrieb, Schicht usw. kopiert und auf den Server in verschiedenen Ordner gespeichert. In diesen NEU angelegten Schichtübersichten wird per VBA ein CODE mit hinein kopiert, der das "Grau" machen der KW und des Tages realisiert.
Das ist jetzt vermutlich auch nicht sehr hilfreich?
Aber das ganze ist über Jahre gewachsen und den Anforderungen angepasst worden.
Gruß
Michael
Anzeige
Der Grund ist Dein Code...
17.02.2009 14:30:00
Renee
Hi Michael,
Schalte das ScreenUpdating während dem Anpassen der Werte aus.
Application.ScreenUpdating = False
und am Schluss wieder ein.
Application.ScreenUpdating = True
Es ist anzunehmen, dass du mit .SELECT und .ACTIVATE im Code arbeitest, damit kommt deine Anwendung vermutlich in den 'Vordergrund'. Zu fast 100% kann auf diese Befehle bei sauberer VBA-Programmierung verzichtet werde. Aber wem sag ich das, bei deinem Level!
.OnTime Routinen müssen sauber beendet werden. Siehe dazu die OnTime Hilfe. Ich sehe in Deinem Code keine Speicherung der nächsten Laufzeit, die aber unabdingbar ist, für das spätere richtige Beenden. Konsultier mal das Archiv, zur OnTime oder Zeitsteuerung.
GreetZ Renée
Anzeige
AW: Der Grund ist Dein Code...
17.02.2009 15:17:00
Michel
Hallo Renée,
mh :-/
ich habe noch keine andere Idee gehabt wie ich Rahmen und Interior Anweisungen OHNE Select mache.
Aber ich bin Verbesserungen immer aufgeschlossen und man lernt ja nie aus.
mit "OnTime Now + TimeValue("00:05:00")" wird doch aber die Ausführung auf NOW + 5 Min gesetzt? oder sehe ich das falsch? Es läuft jedenfalls alle 5 Min. :-) und
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
steht grundsätzlich bei mir am Anfang und das Gegenstück am Ende.
Gruß
Michael
AW: Der Grund ist Dein Code...
17.02.2009 15:22:00
Renee
Hi Michael,
Zitat: ich habe noch keine andere Idee gehabt wie ich Rahmen und Interior Anweisungen OHNE Select mache.
Ich hingegen hab noch nie eine SELECT Anweisung gebraucht um die .Border oder .Interior Eigenschaften von Zellen zu verändern. Beispiel für direkte Anweisungen findest du zu 100ten im Forumsarchiv.
Zitat: die Ausführung auf NOW + 5 Min gesetzt? oder sehe ich das falsch? nein das siehst du richtig.
Ich frage mich nur, was passiert, wenn du die Datei (nicht Excel!) dazwischen schliesst. Wenn nämlich das OnTime Makro nicht gestoppt wird, wird deine Datei automatisch wieder erscheinen und dein Makro ablaufen oder es tritt sonst ein zweifelhafter Fehler auf...
GreetZ Renée
Anzeige
AW: Der Grund ist Dein Code...
17.02.2009 15:45:00
Michel
Hallo Renèe,
anscheinend bin ich zu blöd :-(
aber ich habe jetzt nichts gefunden zur Formatierung
Ich mache z. B. beim Jahreswechsel in meiner Tabelle ein "Dicke Linie" und zwar vom Anfang der Tabelle (Zeile 4) bis zum Ende (ist variabel) des Benutzten Bereiches! Ich mache das so
If JahrA JahrN Then
ActiveSheet.Range(Cells(4, Spalte), Cells(TabellenEnde, Spalte)).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
JahrA = JahrN
End If
Wie würdes Du das lösen?
Danke für Deine Hilfe
Gruß
Michael
Anzeige
Ohne Select
17.02.2009 16:05:00
Renee
Hi Michael,
Ich würde, wie gesagt den .Select weglassen:

If JahrA  JahrN Then
With ActiveSheet.Range(ActiveSheet.Cells(4, Spalte), _
ActiveSheet.Cells(TabellenEnde, Spalte)) _
.Borders(xlEdgeLeft)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
JahrA = JahrN
End If


GreetZ Renée

AW: Ohne Select
17.02.2009 16:20:00
Michel
ooooooohhhhhhhhhhhh mannnnnnnnnnnn. :-D
Okay! ich gebe bei nächsten Fragen wieder VBA - Anfänger an :-)
Klar! das kenne ich! Da müsste ich mal den Code durchforsten, teilweise sind die Sachen auch schon alt und da war ich noch schlechter als jetzt :-)
Allerdings habe ich noch nicht das Problem mit dem "in Vordergrund drängen gelöst".
Ich denke aber das es an der onTime eingendlich nicht liegen kann. Weil diese Routine erst am Ende des Codes wieder aufgerufen wird wenn alles erledigt ist, um DANN mit 5 Min Wartezeit von neuem zu starten.
Gruß
Michael
Anzeige
Identifikation mit Ausruf!
17.02.2009 16:26:00
Renee
Hi Michael,
Ich nehme an, die erste Zeile in deiner Antwort, war für dich bestimmt. Ich könnte mich damit nicht identifzieren ;-)
Natürlich verlangt ein .Select und .Activate, dass das Blatt bzw. Objekt "im Vordergrund" ist, und genau diese Befehle werden das Verhalten, welches du beschreibst, verursachen.
Ich glaube das du auch die .OnTime Steuerung noch nicht voll gecheckt hast. Denn wichtig ist das ABBRECHEN, weniger das Starten!
GreetZ Renée
AW: Ohne Select
20.02.2009 08:44:00
Michel
So,
das was sich in der Vordergrund drängt ist ein VBA-Fenster.
Da ich Code in eine neue Arbeitsmappe kopiere mit:

Sub AddWorkbookEvent(neuName)
Dim lngStartLine As Long
Dim a As Integer, b As Integer
With Application
.StatusBar = "

Sub AddWorkbookEvent(neuName)"
.DisplayAlerts = False
.VBE.MainWindow.Visible = False
a = .VBE.MainWindow.Height 'Fenstergröße merken
b = .VBE.MainWindow.Width ' Fenstergröße merken
.VBE.MainWindow.Height = 0
.VBE.MainWindow.Width = 0
End With
With Workbooks(neuName).VBProject.VBComponents("DieseArbeitsmappe") _
.CodeModule
' Codeschablone einfügen
lngStartLine = .CreateEventProc("Open", "Workbook") + 1
Application.VBE.MainWindow.Visible = False
' Code in Ereignis-Prozedur einfügen
.InsertLines lngStartLine, _
"Dim i, spalte, jetztwoche, woche, wt As Single" & Chr$(13) _
& "Dim aktuelldatum As Date" & Chr$(13) _
& "Application.ScreenUpdating = False" & Chr$(13) _
& "Application.Calculation = xlManual" & Chr$(13) _
& "ActiveWorkbook.Colors(15) = RGB(210, 210, 210)" & Chr$(13) _
& "ActiveWorkbook.Colors(16) = RGB(180, 180, 180)" & Chr$(13) _
hier folgt noch mehr Code
' Codeschablone einfügen
lngStartLine = .CreateEventProc("BeforeClose", "Workbook") + 1
' Code in Ereignis-Prozedur einfügen
.InsertLines lngStartLine, _
"ThisWorkbook.Saved = True"
With Application
.VBE.MainWindow.Visible = False
.VBE.MainWindow.Height = a
.VBE.MainWindow.Width = b
.DisplayAlerts = True
End With
End With
End Sub


und wenn dieses Modul aufgerufen wird, kommt das Fenster in den Vordergrund, das lässt sich auch mit Screenupdating = false nicht verhindern? oder gibt es eine Möglichkeint?
Ich mache das Fenster schon ganz klein .VBE.MainWindow.Height = 0 aber die Symbolleisten sind immer noch da!
Gruß
Michael

Anzeige
Code mit Code erzeugen,
20.02.2009 09:20:00
Renee
war mir schon immer suspekt, Michael
Darum kann ich dazu nicht viel sagen.
Allerdings wundert es mich das du hier mit Application.VBE.MainWindow rumfummelst.
Das ist m.E. völlig unnötig. Versuch es doch mal in dem du alles auskommentierst, was mit dem .MainWindow Objekt zu tun hat.
GreetZ Renée
AW: Code mit Code erzeugen,
20.02.2009 11:58:00
Michel
das sieht dann aber überhaupt nicht mehr gut aus.
Da beim Erzeugen von Code per VBA das VBA-Editor-Fenster aufgeht und das immer so groß wie zuletzt eingestelle. Deshalb mache ich das zumindest schon mal kleiner (0).
Aber ich muss das Erscheinen des Etitorfenstern verhindern.
Gruß
Michael
Anzeige

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige