estou usando excelsuplemento reg-exe funciona bem, o único problema é que não carrega quando o Excel é iniciado pelo VBA.
Tenho uma macro no word para coletar alguns dados no Word e copiá-los para o excel, esta inicia o excel, a saída está boa, mas preciso reiniciar o excel para poder usar o add-in (está habilitado nas opções , apenas não carregando).
Tentei outra macro: basta abrir o Excel e criar uma nova pasta de trabalho e ela apresenta o mesmo problema.
Eu tenho apenas este suplemento de terceiros, então não posso comparar com outros.
Qualquer ideia?
Responder1
É assim que deveria funcionar.
Dos documentos 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.
Portanto, /a ou /embedding não carregará nada além do aplicativo simples (e /a também é uma boa etapa de solução de problemas).
Inicie seu aplicativo e, em seguida, GetObject nele.
Além disso, há poucos motivos para usar addin, pois você pode fazer exatamente o que o addin está fazendo. Isso é vbs (colável no VBA) usando o mesmo mecanismo RegEx do seu complemento (o Word também possui seu próprio mecanismo RegEx chamado Use Wildcards
). Defina uma referência para 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
Responder2
Eu resolvi isso com base na resposta postada para uma pergunta semelhante no stackoverflow:https://stackoverflow.com/a/806720/4721734
Analisei esse problema novamente e a coleção Application.Addins parece ter todos os complementos listados no menu Ferramentas-> Suplementos, com um valor booleano informando se um complemento está instalado ou não. Então, o que parece funcionar para mim agora é percorrer todos os suplementos e se .Installed = true então eu defino .Installed como False e de volta para True, e isso parece carregar corretamente meus suplementos.
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