Severus schrieb am 29.09.2010 08:31:47:
 
 Holger schrieb am 24.09.2010 17:30:32:
 
 Severus schrieb am 23.09.2010 23:38:51:
 
 Johannes Leikel schrieb am 23.09.2010 21:41:21:
 
 Hallo zusammen,
 
 mit meinem VBA-Code möchte ich eine Referenz laden (eine weitere Datei 
 die zusätzlichen VBA-Code enthält).
 
 Direkt nach dem laden möchte ich eine Funktion aus der neuen Referenz 
 mittels "CALL" aufrufen.
 
 Leider erscheint dann beim CALL-Aufruf der Prozedur stets die Meldung 
 "objekt nicht gefunden". Die Referenz wurde aber vollständig geladen.
 
 Wenn ich meine Prozedur ein zweites mal starte funktioniert das CALL ohne 
 Probleme. Hier mein Code:
 
 --- schnipp --
 
 ' Option Explicit ist deaktiviert da ansonsten Fehlermeldungen auftreten.
 Sub AutoNew()
      On Error GoTo Errorhandling
      Dim strUserName As String, strRefpath, myref As Reference, tf As
 Boolean
      Dim docApp As New Word.Application
 
      strRefpath = Environ("userprofile") &
 "\Anwendungsdaten\Microsoft\Word\STARTUP\MeineVorlage.dot"
 
      strUserName = LCase(Environ("Username"))
      For Each myref In VBE.ActiveVBProject.References
          If myref.FullPath = strRefpath Then
              tf = True
              Exit For
          End If
      Next myref
      If tf = False Then
 
 ' Hier wird die Referenz geladen die weiter unten
 ' per CALL aufgerufen werden soll.
              VBE.ActiveVBProject.References.AddFromFile (strRefpath)
 
       End If
 
 ' Dieses CALL schlägt beim ERSTEN AUFRUF fehl ("Objekt nicht gefunden").
 ' Der Projektname ist der name der zuvor aktivierten Referenz
      Call MyProjektname.modulname.meineProzedur(strUserName)
 
 
 
 
 Exit Sub
      MsgBox "Fehler beim starten von AutoNew, " & Err.Description
 End Sub
 
 --- schnapp --
 
 Ich verwende Word 2007 unter Windows XP.
 Was mache ich falsch? 
 
 Grüße,
 Johannes
 
 
 Hi Johannes,
 
 einen wirklichen Fehler kann ich auch nicht finden. Immerhin versuch mal
 VBE.ActiveVBProject.References.AddFromFile strRefpath:DoEvents
 modulname.meineProzedur strUserName
 
 Weitere Möglichkeit:
   Do
      For Each myref In VBE.ActiveVBProject.References
          If myref.FullPath = strRefpath Then
              tf = True
              Exit For
          End If
      Next myref
      If tf = False Then
         VBE.ActiveVBProject.References.AddFromFile strRefpath:DoEvents
      End If
   Loop Until tf = True
 
 
 Näheres kann ich ohne eine Mustermappe nicht sagen.
 
 Severus
 
 
 Hallo Johannes,
 ich kenne ein ähnliches Problem, wenn man ein anderes Programm nur an der Oberfläche mit Shell, AppActivate und SendKey anpacken kann. Auch wenn Wait richtig eingestellt ist, kann es zu unerwarteten Fehlern kommen, weil der nächste Programmschritt bereits ausgeführt wird, wenn das aufgerufene Programm noch nicht ganz fertig ist. Dieser Fehler tritt zufällig, also nicht immer auf.
 Deshalb vermute ich, dass die Referenz im Gegensatz zu deiner Annahme doch noch nicht vollständig geladen ist, wenn der Call-Befehl ausgeführt werden soll. Ich habe in diesen kritischen Bereichen  das Problem gelöst, indem ich dem PC 1/20 bis 1/10 sec Zeit lasse. Füge also vor dem Call-Befehl z.B.
 t=timer
 do until timer>t+.05 'oder zB .1
 doevents 'optional
 loop
 ein.
 Ich würde mich über eine Rückmeldung freuen, da ich, wie geschrieben, selbst vor dem Problem stehe.
 Gruß
 Holger
 
 
 Hi,
 was mir noch aufgefallen ist:
 Von wo aus (welche Applikation) rufst Du diesen Code eigentlich auf? Aus Word?
 Warum dann
 Dim docApp As New Word.Application?
 Wenn aus Excel oder so dann brauchst Du natürlich auch eine Referenz zur Word .olb.
 Severus
 
 
 Hallo Severus,
 ich kann mir nicht vorstellen, dass eine Verweisangabe fehlt, weil bei weiteren Durchläufen des Programms der Fehler nicht wieder auftritt. 
 Ich steuere für bestimmte Vorhaben u.a. C++-Programme, deren Quelltexte mir nicht vorliegen, über deren Oberfläche. Da gibt es Funktionen, die etwas Zeit benötigen. Schiebt man dann zu schnell z.B. einen SendKey-Befehl hinterher, kommt es zu Fehlern oder zu unterwarteten Reaktionen dieser Programme. 
 Je nach dem, welchen Verweis Johannes einrichten will und woher er gelasden wird (.exe, .dll), kann ich mit vorstellen, dass ebenfalls der nächste Programmschitt ausgeführt wird, bevor das Laden beendet ist. Dann wird beim ersten Durchlauf ein Fehler entstehen, bei den weiteren aber nicht. Das ist genau die Beobachtung. Deshalb halte ich meinen o.a. Ansatz für zielführend.
 Vielleicht hat Johannes ja irgendwann einmal die Güte, eine Rückmeldung auf unsere Einlassungen zu geben.
 Gruß
 Holger     |