Add-in ของ Excel ไม่โหลดเมื่อเปิด Excel จาก VBA


2

ฉันใช้ excel reg-ex add-inและทำงานได้ดีปัญหาเดียวที่มันไม่โหลดเมื่อ excel เริ่มต้นโดย VBA

ฉันเป็นมาโครใน word ในการรวบรวมข้อมูลบางอย่างใน Word และคัดลอกไปยัง excel อันนี้เริ่ม excel ผลลัพธ์ที่ได้ แต่ฉันต้องรีสตาร์ท excel เพื่อให้สามารถใช้ Add-in ได้ (เปิดใช้งานในตัวเลือก แค่ไม่โหลด)

ฉันลองมาโครอีกอัน: เพิ่งเปิด excel และสร้างสมุดงานใหม่และมันก็มีปัญหาเดียวกัน

ฉันมี Add-in บุคคลที่สามนี้เท่านั้นดังนั้นฉันจึงไม่สามารถเปรียบเทียบกับคนอื่นได้

ความคิดใด ๆ


คุณน่าจะได้รับคำตอบที่ดีกว่านี้ใน stackoverflow
Raystafarian

ขอบคุณสำหรับคำแนะนำใช่หลังจากโพสต์ฉันก็รู้สึกว่าอาจจะเป็นสถานที่ที่ดีกว่า มันยุติธรรมที่จะโพสต์คำถามเดียวกันด้วยหรือไม่
MátéJuhász

ไม่คุณควรลบอันนี้ถ้าคุณโพสต์ตรงนั้น
Raystafarian

2
ลองดูที่นั่น: stackoverflow.com/questions/213375/…
ZygD

คำตอบ:


1

นั่นคือวิธีที่มันควรจะทำงาน

จาก COM เอกสาร

      Component Automation  
Exposing the Application Object  

 Language Filter: All Language Filter: Multiple Language Filter: Visual Basic Language Filter: C# Language Filter: C++ Language Filter: J# Language Filter: JScript  
 Visual Basic (Declaration) 
 Visual Basic (Usage) 
 C# 
 C++ 
 J# 
 JScript 

Any document-based, user-interactive applications that expose ActiveX objects should have one top-level object named the Application object. This object is initialized as the active object when an application starts.

The Application object identifies the application and provides a way for ActiveX clients to bind to and navigate the application's exposed objects. All other exposed objects are subordinate to the Application object; it is the root-level object in the object hierarchy.

The names of the Application object's members are part of the global name space, so ActiveX clients do not need to qualify them. For example, if MyApplication is the name of the Application object, a Visual Basic program can refer to a method of MyApplication as MyApplication.MyMethod or simply MyMethod. However, you should be careful not to overload the Application object with too many members because it can cause ambiguity and decrease performance. A large, complicated application with many members should be organized hierarchically, with a few generalized objects at the top, branching out into smaller, more specialized objects. 

The following chart shows how applications should expose their Application and Document objects.

Command line  Multiple-document interface application  Single-document interface application  
/Embedding 
 Expose class factories for document classes, but not for the application.

Call RegisterActiveObject for the Application object.
 Expose class factories for document class, but not for the application.

Call RegisterActiveObject for the Application object.

/Automation 
 Expose class factories for document classes.

Expose class factory for the application using RegisterClassObject.

Call RegisterActiveObject for the Application object.
 Do not expose class factory for document class.

Expose class factory for the Application object using RegisterClassObject.

Call RegisterActiveObject for the Application object.

No OLE switches 
 Expose class factories for document classes, but not for the application.

Call RegisterActiveObject for the Application object.
 Call RegisterActiveObject for the Application object. 


The call to RegisterActiveObject enters the Application object in OLE's running object table (ROT), so ActiveX clients can retrieve the active object instead of creating a new instance. Visual Basic applications can use the GetObject statement to access an existing object.

 © Microsoft Corporation. All rights reserved. 

ดังนั้น / a หรือ / embedding จะไม่โหลดอะไรเลยนอกจากแอพเปล่า (และ / a ก็เป็นขั้นตอนการแก้ไขปัญหาที่ดีด้วย)

เริ่มแอพของคุณจากนั้น GetObject

นอกจากนี้ยังมีเหตุผลเล็กน้อยที่จะใช้เช่น addin เพราะคุณสามารถทำสิ่งที่แน่นอนที่ addin กำลังทำอยู่ นี่คือ vbs (วางให้กลายเป็น VBA) โดยใช้เอ็นจิน RegEx เดียวกับ addin ของคุณ (Word ยังมีเอ็นจิน RegEx ของตัวเองที่เรียกว่าUse Wildcards) Microsoft VBScript Regular Expression 5.5ตั้งค่าการอ้างอิงถึง

Set regEx1 = New RegExp
If Instr(LCase(Arg(1)), "i") > 0 then
    regEx1.IgnoreCase = True
Else
    regEx1.IgnoreCase = False
End If 
If Instr(LCase(Arg(1)), "v") > 0 then
    IncExc = False
Else
    IncExc = True
End If 
regEx1.Global = False
regEx1.Pattern = Pttn 
Do Until Inp.AtEndOfStream
    Line=Inp.readline
    If RegEx1.Test(Line) = IncExc then
        outp.writeline Line
    End If
Loop

ขอบคุณสำหรับคำตอบของคุณแม้ว่าฉันจะพบคำตอบที่อ้างอิงโดย ZygD จะง่ายขึ้น ฉันใช้ Add-in เนื่องจากมีรูปแบบ find / replace ที่มีความสามารถในการแสดงออกปกติไม่เพียง แต่สนับสนุนใน VBA
MátéJuhász

1

ฉันได้แก้ไขแล้วตามคำตอบที่โพสต์ในคำถามที่คล้ายกันใน stackoverflow: https://stackoverflow.com/a/806720/4721734

ฉันค้นหาปัญหานี้อีกครั้งและคอลเลกชัน Application.Addins ดูเหมือนว่าจะมี Addins ทั้งหมดอยู่ในเมนู Tools-> Addins โดยมีค่าบูลีนระบุว่าติดตั้ง Addin หรือไม่ ดังนั้นสิ่งที่ดูเหมือนจะใช้งานได้สำหรับฉันในตอนนี้คือการวนลูปผ่าน addins ทั้งหมดและถ้า. ติดตั้ง = true จากนั้นฉันตั้งค่า. ติดตั้งเป็นเท็จและกลับไปที่จริงและดูเหมือนว่าจะโหลด Addins ของฉันอย่างถูกต้อง

Function ReloadXLAddins(TheXLApp As Excel.Application) As Boolean

    Dim CurrAddin As Excel.AddIn

    For Each CurrAddin In TheXLApp.AddIns
        If CurrAddin.Installed Then
            CurrAddin.Installed = False
            CurrAddin.Installed = True
        End If
    Next CurrAddin

End Function
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.