Shamil Salakhetdinov
shamil at users.mns.ru
Sat Jan 14 11:08:55 CST 2006
John,
This should work I think for both MS Access and COM-Add ins - please try:
Public Function a_test()
dim objApp as object
set objApp = Access.Application ' for MS Access add-ins
'set objApp = <Application object reference COM Add-in gets on
' connection>
'
' Add reference to:
'
' 1. Microsoft Visual Basic for Applications
' Extensibility 5.3 - VBE6EXT.OLB
'
' before running this code
'
Dim strCode As String
Dim strName As String
strName = "CTest"
strCode = _
"public function Test()" & vbCrLf & _
" Msgbox ""Hello, World!""" & vbCrLf & _
"end function"
AddClassModule objApp, strName, strCode
End Function
Public Sub AddClassModule( _
ByRef rapp As object, _
ByVal vstrName As String, _
ByVal vstrCode As String, _
Optional ByVal vstrProjectName As String = "")
Dim prj As VBIDE.VBProject
Dim prjItem As VBIDE.VBComponent
Dim strLst As String
If Len(vstrProjectName) = 0 Then
Set prj = rapp.VBE.ActiveVBProject
Else
Set prj = rapp.VBE.VBProjects.Item(vstrProjectName)
End If
Set prjItem = prj.VBComponents.Add(vbext_ct_ClassModule)
prjItem.CodeModule.AddFromString vstrCode
prjItem.Name = vstrName
rapp.DoCmd.Save acModule, vstrName
End Sub
> apparently the .RunCommand acCmdNewObjectClassModule
> isn't available in the
> context of code running out in an add-in.
.RunCommand acCmdNewObjectClassModule is available in an addin but you have
to have your front-end MS Access mdb/adp opened and of course code line
should be:
objApp.RunCommand ....
where objApp is Access.Application object reference, which COM Add-in gets
on connection and MS Access Add-in has natively as default instance of
Access.Application ...
Shamil
----- Original Message -----
From: "John Colby" <jwcolby at ColbyConsulting.com>
To: "'Access Developers discussion and problem solving'"
<accessd at databaseadvisors.com>
Sent: Saturday, January 14, 2006 5:07 PM
Subject: Re: [AccessD] Class builder
> Shamil,
>
> It appears that I am not going to solve this so any help is much
> appreciated.
>
> Thanks,
>
>
> John W. Colby
> www.ColbyConsulting.com
>
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Shamil
> Salakhetdinov
> Sent: Friday, January 13, 2006 12:17 PM
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Class builder
>
> John,
>
> The code I posted here works because it was tested before posting but it
> works in another context.
>
> You didn't say you write a (kind of) COM add-in and manipulate class
modules
> via VBE.
>
> If you will not solve this problem until tomorrow I will check my archives
> to find how it can be done - I did that both in MS Access and MS Excel -
> it's simple but needs some testing...
>
> I have to do some urgent work now...
>
> Shamil
>
> ----- Original Message -----
> From: "John Colby" <jwcolby at ColbyConsulting.com>
> To: "'Access Developers discussion and problem solving'"
> <accessd at databaseadvisors.com>
> Sent: Friday, January 13, 2006 5:32 PM
> Subject: Re: [AccessD] Class builder
>
>
> > Shamil,
> >
> > Well, that didn't work. I am trying to build this as an Add-In and
> > apparently the .RunCommand acCmdNewObjectClassModule isn't available in
> the
> > context of code running out in an add-in. I had been using the
following
> > code to get a module:
> >
> > Dim lMdl As VBComponent
> > Dim VBProj As VBProject
> > Set VBProj = Application.VBE.ActiveVBProject
> > Set lMdl =
> > Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_ClassModule)
> > lMdl.Name = strModuleName
> > Set AddModule = lMdl.CodeModule
> >
> > The "lMdl.Name = strModuleName" does correctly set the name of the class
> > module. The problem is that the created class is in limbo somewhere.
It
> > exists, i.e. if I try it again, the "lMdl.Name = strModuleName" causes a
> run
> > time error. I cannot save it however. Even opening a module in the
> current
> > app and clicking save doesn't save it.
> >
> > John W. Colby
> > www.ColbyConsulting.com
> >
> >
> > -----Original Message-----
> > From: accessd-bounces at databaseadvisors.com
> > [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Shamil
> > Salakhetdinov
> > Sent: Friday, January 13, 2006 3:53 AM
> > To: Access Developers discussion and problem solving
> > Subject: Re: [AccessD] Class builder
> >
> > John,
> >
> > Here is one of the methods how a new class module can be created and
saved
> > using VBA:
> >
> > Dim mdl As Access.Module
> > Dim objApp As Access.Application
> > Dim strTempMdlName As String
> > Dim strMdlName As String
> > Set objApp = Access.Application
> > strMdlName = "CTestClassModule"
> >
> > With objApp.DoCmd
> > .RunCommand acCmdNewObjectClassModule
> > Set mdl = objApp.Modules.Item(objApp.Modules.Count - 1)
> > strTempMdlName = mdl.Name
> >
> > mdl.InsertText "public TestProperty as integer"
> >
> > .Close acModule, strTempMdlName, acSaveYes
> > .Rename strMdlName, acModule, strTempMdlName
> > End With
> >
> > Make sure there is no class module with the name CTestClassModule in
your
> > database...
> >
> > Shamil
> >
> > ----- Original Message -----
> > From: "John Colby" <jwcolby at ColbyConsulting.com>
> > To: "'Access Developers discussion and problem solving'"
> > <accessd at databaseadvisors.com>
> > Sent: Friday, January 13, 2006 4:08 AM
> > Subject: [AccessD] Class builder
> >
> >
> > > I have just finished a little class builder. If anyone wants to play
> with
> > > it let me know.
> > >
> > > In the meantime, the one thing I can't figure out is how to save the
> newly
> > > created class. I can click the save button and it saves the new
module,
> > but
> > > I can't make it happen from VBA. Anyone know what object saves
unsaved
> > > modules?
> > >
> > > John W. Colby
> > > www.ColbyConsulting.com
> > >
> > >