Collapse column

Autor Thema: Office 2010: VBA - Object-Variable auf andere Makros übertragen (oder global)  (Gelesen 2151 mal)

Offline Kyriakos

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
  • Office-KnowHow: Experte
  • VBA-KnowHow- : Mittelmäßig
  • Version [Office] : Office 2016
Hallo,

ich arbeite an einem code um per excel vba den IE11 zu öffnen und darin zu arbeiten.

Mit CreateObject("Shell.Application") prüfe ich ob in den shell windows ein IE Fenster geöffnet ist und ob die URL stimmt.
Dafür verwende ich zwei object Variable, oShell und oWin.

Lasse beide in eine Schleife prüfen "For each oWin in oShell.Windows". Beim Fund steigt die For aus.

Das klappt auch. ganz gut. Dieses Makro ist nun für das Einloggen in der Webseite gedacht (Das Einloggen funktioniert auch).

Im nächsten Makro, soll man die Webseite nun bedienen. Jetzt ist hier die Sache dass ich wieder ein Shell Object brauchte und ich die Prüfung "For each..." erneut machen muss.
Meine Frage also, ich möchte dass Excel sich dieses Object "oWin" aus dem Makro1 merkt solange die Arbeitsmappe geöffnet ist und dass diese Variable auch in anderen Makros erkannt wird (ohne dass man immer wieder createobject und die for each Schleife durchspielen muss).

Ist das irgendwie möglich und wenn ja wie?

Hier ist das Makro1 als Beispiel (das oshell und owin habe ich oben im Modul als object deklariert, auch die URL-Strings)

Sub GetIE()

Set oShell = CreateObject("Shell.Application")

For Each oWin In oShell.Windows
 If oWin.Name = "Internet Explorer" And InStr(1, oWin.LocationURL, MeinURL) > 0 Then
   'Dieses Fenster was hier gefunden wird, soll für alle Makros als Variable deklariert werden wenn möglich
  oWin.document.GetElementByID("username").Value = "Benutzername"
  oWin.document.GetElementByID("password").Value = "Passwort"
  oWin.document.GetElementByID("alias").Value = "Organisation"
  oWin.document.all("submit").Click
  Exit For
 End If
Next oWin

Set oShell = Nothing

End Sub

Vielen Dank und Mfg
Kiri
Das Leben kann viel schöner sein mit Excel...

Keine Lösung gefunden? Du kannst Dich gerne an unser erfahrenes Experten-Team wenden und Dein Anliegen in Auftrag geben.
>>> Schnell und einfach ein unverbindliches Angebot anfordern. Per E-Mail an anfrage@excel-inside.de oder per Online-Formular
<<<

!!! Wichtige Information
!!! Dieses Forum steht aus technischen Gründen ab dem 11. September 2019 nur noch im Lesemodus zur Verfügung.
Das NEUE Office-Fragen-Forum kannst du aber unter der gewohnten Domain https://office-fragen.de wie gewohnt nutzen.

- Wir freuen uns auf deinen Besuch im neuen Forum.

Offline maninweb

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1.063
    • Profil anzeigen
    • Excel Formula Translator
  • Office-KnowHow: Experte
  • VBA-KnowHow- : Sehr gut
  • Version [Office] : Office 2016
Antw:Office 2010: VBA - Object-Variable auf andere Makros übertragen (oder global)
« Antwort #1 am: September 30, 2016, 09:15:10 Vormittag »
Hallo,

hier ein einfaches Beispiel. Du kannst die Variable global deklarieren. Wenn Du das machst,
musst Du auch dafür sorgen, dass am Ende aller Deiner Operationen z.B. wenn die Mappe
geschlossen wird, oShell auch wieder freigegeben wird. Demnach..

In ein Modul..

Code: Visual Basic
  1. Public oShell As Object
  2.  
  3. Function GetIEInitialize() As Boolean
  4.  
  5.   If oShell Is Nothing Then
  6.    
  7.     Set oShell = CreateObject("Shell.Application")
  8.    
  9.   End If
  10.  
  11.   GetIEInitialize = Not oShell Is Nothing
  12.  
  13. End Function
  14.  
  15. Sub GetIETerminate()
  16.  
  17.   Set oShell = Nothing
  18.  
  19. End Sub

In einem anderen Modul...

