miniversum
Goto Top

Per VBA Code Verweis im VBA-Editor in Excel kontrollieren und ggf. hinzufügen

Hallo
Ich schreibe hier ein Programm unter VBA in Excel 2003.
Dieses Programm benötigt eine externe dll die man im VBA Editor über "Extras" -> "Verweise..." hinzufügen und aktivieren muß.
Da diese dll standardmäsig nicht hinzugefügt ist würde ich gerne beim Start des Programms dies überprüfen und ggf. diese dll bei den Verweisen hinzufügen. Eben das was man manuell tun würde per VBA Code realisieren.
Leider funktioniert dies nicht. Ich bin bei meiner Suche schon auf die Möglichkeit gestosen das vielleicht so zu machen das ich mit:
Application.VBE.VBProjects.Item("Projektname").References.Count
dann alle Verweise durchgehe und schaue ob diese Aktiviert sind.
Fals nicht würde ich die dann per
Application.VBE.VBProjects.Item("Projektname").References.AddFromFile "c:\WINDOWS\system32\meine.dll"
hinzufügen.
Ich erghalte aber schon nach der ersten Zeile die fehlermeldung das die Methode VBE für das Objekt _Application zu einem Fehler führt.

Wie bekomem ich das also hin das das so funktioniert bzw. gibt es andere Möglichkeiten meine Idee umzusetzen? Der Pfad meiner dll ist immer der gleiche.

Gruß
miniversum

Content-Key: 84847

Url: https://administrator.de/contentid/84847

Printed on: September 22, 2023 at 17:09 o'clock

Member: misterdemeanor
misterdemeanor Apr 07, 2008 at 12:38:30 (UTC)
Goto Top
Hallo miniversum,

leider konnte ich Deinen Fehler nicht reproduzieren.
  • Hast Du das Office SP3 installiert?
  • Unter Extras|Makro|Sicherheit... unter dem Reiter "Vertrauenswürdige Herausgeber" die Option "Zugriff auf Visual Basic Projekt vertrauen" gesetzt?
  • Ist der "Projektname" in Deinem Code korrekt? Standardmäßig heißt das Projekt "VBAProject".

Leichter erhältst Du den Verweis auf die Reference-Auflistung des VBA-Projektes der Arbeitsmappe über
ThisWorkbook.VBProject.References

BTW: mit
Application.VBE.VBProjects.Item("Projektname").References.Count
bekommst Du halt nur die Anzahl der Referenzen...prüfen tust Du damit nichts.

Prüfen könntest Du z.B. indem Du versuchst eine bestimmte Referenz als Reference-Objekt aus der References-Auflistung zu referenzieren *puh :
Dim ref As VBIDE.Reference
    Set ref = ThisWorkbook.VBProject.References.Item("XYZ")  
was dann den Laufzeitfehler 9 auslöst wenn "XYZ" nicht als Referenz im Pojekt vorliegt. Mit
Dim ref As VBIDE.Reference
    Set ref = ThisWorkbook.VBProject.References.Item("XYZ").IsBroken  
könntest Du dann weiterhin überprüfen ob zwar die Referenz vorhanden ist, aber "kaputt". Das ist dann der Fall wenn eine Referenz anhand der GUID nicht in der Registry gefunden werden kann (COM-Komponente nicht in der original gesetzten Version au dem Rechner vorhanden/registriert).

Am besten Du läufst einfach alle Referenzen durch und siehst dann weiter:
On Error GoTo ErrHandler
  Dim ref As VBIDE.Reference
  Dim XYZISINREFERENCES As Boolean
  Dim RefPathXYZ As String
  XYZISINREFERENCES = False

    For Each ref In ThisWorkbook.VBProject.References
      Select Case ref.Name 'Besser wäre anhand der GUID zu prüfen  
        Case "XYZ"  
          XYZISINREFERENCES = True
          If ref.IsBroken Then
            RefPathXYZ = "Pfad zu Deiner Komponente"  
            'Besser vorher prüfen ob COM auf Computer, ggfls. installieren/registrieren  
              'Am besten in Funktion auslagern  
            ThisWorkbook.VBProject.References.AddFromFile FullPath
          End If
      End Select
    Next ref
    
    If Not XYZISINREFERENCES Then
      'Referenz war überhaupt nicht gesetzt  
        'Besser vorher prüfen ob COM auf Computer, ggfls. installieren/registrieren  
          'Am besten in Funktion auslagern (s.o.)  
      ThisWorkbook.VBProject.References.AddFromFile RefPathXYZ
    End If
ErrHandler:
  Select Case Err.Number
    Case 0 'Erfolgreich  
    Case 47 'Fehler beim laden einer DLL(Versuch Referenz hinzuzufügen)  
      'Installieren/registrieren und in Projekt hinzufügen (am besten auch in Funktion ausgelagert)  
    Case Else
      'Standard Error Handler aufrufen bzw. auf Fehler lokal reagieren  
  End Select

Hoffe das ich Dir mit diesm Ansatz etwas weiterhelfen konnte.

BG, Felix -mrdemeanor- Bahrenburg
Member: miniversum
miniversum Apr 07, 2008 at 16:08:17 (UTC)
Goto Top
*sp3 ist installiert.
*diese Option war nicht an, aber manuel gehts ja dennoch auch ohne?
*ja der projektname stimmt.

Mit ThisWorkbook kann ich nicht arbeiten weil ich nicht die Verweise des aktuellen Workbook kontrollieren will sondern die eines add-Ins was als xla Datei hinzugefügt wird.
Ich beschreibs mal ausführlicher:
Auf dem PC läuft ein add-in was ich geschrieben habe. Dieses Add-in benötigt verschiedene activeX Komponenten und dlls. Das Ganze funktioniert auch wunderbar, allerdings sind manuelle Einstellungen notwendig. Vor kurzem war das der Fall das ich nicht da war und der PC aufdem das ganze lief "abschmierte" darum muße alles auf einen andern PC aufgespielt und eingerichtet werden, was die Kollegen unternahmen.
Draufkopieren und als add-in hinzufügen ging noch. Aber welche Verweise gebraucht wurden und so.. da mußte ich dann extra hinkommen. Drum bin ich jetzt dabei diese ganzen manuellen Dinge automatisch durchführen zu lassen damit es beim nächsten mal besser geht.

Nun weiter:
mirist klar das ich mit
Application.VBE.VBProjects.Item("Projektname").References.Count
nur die anzahl der referenzen bekomme. der nächste Schritt wäre ja wie geschrieben dan gewesen das ganze in einer schleife durchzugehen udn jede Referenz zu prüfen ob sie die gesuchte ist.
Da die dll nicht registriert werden kann (kommt ne Fehlermeldung) sondern als Verweis eingebunden werden muss hab ich also keine andere Möglichkeit.
Member: misterdemeanor
misterdemeanor Apr 07, 2008 at 21:00:34 (UTC)
Goto Top
Hallo miniversum,

also verstehe ich das jetzt richtig? *g

  1. Du hast ein Add-In welches selbst eine Referenz auf eine dll benötigt
  2. Nun willst Du in irgendeiner Arbeitsmappe dieses Add-In verwenden
  3. Aus dieser Arbeitsmappe heraus willst Du auf die Referenzen des Add-Ins zugreifen um besagte unregistrierbare dll hinzuzufügen

Wenn dem so ist wäre es für mich logischer diese Referenz beim Laden des Add-Ins selbst zu überprüfen und ggfls. zu setzen. Also im Workbook_Open Event des ThisWorkbook´s im Add-In.
Möglich wäre dies auch wenn das Add-In "installiert" wird, also unter (Excel)Extras|AddIns hinzugefügt wird: Workbook_AddinInstall.

Mit ThisWorkbook kann ich nicht arbeiten weil ich nicht die Verweise des aktuellen Workbook
kontrollieren will sondern die eines add-Ins was als xla Datei hinzugefügt wird.
innerhalb des Add-Ins kannst Du das ja.

Aber zurüch zu Deinem eigtl. Problem: Leider kriege ich es einfach nicht fertig den Fehler zu reproduzieren! Die in Deinem ersten Post beschriebene Zuweisung der neuen Referenz funktioniert bei mir tadellos.
Vllt. einfach mal unter (Excel)Extras-AddIns Dein Add-In rausnehmen, alle Excel Instanzen beenden, neu starten, Add-In neu setzen...


BG, Felix -misterdemeanor-
Member: miniversum
miniversum Apr 08, 2008 at 15:48:24 (UTC)
Goto Top
Danke für die Hilfe.
Inzwischen habe ich das alles nochmal auf einem neuen "nackten" Test-PC neu traufgemacht und dort geht es... Keine ahnugn was die da gemacht hatten als sie es draufgespielt haben.