2008-11-13 18 views
8

Ich brauche Hilfe inIterieren nicht registrierten Add-Ins (XLA)

  • herauszufinden, wie durch aktuell geöffneten Excel-Add-In-Dateien (XLA) iterieren, die in Excel nicht registriert sind, unter Verwendung der Tools > Add-ins Menüpfad.
  • genauer, ich interessiere mich für jede Arbeitsmappe, die nicht im Add-In-Dialogfeld angezeigt wird, aber ThisWorkbook.IsAddin = True hat.

Aufzeigen der Ausgabe:

eine Schleife durch Arbeitsmappe Versuch wie folgt Arbeitsmappe nicht bekommen mit .AddIn = True:

Dim book As Excel.Workbook 

For Each book In Application.Workbooks 
    Debug.Print book.Name 
Next book 

Looping durch Add-Ins nicht-Add-Ins nicht erhalten, sind nicht registriert:

Dim addin As Excel.AddIn 

For Each addin In Application.AddIns 
    Debug.Print addin.Name 
Next addin 

Looping durch die VBProjects-Sammlung funktioniert, aber nur, wenn der Benutzer speziell hat größte Zugriff auf das Visual Basic-Projekt in den Makro-Sicherheitseinstellungen - die selten ist:

Dim vbproj As Object 

For Each vbproj In Application.VBE.VBProjects 
    Debug.Print vbproj.Filename 
Next vbproj 

Wenn jedoch der Name der Arbeitsmappe bekannt ist, kann die Arbeitsmappe direkt unabhängig von referenziert werden, ob es eine Add-in oder nicht:

Dim book As Excel.Workbook 
Set book = Application.Workbooks("add-in.xla") 

Aber wie zum Teufel Bezug auf diese Arbeitsmappe zu erhalten, wenn der Name nicht bekannt ist, und Makrosicherheitseinstellungen des Benutzers können nicht geltend gemacht werden?

Antwort

7

Ab Office 2010 gibt es eine neue Kollektion .AddIns2 die die gleiche wie .AddIns ist, sondern umfasst auch die unregistrierte .XLA Plug-Ins.

Dim a As AddIn 
Dim w As Workbook 

On Error Resume Next 
With Application 
    For Each a In .AddIns2 
     If LCase(Right(a.name, 4)) = ".xla" Then 
      Set w = Nothing 
      Set w = .Workbooks(a.name) 
      If w Is Nothing Then 
       Set w = .Workbooks.Open(a.FullName) 
      End If 
     End If 
    Next 
End With 
+1

Danke! Das wäre vor 4 Jahren wirklich nützlich gewesen: P Akzeptierte deine Antwort, weil die Antwort, die ich angenommen hatte, einfach zu hackig war. – jevakallio

+2

Ja, ich merkte, dass es ein bisschen spät war. :-) Aber ich lief auf das gleiche Problem und dachte, es könnte jemand anderem helfen. –

0

Ich bin immer noch auf der Suche nach einer vernünftigen Lösung für dieses Problem, aber vorläufig scheint das Lesen der Fenstertexte aller Arbeitsmappenfenster eine Sammlung aller geöffneten Arbeitsmappen, Add-Ins oder nicht, zu enthalten:

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 GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 

Public Function GetAllOpenWorkbooks() As Collection 

'Retrieves a collection of all open workbooks and add-ins. 

Const EXCEL_APPLICATION_WINDOW As String = "XLDESK" 
Const EXCEL_WORKBOOK_WINDOW  As String = "EXCEL7" 

Dim hWnd    As Long 
Dim hWndExcel   As Long 
Dim contentLength  As Long 
Dim buffer    As String 
Dim bookName   As String 
Dim books    As Collection 

Set books = New Collection 

'Find the main Excel window 
hWndExcel = FindWindowEx(Application.hWnd, 0&, EXCEL_APPLICATION_WINDOW, vbNullString) 

Do 

    'Find next window 
    hWnd = FindWindowEx(hWndExcel, hWnd, vbNullString, vbNullString) 

    If hWnd Then 

     'Create a string buffer for 100 chars 
     buffer = String$(100, Chr$(0)) 

     'Get the window class name 
     contentLength = GetClassName(hWnd, buffer, 100) 

     'If the window found is a workbook window 
     If Left$(buffer, contentLength) = EXCEL_WORKBOOK_WINDOW Then 

      'Recreate the buffer 
      buffer = String$(100, Chr$(0)) 

      'Get the window text 
      contentLength = GetWindowText(hWnd, buffer, 100) 

      'If the window text was returned, get the workbook and add it to the collection 
      If contentLength Then 
       bookName = Left$(buffer, contentLength) 
       books.Add Excel.Application.Workbooks(bookName), bookName 
      End If 

     End If 

    End If 

Loop While hWnd 

'Return the collection 
Set GetAllOpenWorkbooks = books 

End Function 
0

Was dazu:

Public Sub ListAddins() 

Dim ai As AddIn 

    For Each ai In Application.AddIns 
     If Not ai.Installed Then 
      Debug.Print ai.Application, ai.Parent, ai.Name, ai.FullName 
     End If 
    Next 

End Sub 

Jede Nutzung?

0

Verwenden Sie = DOCUMENTS, eine Excel4-Makrofunktion.

Dim Docs As Variant 
Docs = Application.Evaluate("documents(2)") 

Hier ist die Dokumentation für sie (erhältlich here):

DOKUMENTE
Returns, als horizontale Anordnung in Textform, die Namen der angegebenen geöffneten Arbeitsmappen in alphabetischer Reihenfolge. Verwenden Sie DOKUMENTE, um die Namen geöffneter Arbeitsmappen abzurufen, die in anderen Funktionen verwendet werden, die geöffnete Arbeitsmappen bearbeiten.

Syntax
DOCUMENTS (bei Typ, match_text)
bei Typ ist eine Zahl, die angibt, ob Arbeitsbücher in der Anordnung der Arbeitsbücher umfassen Add-in gemäß der folgenden Tabelle.

Type_num  Returns 
1 or omitted Names of all open workbooks except add-in workbooks 
2    Names of add-in workbooks only 
3    Names of all open workbooks 

Match_text gibt die Arbeitsmappen an, deren Namen zurückgegeben werden sollen, und kann Platzhalterzeichen enthalten. Wenn match_text weggelassen wird, gibt DOCUMENTS die Namen aller geöffneten Arbeitsmappen zurück.

+0

Leider ist diese Funktion nicht mehr funktioniert in modernen Versionen von Excel (zumindest im Jahr 2010, obwohl ich glaube, Microsoft von mindestens Excel 2007-Unterstützung für Excel4 Funktionen entfernt). – GlennFromIowa

0

Ist das Durchlaufen der Registrierung eine Möglichkeit? Ich weiß, dass Sie damit keinen Überblick darüber erhalten, was Ihre Instanz von Excel verwendet, sondern was eine neue Instanz verwenden würde - aber je nachdem, für was Sie sie brauchen, ist sie vielleicht gut genug.

Die entsprechenden Tasten sind:

'Active add-ins are in values called OPEN* 
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Options 

'Inactive add-ins are in values of their full path 
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Add-in Manager 
1

Ich habe mit addins hat Probleme, die installiert werden (und im VBE) nicht über Benutzer zur Verfügung steht Addin auf Exel 2013 (in einer Arbeitsumgebung).

Basteln mit the solution von Chris C gab einen guten Workaround.

Dim a As AddIn 
Dim wb As Workbook 

On Error Resume Next 
With Application 
    .DisplayAlerts = False 
     For Each a In .AddIns2 
     Debug.Print a.Name, a.Installed 
      If LCase(Right$(a.Name, 4)) = ".xla" Or LCase(Right$(a.Name, 5)) Like ".xla*" Then 
       Set wb = Nothing 
       Set wb = .Workbooks(a.Name) 
       wb.Close False 
       Set wb = .Workbooks.Open(a.FullName) 
      End If 
     Next 
    .DisplayAlerts = True 
End With