excel अपंजीकृत अन्तर्निहित ऐड-इन्स(.xla)




vba excel-vba (5)

मुझे इसमें मदद की ज़रूरत है

  • वर्तमान में खुले एक्सेल ऐड-इन फाइलें (.एक्सला) के माध्यम से दोहराव कैसे करना है, जो Tools > Add-ins मेनू पथ का उपयोग करके Excel में पंजीकृत नहीं हैं।
  • अधिक विशेष रूप से, मुझे कोई कार्यपुस्तिका में दिलचस्पी है जो ऐड-इन संवाद में प्रकट नहीं होता है, लेकिन यह ThisWorkbook.IsAddin = True . ThisWorkbook.IsAddin = True

इस समस्या का प्रदर्शन:

कार्यपुस्तिकाओं के माध्यम से पाश की कोशिश कर रहा है, इस प्रकार कार्यपुस्तिकाएं नहीं मिलती हैं। .AddIn = True :

Dim book As Excel.Workbook

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

ऐड-इन्स के माध्यम से लुपिंग ऐड-इन्स नहीं मिलती है जो पंजीकृत नहीं हैं:

Dim addin As Excel.AddIn

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

VBProjects संग्रह कार्यों के माध्यम से लुकिंग, लेकिन केवल तभी जब उपयोगकर्ता मैक्रो सुरक्षा सेटिंग्स में विज़ुअल बेसिक प्रोजेक्ट के लिए विशेष रूप से भरोसेमंद है - जो कि शायद ही कभी है:

Dim vbproj As Object

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

हालांकि, अगर कार्यपुस्तिका का नाम ज्ञात है, तो कार्यपुस्तिका को सीधे संदर्भित किया जा सकता है चाहे वह ऐड-इन या नहीं है:

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

लेकिन कैसे इस कार्यपुस्तिका का संदर्भ प्राप्त करने के लिए हेक अगर नाम नहीं जाना जाता है, और उपयोगकर्ता की मैक्रो सुरक्षा सेटिंग्स पर भरोसा नहीं किया जा सकता है?


रजिस्ट्री के माध्यम से एक संभावना है? मुझे पता है कि यह आपको एक्सेल के आपके आवृत्ति का प्रयोग करने का एक स्नैपशॉट नहीं देता है, लेकिन एक नया उदाहरण क्या उपयोग करेगा - लेकिन इसकी आवश्यकता पर निर्भर करता है कि यह काफी अच्छा हो सकता है

संबंधित कुंजी हैं:

'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

मेरे पास ऐडिन के साथ समस्याएं हैं जो इंस्टॉल किए गए (और वीबीई में) उपयोगकर्ता के Addin एक्सल 2013 (एक कार्य वातावरण में) के माध्यम से उपलब्ध नहीं हैं।

क्रिस सी से समाधान के साथ छेड़छाड़ का एक अच्छा समाधान दिया।

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

इस बारे में क्या:

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

कोई भी उपयोग?


Office 2010 के अनुसार, एक नया संग्रह है। AddIns2 जो कि .addins के समान है लेकिन इसमें अपंजीकृत भी शामिल हैं। XLA प्लग-इन

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

मैं अभी भी इस समस्या के लिए समझदार समाधान की तलाश में हूं, लेकिन समय के लिए लगता है कि सभी कार्यपुस्तिका खिड़कियों के विंडो ग्रंथों को पढ़ना सभी खुले कार्यपुस्तिकाओं का एक संग्रह देता है, ऐड-इन या नहीं:

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