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

Weitere Excel-Instanz mit VBA ohne Code-Blockierun

Weitere Excel-Instanz mit VBA ohne Code-Blockierun
12.07.2008 15:19:27
Michael
Hallo Miteinander!
Ich möchte zur Verbesserung der Performance, Teile meines Code in einer weiteren Excel-Instanz abarbeiten lassen. Ich habe mir gedacht, dass ich dazu mein Programm über Parameter als Unterprogramm starte. Die Excel-Instanz starte ich über

Sub NeuesExcelStarten()
Dim XLApp As Object
Set XLApp = CreateObject("Excel.Application")
XLApp.Application.Visible = True
XLApp.Application.Workbooks.Add
End Sub


Nehme ich statt "XLApp.Application.Workbooks.Add" "XLApp.Application.Workbooks.open ......" wird erst der Code der neuen Mappe ausgeführt und dann erst der vorherige fortgesetzt. Kann ich stattdessen die Mappe über Startparameter bei diesem Aufruf mitstarten lassen, sodass der Code separat läuft?
Danke für Eure Hilfe
Gruß
Michael

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

Betreff
Datum
Anwender
Anzeige
AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
12.07.2008 16:36:23
Heinz
Hi,
"Kann ich stattdessen die Mappe über Startparameter bei diesem Aufruf mitstarten lassen, sodass der Code separat läuft?"
Nein!
mfg heinz

AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
12.07.2008 16:50:40
Michael
Hallo Heinz!
Danke für die erschöpfende Antwort. Hast Du vllt. andere Vorschläge? Bitte nur Antworten, wenn ja.
Gruß
Michael

AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
12.07.2008 17:35:00
Heinz
Hi,
deine Fragestellung ist nicht gerade sehr aufschlussreich. was soll denn in der anderen Instanz
überhaupt passieren?
Wenn es um Berechnungen geht, wäre eine DLL die bessere Alternative.
mfg heinz

AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
13.07.2008 00:22:00
Michael
Hallo Heinz!
Es geht um Berechnungen. Aber eine DLL kann ich nicht. Ich verarbeite Lohnkonten. Das sind gedruckte Blätter als Textfiles ausgegeben, die ich interpretiere und in Tabellen konvertiere. Ich habe in der Regel etwa 40000 Zeilen, die in mehreren Arbeitsgängen über texttocolumn lesbar gemacht werden müssen, dann zugeordnet, transponiert und in ein neues Datenformat übergeben werden. Pro Arbeitnehmer sind das etwa 120x16 Datensätze. Excel braucht da bei einem DualCore etwa 20 min. Bei 65000 Zeilen schon 1,25 Stunden. Ich möchte daher die Rechenzeit über mehrere Instanzen auf mehrere CPUs verteilen.
Gruß
Michael

Anzeige
AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
12.07.2008 18:28:11
Tino
Hallo,
habe dies nicht getestet, aber du könntest mal versuchen diese Datei über ein Windows Script zu öffnen.
Im Script
set wshell = CreateObject("Wscript.shell")
wshell.run ("EXCEL.EXE ""C:\Mein Ordener\Test.xls""")
Dies als *.vbs Datei abspeichern.
Diese Datei ausführen im Code.

Option Explicit
Public Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nshowcmd As Long) As Long
Sub test()
Dim Pfad As String
Pfad = "C:\Ordner\Test.vbs"
Call ShellExecute(0, "open", Pfad, "", "", 6)
End Sub


Gruß Tino

www.VBA-Excel.de


Anzeige
AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
13.07.2008 00:23:39
Michael
Hallo Tino!
Werde ich ausprobieren. Vielen Dank für die Hilfe!
Gruß
Michael

AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
13.07.2008 00:35:32
Tino
Hallo,
über eine Rückmeldung ob es Funktioniert würde ich mich freuen, da es mich auch mal interessieren würde ob es geht.
Gruß Tino
PS: noch einen schönen Sonntag

http://www.VBA-Excel.de


AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
14.07.2008 13:03:57
Michael
Hallo Tino!
Ich brauche nochmal Unterstützung. Ich erzeuge die .vbs über VBA. Das hat den Vorteil, dass ich die Anzahl der Aufrufe an die Anzahl der Prozessoren anpassen kann:
'VBSCRIPT ERZEUGEN FÜR MULTITHREADING
If Firmendaten.CheckCPUNutzen = True Then
file = ThisWorkbook.Path & "\Multithreading.vbs"
fileXL = ThisWorkbook.Path & "\" & ThisWorkbook.Name '"\Multithreading.vbs"
filechannel = FreeFile()
Open file For Output As #filechannel
' Initialisierung
InfoText.InfoText_Text.Caption = "Erstelle Multithreading-Startprogramm..."
InfoText.InfoText_Time = Time - Sheets("Firmendaten").Range("B23")
'InfoText.Fortschrittsbalken.Width = 200 + (10 / Sheets("Firmendaten").Range("B1") * rw - 1)
DoEvents
Print #filechannel, "set wshell = CreateObject(""Wscript.shell"")";
'Print #filechannel, "wshell.run (""EXCEL.EXE """"C:\Mein Ordener\Test.vbs"""""")";
'ANZAHL ZU STARTENDER CLIENTS
For i = 1 To Sheets("Firmendaten").Range("S15")
Print #filechannel, ""
Print #filechannel, "wshell.run (""EXCEL.EXE """"" & fileXL & """"""")";
Next i
Print #filechannel, ""
Close #filechannel
End If
Beim Aufruf ergeben sich noch zwei Probleme: Ich benötige einen Zeitzähler zwischen dem Aufruf der Clients. Die Clients sind jeweils das gleiche Excel-Programm. Beim AutoOpen wird sich in der Registry angemeldet, um zwischen Hauptanwendung und Client zu unterscheiden. Dafür muss zwischen den Starts aber 2,3 Sekunden liegen. Kannst Du mir dafür eine VBS-Zeile geben?
Das zweite Problem ist die Excel-Abfrage, ob die Mappe schreibgeschützt geöffnet werden soll. Kann ich das abfangen? Und wie?
Danke
Gruß
Michael

Anzeige
AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
14.07.2008 13:25:12
Tino
Hallo,
für die Pause kannst du dies benutzen.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Im Code:
Call Sleep(2300)
oder nur für Sekunden reicht auch:
Application.Wait Now + CDate("00:00:03")
Zu zweitens kann ich auch nichts sagen ohne dies zu testen, bin nicht gerate ein Script Experte.
Musst du mal über Google suchen.
Gruß Tino

www.VBA-Excel.de


AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
14.07.2008 13:44:00
Tino
Hallo,
ach so benötigst du die Pause im Script?
Müsste eigentlich so gehen, teste mal.
WScript.Sleep 2300 oder WScript.Sleep "2300"
Gruß Tino

www.VBA-Excel.de


Anzeige
AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
14.07.2008 14:13:24
Michael
Läuft! Danke.

AW: Weitere Excel-Instanz mit VBA ohne Code-Blockierun
15.07.2008 16:34:46
Michael
Hallo Tino!
Es klappt wunderbar inzwischen. Ich habe das Script von Dir überarbeitet, wegen der Schreibschutznachfragen und einen Zeitcounter eingefügt. Um die Kollegen nicht zu verunsichern, was für eine Script-Datei da plötzlich ist, lasse ich sie per Code erzeugen und am Schluß wieder löschen.
Als erstes lese ich die Anzahl der Prozessorkerne aus:
' Benötigte API-Deklarationen, um Prozessorkerne auszulesen
Private Declare Sub GetSystemInfo Lib "kernel32" ( _
lpSystemInfo As SYSTEM_INFO)
Private Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
dwReserved As Long
End Type

Private Sub UserForm_Activate()
Dim strAbfrageLEFT, strAbfrageTOP
Dim AnzahlCPU As Integer
'* Anzahl der Prozessoren ermitteln               *
AnzahlCPU = NumProcessors()
'MsgBox CStr(nProcessorCount) & " Prozessor(en) installiert."
Firmendaten.AnzahlCPUs = AnzahlCPU
End Sub


Anhand dieser Zahl starte ich variabel die Anzahl der weiteren Excel-Anwendungen. Eine Checkbox bei der Anzeige der CPUs gibt mir die Möglichkeit, ohne Aufruf der Anwendungen bei kleinen Dateimengen zu arbeiten. Die nachfolgende Abfrage lasse ich dann beim Close der Userform ablaufen, um die VBS-Datei zu erzeugen:
'VBSCRIPT ERZEUGEN FÜR MULTITHREADING
If Firmendaten.CheckCPUNutzen = True And Sheets("Firmendaten").Range("S15") > 1 Then
file = ThisWorkbook.Path & "\Multithreading.vbs"
Sheets("Firmendaten").Range("C26") = file
fileXL = ThisWorkbook.Path & "\" & ThisWorkbook.Name '"\Multithreading.vbs"
filechannel = FreeFile()
Open file For Output As #filechannel
' Initialisierung
InfoText.InfoText_Text.Caption = "Erstelle Multithreading-Startprogramm..."
InfoText.InfoText_Time = Time - Sheets("Firmendaten").Range("B23")
'InfoText.Fortschrittsbalken.Width = 200 + (10 / Sheets("Firmendaten").Range("B1") * rw - 1)
DoEvents
'ANZAHL ZU STARTENDER CLIENTS
For i = 1 To Sheets("Firmendaten").Range("S15") - 1
Print #filechannel, "Set excel = WScript.CreateObject (""Excel.Application"")"
'Print #filechannel, ""
Print #filechannel, "excel.Workbooks.Open """ & fileXL & """"
If i Next i
Print #filechannel, ""
Close #filechannel
End If
Schließlich und endich kommt der Shell-Aufruf, den ich in meinem Code für Datenanalyse direkt nach dem Öffnen der Fremd-Datei untergebracht habe.
'ZUM STARTEN DER WINDOWS-SCRIPTING-DATEI
Public Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nshowcmd As Long) As Long
'AUFRUF DER MULTITHREAFDING-DATEI
sub soundso
Dim Pfad As String
Pfad = FD.Range("C26")
If Firmendaten.CheckCPUNutzen = True Then Call ShellExecute(0, "open", Pfad, "", "", 6)
End Sub


Eingebettet habe ich das Ganze in eine Client-Verwaltung über die Registry. Beim Start der Mappe wird im Key MT nachgesehen, ob die mappe Client 1 oder höher wird.


Private Sub Workbook_Open()
'* ClientNr für Multithreading abfragen           *
Dim strAbfrage As String
strAbfrage = GetSetting( _
appname:="MT-Proggi", _
section:="Client", _
Key:="ClientNr")
If strAbfrage = "" Then
ClientNr = 1
Else: ClientNr = CLng(strAbfrage) + 1
End If
Application.Caption = "MT-Proggi - Client " & ClientNr
Sheets("Firmendaten").Range("B26") = ClientNr
SaveSetting _
appname:="MT-Proggi", _
section:="Client", _
Key:="ClientNr", _
setting:=ClientNr
Application.Visible = False
If ClientNr = 1 Then Disclaimer.Show
Application.Visible = True
End Sub


Damit weist sich jeder Client mit einer eigenen Nummer aus. Beim Workbook_Close dann diese Eintragungen löschen und Excel und die Mappe ohne Nachfrage Ihrerseits schließen:
Sub Workbook_BeforeClose(Cancel As Boolean)
DeleteSetting _
appname:="MT-Proggi", _
section:="Client", _
Key:="ClientNr"
ActiveWorkbook.Saved = True
If ClientNr > 1 Then Application.Quit
End Sub


Vom Prinzip her öffne ich also meine Mappe X-mal. Vor dem Start der VBS, speicher ich meine Mappe, damit die Clients die aktuellen Einstellungen haben. Ich muss beim Aufruf der Clients also nur die Popups deaktivieren, weil ich die Einstellungen vom ersten Aufruf her kenne und lasse alles automatisch durchlaufen. Dazu rufe ich die Datei, die Bearbeitet werden soll, einmal auf und zähle durch von wo bis wo welcher Client zuständig ist.
ich hoffe, dass es den ein oder anderen helfen kann.
Gruß
Michael Heering

Anzeige
Danke für die Rückmeldung!!!
15.07.2008 20:19:17
Tino
Hallo Michael,
super dass es funktioniert.
Danke für deine ausführliche Rückmeldung!
So macht dieses Forum Spaß.
Gruß Tino

www.VBA-Excel.de


AW: Danke für die Rückmeldung!!!
23.07.2008 17:19:00
Michael
Anbei noch ein paar Stichport für die Forumssuche:
Multithreading
Parallelbearbeitung
Core2Duo
Core2Quad
Mehrere Prozessoren

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige