Since VB 5 Add-Ins have become more popular. Many companies
such as Sheridan Software Systems have made add ins. The best thing about them is that
they integrate into the VB IDE very easily, and open up the possibility of using the VBIDE
Object Model. When you use the Object Browser to view the VB5Extensibility Type Library,
there are loads of methods and properties for you to use. This can be confusing.
VB 5 provides a template Add-In but does not document it
very well. In this How-To we show you how to build a small Add-In and an installer program
for it.
NOTE: You need to make a reference to the following files
(Do this by going Project, References)
- Microsoft Office 8.0 Type Library (MSO97.DLL)
- Microsoft Visual Basic 5 Extensibility (VB5Ext.olb)
Make a new Standard EXE project. Add a mdoule (AddIn). Set
the projects Startup Object to Submain and copy the following code into the module:
Option Explicit
Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal AppName As String, ByVal KeyName As String, _
ByVal keydefault As String, _
ByVal result As String, ByVal resultSize As Long, _
ByVal filename As String) As Long
Declare Function WritePrivateProfileString& _
Lib "kernel32" Alias _
"WritePrivateProfileStringA" (ByVal AppName$, _
ByVal KeyName$, ByVal keydefault$, ByVal filename$) _
As Long
Const AddInName = "VBSAddIn"
Sub InstallAddIn()
' Add a reference in the VBADDIN.INI file
Dim result As String, errCode As Long
' try to read the entry in VBADDIN.INI
result = Space$(256)
GetPrivateProfileString "Add-Ins32", AddInName _
& ".Connect", "***", result, _
Len(result), "vbaddin.ini"
If Left$(result, 3) = "***" Then
' the entry is not there, so we must write it
errCode = WritePrivateProfileString("Add-Ins32", _
AddInName & ".Connect", "0", _
"vbaddin.ini")
End If
' If errCode Then
' MsgBox "Error while accessing VBADDIN.INI", vbCritical
' End If
End Sub
Sub Main()
If App.StartMode = 0 Then
InstallAddIn
DoEvents
End
End If
End Sub
Make a new ActiveX DLL project. Rename the class
Connect.cls. Rename the project VBSAddin. Copy the following code into the class module:
Option Explicit
Implements IDTExtensibility
'the instance of the VB IDE Public VBInstance
'As VBIDE.VBE
'command bar event handler
Public WithEvents MenuHandler As CommandBarEvents
'used to remember if main form is currently visible
Public FormIsVisible As Boolean
'the main form of the add-in
Private frmMain As frmAddIn
'the connection to the item in the AddIn menu
Private mcbMenuCommandBar As Office.CommandBarControl
Sub ShowForm()
' show the main addin form
On Error Resume Next
If frmMain Is Nothing Then
Set frmMain = New frmAddIn
End If
Set frmMain.VBInstance = VBInstance
Set frmMain.Connect = Me
FormIsVisible = True
frmMain.Show
End Sub
Sub HideForm()
' hide the main addin form
On Error Resume Next
FormIsVisible = False
frmMain.Hide
End Sub
Sub UnloadForm()
' unload the main addin form
On Error Resume Next
FormIsVisible = False
Unload frmMain
End Sub
Private Sub IDTExtensibility_OnConnection(ByVal VBInst As Object, _
ByVal ConnectMode As vbext_ConnectMode, _
ByVal AddInInst As VBIDE.AddIn, custom() As Variant)
' this method is invoked when the addin is added to VB
On Error GoTo OnConnection_Err
'save the vb instance
Set VBInstance = VBInst
If ConnectMode = vbext_cm_External Then
'this addin is being started by the wizard toolbar
Me.ShowForm
Else
'connect this addin to an item in the AddIn menu
Set mcbMenuCommandBar = AddToAddInCommandBar(AddInCaption)
'sink the event
Set Me.MenuHandler = VBInst.Events.CommandBarEvents(mcbMenuCommandBar)
If ConnectMode = vbext_cm_AfterStartup Then
'if this addin is being added to the addin menu
'see if we should display its form immediately
If GetSetting(AddInName, "Settings", "DisplayOnConnect", "0") = "1" Then
Me.ShowForm
End If
End If
End If
Exit Sub
OnConnection_Err:
Dim msg As String
msg = "Unable to start add-in " & AddInName & _
vbCr & vbCr & Err.Description
MsgBox msg, vbCritical
End Sub
Private Sub IDTExtensibility_OnDisconnection _
(ByVal RemoveMode As vbext_DisconnectMode, custom() As Variant)
' this method is invoked when the addin is removed
On Error Resume Next
'delete the command bar entry
mcbMenuCommandBar.Delete
'remember current state of visibility
If FormIsVisible Then
SaveSetting AddInName, "Settings", _
"DisplayOnConnect", "1"
FormIsVisible = False
Else
SaveSetting AddInName, "Settings", _
"DisplayOnConnect", "0"
End If
'unload the form
Unload frmMain
Set frmMain = Nothing
End Sub
Private Sub IDTExtensibility_OnStartupComplete(custom() As Variant)
' this method is invoked when the addin has
' completed its loading
'show the addin form, according to saved visibility state
If GetSetting(AddInName, "Settings", _
"DisplayOnConnect", "0") = "1" Then
Me.ShowForm
End If
End Sub
Private Sub IDTExtensibility_OnAddInsUpdate(custom() As Variant)
' this method is invoked when the addin menu is updated
End Sub
Private Sub MenuHandler_Click(ByVal CommandBarControl As Object, _
handled As Boolean, CancelDefault As Boolean)
' this event is invoked when the menu item is clicked
Me.ShowForm
End Sub
Function AddToAddInCommandBar(sCaption As String) _
As Office.CommandBarControl
' create an item in the addin menu
' and connect it to this addin
Dim cbMenuCommandBar As Office.CommandBarControl
Dim cbCommandBar As Office.CommandBarControls
Dim cbMenu As Object
'exit if any error
On Error GoTo AddToAddInCommandBar_Exit
'see if we can find the Add-Ins menu - exit if fails
Set cbMenu = VBInstance.CommandBars("Add-Ins")
If cbMenu Is Nothing Then Exit Function
'add an item to the command bar
Set cbMenuCommandBar = cbMenu.Controls.Add(1)
'set its caption
cbMenuCommandBar.Caption = "VB Square Add-In"
'return a reference to the menu item
Set AddToAddInCommandBar = cbMenuCommandBar
AddToAddInCommandBar_Exit:
End Function
Add a form (frmAddIn) and copy the following code into the
General Declarations procedure:
Public VBInstance As VBIDE.VBE
Public Connect As Connect
Option Explicit