PDA

Vollständige Version anzeigen : Arbeitsmappe im Hintergrund öffnen


Sturmovik
02.02.2008, 14:32
Hallo

ich möchte aus dem VBA-Code eine andere Arbeitsmappe öffnen, um dort diverse Daten zu suchen bzw Arbeitsblätter in die aktuelle Arbeitsmappe zu kopieren.

Bisher mache ich das mit workbooks.open usw

Der Anwender soll aber von diesem Vorgang nichts mitbekommen, also auch nicht in der Taskleiste sehen, daß kurzzeitig eine andere datei offen ist.

Geht das?

jinx
02.02.2008, 15:00
<font size="2" face="Century Gothic">Moin, Sturmovik,

über CreateObject eine neue Instanz von Excel öffnen - diese ist standardmäßig ausgeblendet:

Dim xlNeu As Object
Dim wbNeu As Workbook
Set xlNeu = CreateObject("Excel.Application")
'wird sichtbar gemacht
xlNeu.Visible = True
'Mappe öffnen
Set wbNeu = xlNeu.Workbooks.Open("C:\Temp\test1.xls")
'Berechnungen mit Mappe durchführen
wbNeu.Close False 'Schließen ohne Änderung, bei Speichern True verwenden
Set wbNeu = Nothing
xlNeu.Quit
Set xlNeu = Nothing</font>

Sturmovik
02.02.2008, 15:27
Danke, das funktioniert.

Allerdings scheitere ich daran, ein ganzes Arbeitsblatt zu kopieren
wbNeu.Sheets("xxx").Copy after:=ThisWorkbook.Worksheets(Worksheets.Count)

jinx
02.02.2008, 15:45
<font size="2" face="Century Gothic">Moin, Sturmovik,

mein Fehler beim Lesen, Kopieren von Tabellen ist nicht möglich, aber man kann die Bildschirmaktualisierung ausschalten - oder aber die Bereiche der Tabelle kopieren... ;)</font>

Sturmovik
02.02.2008, 16:25
Danke jinx, da werd ich halt die nötigen Blätter neu anlegen und den Inhalt reinkopieren müssen.

Bis später

Sturmovik

Sturmovik
05.02.2008, 11:20
Hi Leute, Hab nochmal ne Frage dazu.

während der Code läuft, kann ich die Arbeitsmappe in der 2. Excel-Instanz wie geplant als wbneu ansprechen. Allerdings soll diese Arbeitsmappe für spätere Anwendung offenbleiben. Der Code wird zwischendurch gestoppt.

Wie kann ich in einer späteren Prozedur diese zweite Excel-Instanz bzw die Arbeitsmappe darin ansprechen?

Danke für eure Hilfe
Sturmovik

chris-kaiser
05.02.2008, 11:42
hiho

z.B

Dim appExcel
Dim objMappeV
Sub WorkbookOpen()
Set appExcel = CreateObject("Excel.Application")
vFile = "C:\xxx.xls"
Set objMappeV = appExcel.Workbooks.Open(vFile)
End Sub

Sub total()
MsgBox objMappeV.Name
objMappeV.Close
Set appExcel = Nothing
End Sub

Sturmovik
05.02.2008, 12:09
DAnke, Chris.

Soweit war ich im Prinzip auch schon...
Das funktioniert leider nur, wenn die zweite Prozedur im selben Modul liegt, sonst gibts immer "Variable nicht definiert".
(hab auch schon appExcel und objMappeV als Public definiert, hilft nicht)

Das ganze ist ein recht großes Projekt, in dem ich zigmal auf die Datenbasis zugreifen muß, ich will aber nicht den gesamten Code in "DieseArbeitsmappe" legen

Wäre schön, wenn es doch noch eine Lösung gibt, ansonsten bleib ich bei der herkömmlichen, sichtbaren Variante.

mfg Sturmovik

chris-kaiser
05.02.2008, 12:47
hiho

versuche es einmal so


public appExcel
Public objMappeV As Object
Sub WorkbookOpen()
Set appExcel = CreateObject("Excel.Application")
vFile = "C:\xxx.xls"
Set objMappeV = appExcel.Workbooks.Open(vFile)
End Sub
'anderes Modul
Sub total()
MsgBox objMappeV.Name
objMappeV.Close
Set appExcel = Nothing
End Sub

nun müsste es auch in einem anderen Modul gehen

Sturmovik
05.02.2008, 13:16
geht leider nicht.

Wenn "Option explicit" überm Modul steht: Variable (objmappeV) nicht definiert
Wenn ich obiges deaktiviere, dann "Objekt erforderlich" (Fehler 424)

Bei den Deklarationen hab ich auch schon probiert:
Public appExcel as Object
Public objMappeV As Object bzw as Workbook

funzt alles nicht

Gibts irgendeine Deklarationsanweisung, die die Variable beibehält, wenn der Code beendet ist? Ich befürchte das gibts gar nicht.

mfg Sturmovik

chris-kaiser
05.02.2008, 13:42
hiho

hier die Demo bei mir geht es?

auf LW C:

sollte eine Datei sein die xxx heißt!

Sturmovik
05.02.2008, 14:09
Seltsam... Deine Datei funktioniert (nach umbau auf D:\xxx.xlsx) bestens, dabei ist der Code ziemlich identisch...

Edit: es lag wohl an der Definition der Excel-Instanz als "Application", das fehlte bei den bisherigen Lösungen

Danke dir, ich werd das mal einbauen. Wenn ich wieder mal feststecke, weiß ich ja wo ich dich finde ;)

mfg Sturmovik

Sturmovik
07.02.2008, 13:37
Hi, ich bins nochmal mit einem kleinen Problem(, welches vielleicht gar keins ist).

Diese Datendatei liegt im Netzwerk und kann von einigen Nutzern mit Schreibrechten genutzt werden. Allerdings ist ja maximal eine Instanz mit Schreibzugriff möglich, alle andern bekommen nur Lesezugriff.

Nun meine Frage: kann ich vor dem öffnen der Datendatei feststellen, ob ein anderer diese Datei mit Vollzugriff nutzt, um entsprechend zu reagieren?

mfg Sturmovik

jinx
07.02.2008, 13:45
<font size="2" face="Century Gothic">Moin, Sturmovik,

Zugriff auf die Datei auslösen und auswerten - Prüfung, ob eine Datei im Netz bereits geöffnet ist (http://www.herber.de/mailing/164202h.htm) sollte als Ansatz helfen...</font>

Sturmovik
07.02.2008, 13:48
Danke, ich schau mir das mal an!

Alles klar, per Prüfen durch Fehlerprovokation :) . Fast genau das was ich gesucht hab...

mfg Sturmovik

chris-kaiser
07.02.2008, 15:26
Hallo Sturmovik

sehen die User diese Datei und ändern diese oder liest Du nur Daten aus

falls wirklich nur Daten ausgelesen werden,einfach die Datenmappe von wo die aktuellen Daten ausgelesen werden freigegeben. (Arbeitsappe freigeben-> mehrere Benutzer zulassen)

dann kommt keine Meldung "Datei wird gerade bearbeitet usw.!

Gruß
Chris

Sturmovik
09.02.2008, 14:31
Hallo Chris,

sowohl als auch. Auf einem Rechner soll nur gelesen & ausgewertet werden, ein anderer muß definitiv Schreiben können, da vor allem dort die Daten herkommen.

mfg Sturmovik