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

Application.Run - Daten ByRef übergeben

Application.Run - Daten ByRef übergeben
30.11.2006 11:40:27
Marius
Hallo,
ich möchte mehrere Excel Instanzen parallel laufen lassen,
um auf Dual-Core Rechnern mehr Performance zu erreichen.
Das klappt auch wunderbar mit folgendem Code:
in Server.xls:
Public Datas As Scripting.Dictionary
Sub InitClient()
Dim cApp As Excel.Application
Set cApp = New Excel.Application
cApp.Workbooks.Open ThisWorkbook.Path & "\Client.xls", , True
cApp.Run "MySub", Datas
End Sub
Sub StartJob()
Datas.Item("Job") = "Count"
End Sub
in Client.xls :
Public Datas As Scripting.Dictionary
Sub MySub(ByRef eDatas As Scripting.Dictionary)
Set Datas = eDatas
UserForm1.Show 0
End Sub
in Userform1:

Private Sub UserForm_Activate()
MyInit
End Sub

Public Sub MyInit()
Dim w As Long
restart:
Do
w = w + 1
Sleep 10
Label1.Caption = "Waiting " & w \ 100
DoEvents
Loop Until Datas.Item("Job") 0
Count
Datas.Item("Job") = 0
w = 0
GoTo restart
End Sub
Public Sub Count()
Dim c As Long
For c = 1 To 10000
Label1.Caption = c
DoEvents
Next c
End Sub
Also, im Task Server.xls InitClient ausführen, StartJob
ausführen und Client.xls wird die Sub Count ausgeführt-
so weit, so gut.
Interessanterweise kann ich per cApp.Run auf dem Client
einen Objektverweis auf das Scripting.Dictionary erstellen.
Aber ich muss sozusagen auf einen "gemeinsamen" Datenpool
zugreifen, für den das Scripting.Dictionary etwas ungeeignet
ist.
Gibt es eine Möglichkeit, auf Server und Client auf eine
gemeinsame Klasseninstanz zurückzugreifen? Per Application.Run
ist mir das bisher mit eigenen Klassen nicht gelungen. Oder
hat jemand eine Idee, wie ich einen Array ByRef übergeben kann?
Sprich: was gibt es für möglichkeiten, das die beiden Tasks
auf einen gemeinsamen Speicher zugreifen können?
Bin für jede Idee dankbar

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Application.Run - Daten ByRef übergeben
30.11.2006 14:34:40
Coach
Hallo Marius,
im Prinzip entwickelt ja Dein Client kein Eigenleben, oder? Du startest eine "Timer"-Sub (es ist eher eine Warte-Sub) und führst dann eine spezielle Sub aus.
Da der Server ja die somit die komplette Kontrolle über den Client hat, braucht dieser seine Rechenergebnisse ja nur in einem Tabellenblatt ablegen, aus der sie der Server lesen und neue Start-Parameter kann. So kann auch der Timer-Prozess gezielt beendet und die Tochterinstanz beendet werden.
Man könnte natürlich auch über eine gemeinsame DLL, die Registry, Datenbanken etc. gehen.
Gruß Coach
AW: Application.Run - Daten ByRef übergeben
30.11.2006 20:52:02
Marius
Naja- der Client hat schon sein "Eigenleben". Die Idee ist, das ich 2 Clients starte, die aber auf eine gemeinsame, auf dem "Server" instanzierte Klasse zugreifen müssten.
Anzeige
AW: Application.Run - Daten ByRef übergeben
30.11.2006 21:04:51
Coach
Hallo Marius,
ohne das jetzt getestet zu haben, sollte es möglich sein, im Client wiederum einen Object-Bezug zum Server zu erstellen und dann aus diesem Daten zu lesen.
Such mal unter "Excelinstanzen".
Ist die Klasse so spezifisch, dass sich das nicht in einer DB abbilden läßt?
Gruß Coach
AW: Application.Run - Daten ByRef übergeben
01.12.2006 07:36:46
Coach
Hallo Marius,
ich habe es mal mit einer Referenz auf eine Collection getestet, das funktioniert:
im Server:
Option Explicit
Global MyCol As Collection

Sub InitClient()
Dim cApp As Excel.Application, i As Long, cWB As Workbook
Set MyCol = New Collection
For i = 1 To 10
MyCol.Add i, "s" & i
Next
Set cApp = New Excel.Application
Set cWB = cApp.Workbooks.Open(ThisWorkbook.Path & "\Client.xls", , True)
cApp.Run "MyTask", MyCol
cWB.Close
cApp.Quit
For i = 1 To MyCol.Count
Debug.Print MyCol(i)
Next
End Sub

Im Client
Option Explicit

Sub MyTask(ByRef C As Collection)
Dim i As Long
For i = 1 To C.Count
C.Remove 1
C.Add i + 1000, "c" & i
Next
End Sub

Gruß Coach
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige