2008-11-13 36 views
8

Şu anda açık Excel eklentisi dosyalar arasında yineleme nasıl bulmaktanyineleme kayıtsız eklentiler (.xla)

  • yardıma ihtiyaç kullanarak Excel'de kayıtlı olmayan (.xla)Tools > Add-ins menü yolu.
  • daha spesifik olarak, Add-In iletişim kutusunda görünmeyen, ancak ThisWorkbook.IsAddin = True sahip olan çalışma kitabıyla ilgileniyorum.

    Dim book As Excel.Workbook 
    
    For Each book In Application.Workbooks 
        Debug.Print book.Name 
    Next book 
    

    olan eklentileri almaz eklentilerin genelinde döngü: .AddIn = True ile çalışma kitaplarını almaz şöyle çalışma kitapları arasında döngü çalışılıyor

    :

sorunu Demonstrating kayıtlı değil:

Dim addin As Excel.AddIn 

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

VBProjects toplama işlemleriyle döngü yapmak, ancak yalnızca kullanıcı özellikle varsa Çalışma kitabının adı biliniyorsa

Dim vbproj As Object 

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

Ancak, çalışma kitabı olursa olsun bir eklenti olup olmadığına bakılmaksızın doğrudan başvurulabilir: nadiren - Makro Güvenliği ayarlarında Visual Basic Projesi güvenilir erişim ya da değil:

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

Ama maalesef adı bilinmiyorsa, bu çalışma kitabına atıfta almak ve nasıl kullanıcının makro güvenlik ayarları dayanıyordu olamaz?

cevap

7

Office 2010 tarihi itibariyle orada .AddIns aynı olan yeni bir koleksiyon .AddIns2 ama aynı zamanda kayıt dışı .XLA eklentileri içerir.

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

Teşekkürler! Bu 4 yıl önce gerçekten yararlı olurdu: P Cevabınızı kabul ettim, çünkü kabul ettiğim cevap çok haylazdı. – jevakallio

+2

Evet, biraz geç olduğunu anladım. :-) Ama aynı soruna girdim ve başka birine yardımcı olabileceğini düşündüm. –

0

Hala bu sorun için akılcı bir çözüm arayışındayım, ancak şu anda tüm çalışma kitabı pencerelerinin pencere metinlerini okumak, tüm açık çalışma kitaplarının bir koleksiyonunu ekler gibi görünüyor:

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 

Herhangi kullanımı: bu konuda

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

ne olacak?

0

= Bir Excel4 makro işlevi olan = BELGELER kullanın.

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

İşte bunun için dokümantasyon (mevcut here) var: metin şeklinde yatay bir dizi olarak,

BELGELER
İade, alfabetik sırayla belirtilen açık çalışma kitaplarının adları. Açık çalışma kitaplarını işleyen diğer işlevlerde kullanılacak açık çalışma kitaplarının adlarını almak için BELGELER kullanın.

sözdizimi
BELGELER (type_num, match_text)
Type_num eklenti kitaplarını çalışma kitaplarının dizisinde, aşağıdaki tabloya göre dahil olmadığını belirten bir sayıdır.

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, döndürülen ve döndürülen karakterleri içeren çalışma kitaplarını belirtir. Match_text atlanırsa, DOCUMENTS tüm açık çalışma kitaplarının adlarını döndürür.

+0

Ne yazık ki, bu işlev artık Excel'in modern sürümlerinde (en azından Excel 2007'de Excel4 işlevleri için en az Excel 2007'yi desteklemiş olsa da, en azından 2010'da) çalışmamaktadır. – GlennFromIowa

0

Kayıt defterinde bir olasılık var mı? Bunun sizin Excel örneğinizin kullandığı şeyin bir anlık görüntüsünü vermediğini biliyorum, ancak yeni bir örneğin kullanacağı şey - ama bunun için ihtiyacınız olan şeye bağlı olarak yeterince iyi olabilir.

ilgili tuşlar şunlardır:

'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

ben yüklü (ve VBE içinde) olan eklentileri ile sorunları oldu (bir çalışma ortamında) kullanıcının Addin Exel 2013 tarihinde yoluyla ulaşılabilir olmaması.

Chris C'den the solution ile tinkering iyi bir geçici çözüm verdi.

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