Code: Visual Basic
  1. Sub GetIE_Test1()
  2.  
  3.   If GetIEInitialize Then
  4.  
  5.     MsgBox "OK"
  6.    
  7.   End If
  8.  
  9. End Sub
  10.  
  11. Sub GetIE_Test2()
  12.  
  13.   MsgBox Not oShell Is Nothing
  14.  
  15. End Sub

Wenn Du als erstes (!) GetIE_Test1 aufrufst, wird oShell erzeugt. Beim anschließenden Aufruf von
GetIE_Test2 ist dann oShell noch erhalten.

Unabhängig davon, Du kannst den IE auch direkt als Objekt erzeugen/ansprechen und brauchst
keine Shell dafür. Z.B. hier http://www.excely.com/excel-vba/ie-automation.shtml (Englisch),
nach Excel VBA IE googlen.

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) from 01/2011 - 06/2019
https://de.excel-translator.de :: Online Excel-Formel-Übersetzer :: Alle Übersetzungen der Excel Funktionen & Fehlerwerte

Offline Kyriakos

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
  • Office-KnowHow: Experte
  • VBA-KnowHow- : Mittelmäßig
  • Version [Office] : Office 2016
Antw:Office 2010: VBA - Object-Variable auf andere Makros übertragen (oder global)
« Antwort #2 am: November 04, 2016, 14:54:59 Nachmittag »
Hallo maninweb und danke für die Antwort.

eine Function wäre also meine Lösung.

Ich habe auch den Link zum CreateObject IE angeschaut.

Das war ursprünglich meine erstes Makro, aber dort wird ja jedes mal ein neues IE fenster erzeugt.

Ich möchte aber erst prüfen ob IE offen ist und ob der gewünschte Link auch in irgendein IE Fenster geöffnet ist und dann ggf. ein neues Fenster kreiieren. Wenn aber die gewünschte Seite schon geöffnet ist, soll er einfach das bereits geöffnete Fenster ansprechen.

Ich muss auch sagen ich stehe schon vor einem unbekannten Problem. Wollte nach einiger Zeit mein Makro wieder testen aber es tut sich nichts. Hab aus Neugier noch "debug.print oWin.Name" in die For-Schleife eingegeben und da wird nix angezeigt. Wenn ich "Debug.Print oWin.DocumentURL" eingeben kommt im Direktfenster "Posteingang:Outlook". Woran liegt es jetzt, dass VBA sich irgendwas mit Outlook tut obwohl die If-Anweisung ganz klar heißt "If owin.name = Internet Explorer Then..."

PS: Habe noch "Microsoft Internet Controls" in den Optionen aktiviert. Habs zufälligerweise in Internet gefunden. Kann es daran liegen?

LG
« Letzte Änderung: November 04, 2016, 14:59:40 Nachmittag von Kyriakos »
Das Leben kann viel schöner sein mit Excel...

Offline maninweb

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1.063
    • Profil anzeigen
    • Excel Formula Translator
  • Office-KnowHow: Experte
  • VBA-KnowHow- : Sehr gut
  • Version [Office] : Office 2016
Antw:Office 2010: VBA - Object-Variable auf andere Makros übertragen (oder global)
« Antwort #3 am: November 06, 2016, 10:04:20 Vormittag »
Hallo,

Du könntest versuchen, den Verweis zu entfernen. Wenn's klappt (über Extras/Verweise), brauchst Du ihn auch nicht.
Ansonsten hast Du irgendwo im Code oder einer UserForm etwas drin, was darauf referenziert.

Statt CreateObject könntest Du GetObject verwenden und prüfen, ob Dir ein solches Objekt etwas anderes als Nothing
zurückgibt. Wenn Nein, dann wäre der IE offen. Was mich betrifft, programmiere ich selber nie mit dem IE, weshalb ich
für die weitere Beantwortung der Frage (den Tab finden, der die Seite enthält) selbst recherchieren müsste.

Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) from 01/2011 - 06/2019
https://de.excel-translator.de :: Online Excel-Formel-Übersetzer :: Alle Übersetzungen der Excel Funktionen & Fehlerwerte

Wenn du dich noch intensiver mit Excel beschäftigen möchtest, dann empfiehlt sich ein Online-Kurs,
in dem du sehr viel über Excel erfährst und das gelernte umgehend in der Praxis anwenden kannst.