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

Speicherprob bei progr. Steuerung von Fremdprogr.

Speicherprob bei progr. Steuerung von Fremdprogr.
19.12.2004 23:12:03
Fremdprogr.
Huhu zusammen,
vor einigen Monaten habe ich das Problem schon mal geschildert - leider ohne dass mir jemand helfen konnte. Ich versuche es jetzt nochmals in der Hoffnung, dass vielleicht in der Zwischenzeit jemand über das Problem und seine Lösung gestoplert sind.
Über xl97 werden verschiedene Drittanwendungen, darunter auch Outlook 98(Serienmailing), gesteuert. Mit zusehends höherer Schleifenzahl kommt es dabei zu Speicherproblemen (Manchmal mit entpr. Fehlermeldungen (visual basic, auch auch aus xl oder sogar vom OS(win NT): not enough memory, meist jedoch "nur" in Form eines Zusammenbruchs der Grafik (Bild beginnt zu flattern, Fenster flackern wild über den Schirm, Fonts werden nicht mehr korrekt dargestellt) bis schließlich gar nichts mehr geht. Der Effekt tritt desto früher auf, je mehr weitere Anwendungen geöffnet sind.
Die Ursache hierfür ist mir völlig unerklärlich. Zwar sind im Script eine Reihe (auch nicht übermäßig) viele Variablen definiert, die Definitionen befinden sich jedoch alle außerhalb der Schleife. In der Schleife wird gerade einmal das Objekt für das Mailitem gesetzt (und auch wieder im Ende der Schleife auf "Nothing" gesetzt). Auch läßt sich an den übrigen Parametern Belegung RAM, Belegung virtueller Speicher, etc. nichts pathologisches aus dem Task Manager ersehen.
Das Speicherproblem besteht so lange, bis die Drittanwendung (Outlook) geschlossen wird. Dabei reicht es nicht, application.outlook = nothing zu setzen, sondern es muß Outlook als Prozeß beendet werden.
Das Problem hat sich auf meinem Rechner zuhause nicht reproduzieren lassen, tritt aber grundsätzlich auf der Plattform in der Arbeit auf. Da es auch bei anderen Anwedungen als MSO auftritt, liegt es - denke ich - nicht an Outlook, oder dem Exchange Server.
Hat jemand eine Idee, was die Ursache sein könntem, und was man dagegen tun kann?
Ich hatte schon den Lösungsanatz verfolgt, outlook alle paar 100 schleifendurchläufe zu beenden und neu zu starten. Das würde grundsätzlich auch helfen. Leider ist die Methode "objOutlook.quit" aber nicht sehr zuverlässig: Sobald in MSO ein Pop-Up geöffnet ist, schließt der Befehl MSO nicht mehr. Sofern mir niemand im Grundproblem helfen kann, hat vielleicht zumindest jemand einen Rat, wie man MSO sicher schließen kann... auch wenn andere MSO-Fenster noch geöffnet sind.
Herzlichen Dank für jede Unterstützung
Björn

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speicherprob bei progr. Steuerung von Fremdpro
19.12.2004 23:17:57
Fremdpro
Hallo Björn!
Ohne jetzt deine Code zu kennen, aber manchmal ist einfach Outlook zu
langsam beim versenden der Mails und wird sozusagen vom Code überholt.
Probier mal eine kurze Wartezeit nach dem Versenden einzubauen.
zB.:

Application.Wait Timeserial(0,0,2)

Gruß Sepp
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 09:42:00
Fremdpro
Huhu Josef,
Danke für Deinen Tipp. Tatsächlich hatte ich vergessen, zu schreiben, dass ich das schon umgesetzt hatte - und es auch *etwas* geholfen hatte. Ich hatte ein Paar Sleep- und DoEvents-Befehle eingebaut. Das Problem an sich löst das aber auch nicht. Wenn es zu den beschriebenen Speicherproblemen kommt, bleiben diese so lange bestehen, bis Outlook ganz geschlossen wird - egal wie lange nach dem Versand der letzten Mail noch gewartet wird. Der Code ist der sonst Übliche zu Steuerung von Outlook. Am Programm selbst liegt es sehr sicher nicht. Ich habe es leider die nächsten Paar Tage nicht "zur Hand".
Danke trotzdem nochmals für den Tipp. Hast Du vielleicht noch eine Idee, wie ich MSO programmatisch auch bei ev. geöffnetem Nachrichtenfenster (z.B. "Sie haben neue Nachrichten erhalten. Wollen Sie diese jetzt...") schließen, dh den Prozeß beenden kann?
Viele Grüße
Björn
Anzeige
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 11:23:30
Fremdpro
Huhu Josef,
so der Firmenserver hat sich entschieden, die gestern gesendeten Mails doch noch zu übertragen. Nachstehend der Code, den Du allerdings nur mit den entsprechenden Tabellenblättern und Zellennamen zum Laufen bringen könntest. Da der Code aber absolut unspektakulär ist, denke ich, dass Du auch ohne Testlauf einen Eindruck gewinnen kannst - zumal der Testlauf auf einem Standalone (wie bei mir zuhause) auch reibungslos läuft.
Ich habe jetzt eine Methode zum Beenden des Prozesses über das Windows-Handle zu "Microsoft Outlook" gefunden (www.vbarchiv.net/faq/allg_exitprocess.php). Schöner wäre es natürlich, wenn man über den Prozeßnamen "Outlook.exe" beenden könnte. Am besten natürlich, wenn es noch eine andere, eine SICHERE und trotzdem "schonende" Methode zum Beenden gäbe. Das Beenden des Proceces ist natürlich schon relativ gewaltsam... Was passiert zum Beispiel, wenn Outlook gerade im Begriff war, eine Mail zu empfangen mit dieser Mail beim Terminieren des Prozesses? Nochmals Danke und Gruß
Björn
Hier der Code
Public

Sub Senden()
Dim tbl As Worksheet
Set tbl = ActiveWorkbook.ActiveSheet
Dim i%
i = 2
Dim ls%, c%
ls = Cells(2, Cells.Columns.Count).End(xlToLeft).Column
Dim werte As Worksheet
Set werte = ThisWorkbook.Sheets("Werte")
Dim Kdnr, VNAnrede, VNTitel, VNVorname, VNNachname, _
VNStrasse, VNPlz, VNOrt, VNTelPriv, VNTelGesch, VNGebDat, VNArt, _
AGTNr, Beginn, Ablauf, Sparte, Vsnr, Beitrag, _
Monatsfaelligkeit, Tagesfaelligkeit, Schadenzahl, Schadenhoehe, Saldoart, Saldohoehe, _
Mahnstufe, BeitragZW, ZW, ErstellDat, Ablauf2, GEVO, TKlausel, _
AgtAnrede, AgtVorname, AgtNachname, AgtPnr, AgtGes, AgtMandant, _
AgtTel, AgtFax, AgtMail As String
Dim lHwnd, lRetVal As Long
Dim intCounter%
Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Set objOutlook = Nothing
Set objOutlookMsg = Nothing
Dim bolStatusBar
Application.DisplayStatusBar = True
bolStatusBar = Application.DisplayStatusBar
On Error Resume Next
Err.Number = 0
Set objOutlook = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then
'MsgBox "starte Outlook"
'Outlook läuft noch nicht, muß gestartet werden
Set objOutlook = CreateObject("Outlook.Application")
Shell "outlook.exe", vbMinimizedNoFocus
'Application.ActivateMicrosoftApp xlMicrosoftMail
End If
On Error GoTo 0
'übersetze Buchstaben am Ende der Beiträge in der Steuertabelle in Zahlen
Dim StrToInt As New Collection
StrToInt.Add 1, "A"
StrToInt.Add 2, "B"
StrToInt.Add 3, "C"
StrToInt.Add 4, "D"
StrToInt.Add 5, "E"
StrToInt.Add 6, "F"
StrToInt.Add 7, "G"
StrToInt.Add 8, "H"
StrToInt.Add 9, "I"
StrToInt.Add 0, "ä"
'Dim B%
'If UF.TextBox1.Value = "" Then
B = 2
'Else
'B = UF.TextBox1.Value
'End If
'Letzte Zeile in der Steuertabelle
Dim lr%
'If UF.TextBox2.Value = "" Then
lr = tbl.Cells(tbl.Cells.Rows.Count, 17).End(xlUp).Row
'Else
'lr = UF.TextBox2.Value
'End If
Dim start, Messung As Double
start = Timer
Dim HTMLString As String
Dim JBB As String
Dim RSVBeitragZW$
Dim MS As MEMORYSTATUS
Dim t1 As Variant
Dim s%, z%
s = 1           'Schleifendurchläufe
z = lr - B + 1  'Anzahl der Mails
For i = B To lr
DoEvents
Sleep 1
Kdnr = tbl.Cells(i, 1)
VNAnrede = tbl.Cells(i, 2)
VNTitel = tbl.Cells(i, 3)
VNVorname = tbl.Cells(i, 4)
VNNachname = tbl.Cells(i, 5)
VNStrasse = tbl.Cells(i, 6)
VNPlz = tbl.Cells(i, 7)
VNOrt = tbl.Cells(i, 8)
VNTelPriv = tbl.Cells(i, 9)
VNTelGesch = tbl.Cells(i, 10)
VNGebDat = tbl.Cells(i, 11)
VNArt = tbl.Cells(i, 13)
AGTNr = tbl.Cells(i, 12)
Beginn = tbl.Cells(i, 14)
Ablauf = tbl.Cells(i, 15)
Sparte = tbl.Cells(i, 16)
Vsnr = tbl.Cells(i, 17)
Beitrag = tbl.Cells(i, 18)
Monatsfaelligkeit = tbl.Cells(i, 19)
Tagesfaelligkeit = tbl.Cells(i, 20)
Schadenzahl = tbl.Cells(i, 22)
Schadenhoehe = tbl.Cells(i, 23)
Saldoart = tbl.Cells(i, 24)
Saldohoehe = tbl.Cells(i, 25)
Mahnstufe = tbl.Cells(i, 26)
BeitragZW = tbl.Cells(i, 178)
ZW = tbl.Cells(i, 181)
ErstellDat = tbl.Cells(i, 182)
Ablauf2 = tbl.Cells(i, 183)
GEVO = tbl.Cells(i, 190)
TKlausel = tbl.Cells(i, 192)
AgtAnrede = tbl.Cells(i, 200)
AgtVorname = tbl.Cells(i, 201)
AgtNachname = tbl.Cells(i, 202)
AgtPnr = tbl.Cells(i, 203)
AgtGes = tbl.Cells(i, 204)
AgtMandant = tbl.Cells(i, 205)
AgtTel = tbl.Cells(i, 206)
AgtFax = tbl.Cells(i, 207)
AgtMail = tbl.Cells(i, 208)
With werte
.Range("AgenturNummer") = AGTNr
.Range("VNAnrede") = VNAnrede
.Range("VNTitel") = VNTitel
.Range("VNVorname") = VNVorname
.Range("VNVorname") = VNVorname
.Range("VNNachname") = VNNachname
.Range("VNStrasse") = VNStrasse
.Range("VNPlz") = VNPlz
.Range("VNOrt") = VNOrt
.Range("VNTelPriv") = VNTelPriv
.Range("VNTelGesch") = VNTelGesch
.Range("VNKundenNummer") = Kdnr
.Range("VNGeburtstag") = VNGebDat
.Range("RSVNummer") = Sparte & " " & Vsnr
.Range("RSVBeginn") = Beginn
.Range("RSVAblauf") = Ablauf
.Range("RSVZW") = ZW
RSVBeitragZW = Format(((Left(BeitragZW, 12) + (Mid(BeitragZW, 13, 1) / 10)_
+ (CInt(StrToInt(Mid(BeitragZW, 14, 1))) / 100))) * 116 / 100, "#,###.00")
.Range("RSVBeitragZW") = RSVBeitragZW
JBB = Format(RSVBeitragZW * CInt(ZW), "#,###.00")
.Range("RSVSaldo") = Saldoart & " " & Format((Left(Saldohoehe, 12) _
+ (Mid(Saldohoehe, 13, 1) / 10)), "#,##0.00")
.Range("RSVMahnstufe") = Mahnstufe
End With
HTMLString = "<html><body>" & _
ThisWorkbook.Sheets("Mailtext").Range("Agenturdaten") & _
ThisWorkbook.Sheets("Mailtext").Range("AllgemAnrede") & _
ThisWorkbook.Sheets("Mailtext").Range("VScheinDaten1") & _
ThisWorkbook.Sheets("Mailtext").Range("VScheinDaten2") & _
ThisWorkbook.Sheets("Mailtext").Range("AllgemSchluss") & _
"</body></html>"
DoEvents
Sleep 1
If werte.Range("AgenturSperre") = 0 Then
Application.StatusBar = "Sende Mail zu Vertrag " & Sparte & " " & Vsnr & "..."
Set objOutlookMsg = objOutlook.CreateItem(olMailItem)
With objOutlookMsg
.To = "test@testxyz.de"
.Subject = "Info " & " " & " " & VNNachname & ", Agt. " & AGTNr
.HTMLBody = HTMLString
DoEvents
Sleep 1
.Send
End With
End If
DoEvents
s = s + 1
Set objOutlookMsg = Nothing
DoEvents
If DateDiff("s", t1, Now) >= 60 Then
DoEvents
Sleep 5000
DoEvents
Sleep 1
DoEvents
Sleep 1
DoEvents
Sleep 1
t1 = Now
End If
DoEvents
Sleep 1
If (i - 1) Mod 100 = 0 Then
DoEvents
Sleep 100
DoEvents
Sleep 100
DoEvents
Sleep 100
'Outlook schließen...
objOutlook.Quit
Set objOutlook = Nothing
Sleep 7500
'...und wieder neu starten
On Error Resume Next
Err.Number = 0
Set objOutlook = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then
'Outlook läuft noch nicht, muß gestartet werden
Set objOutlook = CreateObject("Outlook.Application")
Shell "outlook.exe", vbMinimizedNoFocus
End If
On Error GoTo 0
End If
Next i
Call Beep(750, 500)
Set objOutlook = Nothing
Application.StatusBar = ""
End Sub

Anzeige
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 12:00:39
Fremdpro
Hallo Björn!
Was mir auffällt, das du nach

Set objOutlook = CreateObject("Outlook.Application")

wodurch ja eine Outlook-Instanz erstellt wird, mit

Shell "outlook.exe", vbMinimizedNoFocus

Outlook nochmal startest!
Gruß Sepp
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 13:07:36
Fremdpro
Hallo Josef,
Danke für den Hinweis auf den fehlerhaften Code. Er ist allerdings nicht die Ursache für das Arbeitsspeicherproblem, weil der Code erst viel später - in der Mailitem-Schleife gerade zur Lösung des Problems - dazu gekommen ist. In der Praxis ist mir auch nicht aufgefallen, dass dadurch MSO tatsächlich 2Mal gestartet worden wäre (Auch der Taskmanager weist nur einmal outlook.exe aus).
Sollte ich besser schreiben:

On Error Resume Next
Err.Number = 0
Set objOutlook = GetObject(, "Outlook.Application")
If Err.Number 0 Then
'Outlook läuft noch nicht, muß gestartet werden
Shell "outlook.exe", vbMinimizedNoFocus
Set objOutlook = GetObject(, "Outlook.Application")
End If
On Error GoTo 0
?
Danke für den Hinweis jedenfalls. Zu meiner anderen Frage, ob es schädlich sein könnte, den Prozeß von MSO zu terminieren - hättest Du da ev. auch eine Empfehlung?
Viele Grüße
Björn
Anzeige
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 13:12:44
Fremdpro
Hallo Björn!
Den Aufruf

Shell "outlook.exe", vbMinimizedNoFocus

brauchst du gar nicht!
Hier
http://www.activevb.de/tipps/vb6tipps/tipp0148.html
gäbe es schon eine Lösung, wie man auf das Beenden einer Anwendung warten kann,
man müsste das allserdings an die jeweiligen bedürfnisse anpassen!
Gruß Sepp
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 13:39:56
Fremdpro
Huhu Josef,
abermals Dank.
1) Schließen von MSO
Allerdings schließt sich Outlook ja nicht nur erst verzögert, sondern gar nicht bei geöffneten Nachrichtenfenstern oder geöffneten Messageboxen - vergleichbar etwa Hinweisfenster bei Schließen nicht gespeicherter Office-Dokumente. Das bloße Abwarten würde hier nicht reichen. Eher vielleicht eine Befehlergänzung wie "thisworkbook.close SAVECHANGES:FALSE". Gubt es hier etwas Vergleichbares um Outloook oder generell office-Anwendungen zu schließen?
2) Starten von MSO
Shell "outlook.exe", vbMinimizedNoFocus 'öffnen von MSO
Set objOutlook = GetObject(, "Outlook.Application")
...hat sich als nicht besonders stabil erwiesen, da mit dem Anknüpfen gewartet werden muß bis MSO vollständig gestartet ist. Hier könnte vielleicht der von Dir genannte Code zum Einsatz kommen. Das wäre aber mit Kanonen geschossen, weil der zuerst genannte Code in der praxis funktioniert (vermutlich, weil beim Start von Outlook immer an eine bereits laufende Anwendung angedockt wird, wenn sich diese im Hintergrund befindet).
Nochmals vielen Dank für Deine Anregungen!
Viele Grüße
Björn
Anzeige
AW: Speicherprob bei progr. Steuerung von Fremdpro
20.12.2004 14:26:02
Fremdpro
Hallo Björn!
Im Moment hab ich auch keine Idee;-((
Schau mal hier
http://www.rondebruin.nl/mail/problems.htm
vorbei, beachte Punkt (4).
Gruß Sepp
AW: Speicherprob bei progr. Steuerung von Fremdpro
Fremdpro
Huhu Sepp,
nochmals vielen Dank für Deine Bemühungen! Bis jetzt habe ich leider keine Lösung gefunden. "Tipp 4" konnte ich noch nicht testen - ich weiß auch nicht, ob ich in der Arbeit Zugriff auf diese Option habe. Zuhause ist es kein Problem - dort aber auch neuere Version von 2003 statt MSO 98. Mögl.w. liegt das Problem aber woanders - eher im Bereich der besonderen Eigenschaften des Netzwerkrechners, da das Problem in ähnlicher Weise auch bei einem weiteren von xl gesteuerten Programm auftreten kann. Ideal wäre es natürlich, wenn man die Code-parameter irgendwie auslesen könnte (Anzahl der genutzen Variaben, Speichernutzung, etc.). Geht aber wohl nicht - ?
Viele Grüße
Björn
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige