XL97 Aufruf "über Kreuz" & Datenübtragung per Makro

30/04/2010 - 10:09 von Eric March | Report spam
Moin, Moin!

Die Situation ist ein aufgerufenes XL in dem möglicherweise bereits
eine, ich nenns mal so, Zieldatei offen ist.
Dieser XL gesellt sich über den Taskplaner (weil es die Graue Substanz
sonst zu tun vergisst…) über den Schalter /automation eine weitere
Instanz hinzu die auch gleich eine Quelldatei öffnet (und, noch in
Planung, automatisch ausführt).
Besagte Quelle übertràgt das Hervorquellende in die Zieldatei.

Sind beide in der selben Instanz offen ist es einfach die Daten zu
übertragen (per Makro). Die Quelle prüft ob die Zieldatei offen ist; da
diese aber regelmàßig von anderen mit Beschlag belegt ist nützt es wenig
sie schreibgeschützt zu öffnen, hier ist Manpower erforderlich, so oder
so. In dem Falle wàre es einfach sie in der Instanz der Quelldatei zu
öffnen…

Wie aber ist das zu machen wenn beide in den jeweils anderen Instanzen
geöffnet sind? (Nein - Schließen und Wiederöffnen gilt nicht ;-) )

Eric March

Kenne die Vergangenheit. In der Unwissenheit über die Vergangenheit
liegt das Verderben der Zukunft.
"Die Geschichte ist der beste Lehrmeister - mit den unaufmerksamsten
Schülern." Indira Gandhi
 

Lesen sie die antworten

#1 Andreas Killer
30/04/2010 - 16:57 | Warnen spam
Eric March schrieb:

Wie aber ist das zu machen wenn beide in den jeweils anderen Instanzen
geöffnet sind? (Nein - Schließen und Wiederöffnen gilt nicht ;-) )


Ja, das ist ziemlich ekelig und leider kann man diese Instanz nicht
direkt anzapfen.

Aber mit einem Trick kommen wir doch dran, weil in dieser eine Datei
geöffnet ist und Du weißt wie diese heißt und wo sie liegt! Und damit
kannst Du ganz simpel mit GetObject(Datei) Dir Zugriff auf diese
Instanz holen.

BTW, ein GetObject(Datei) auf eine nicht geöffnete Datei öffnet diese
in der aktuellen Instanz.

Wie Du prüfst ob die Datei in der aktuellen Instanz geöffnet ist weißt
Du selber, wie man rausbekommt ob diese in einer anderen Instanz auf
Deinem Rechner geöffnet ist, ist unten dran.

Wenn die Datei nicht offen ist musst natürlich noch kucken ob der
Zugriff auf die Datei möglich ist, sprich sie nicht von jemand anderes
geöffnet wurde oder sonstwie gesperrt ist.

Schwierig wird's falls Du mehrere Dateien mit dem gleichen Namen hast,
denn den Pfad der anderen Instanz kannst Du erst prüfen wenn Du
darauf zugegriffen hast.

Also ganz 100%tig sicher ist das alles nicht, aber vielleicht ein Anfang.

Andreas.

Option Explicit

Private Declare Function FindWindowEx Lib "user32" Alias _
"FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As _
String, ByVal cch As Long) As Long

Function DetectExcel(ByVal FileName As String) As Boolean
'Prüft ob die Datei in einer anderen Instanz geöffnet ist.
Const BufSize = 255
Dim Buf As String
Dim BufLen As Long
Dim hWnd As Long
Dim Caption As String
Dim fs As Object 'FileSystemObject
Set fs = CreateObject("Scripting.FileSystemObject")
'Wir brauchen nur den Dateinamen
FileName = fs.GetFileName(FileName)
'Buf initialisieren
Buf = String(BufSize, Chr(0))
Do
'Suche nach einem Excel-Fenster
hWnd = FindWindowEx(0, hWnd, "XLMAIN", vbNullString)
If hWnd = False Then Exit Do
'Hole den Titel
BufLen = GetWindowText(hWnd, Buf, BufSize)
Caption = Left$(Buf, BufLen)
'Ist es unserer?
If StrComp(Caption, Application.Name & " - " & FileName, _
vbTextCompare) = 0 Then
DetectExcel = True
Exit Function
End If
Loop
End Function

Sub Test()
Dim WB As Workbook, S As Worksheet
Dim FName As String

'Der Dateiname muss der komplette Pfad sein und _
die Datei muss vorhanden sein!
FName = "Z:\Mappe3.xls"

If DetectExcel(FName) Then
'Über die Datei kommen wir an das WorkBook-Object
Set WB = GetObject(FName)

'Einfach man alle Tabellen durchlaufen
For Each S In WB.Sheets
Debug.Print S.Name
Next
End If
End Sub

Ähnliche fragen