py2vba converts a sub-set of Python into VBA code suitable for use as macros within Excel applications.
It was written for a competition that forced competitors to use VBA without additional add-ins or COM objects.
py2vba handles a variety of Python constructs. The following Python code is converted to a collection of VBA modules:
from py2vba.convert import vbmeta
from py2vba.vbast import String, Integer, Collection
class Person(object):
@vbmeta(name=String, age=Integer)
def __init__(self, name, age):
self.name = name
self.age = age
class Company(object):
@vbmeta(employees=Collection)
def __init__(self, employees):
self.employees = employees
@vbmeta(rettype=String)
def test():
c = Company([
Person("James", 27),
Person("Bob", 22)
])
return c.employees[1].name
Public Function test() As String
Dim c As Company
Set c = Company_ctor_(NewCollection(Person_ctor_("James", 27), Person_ctor_("Bob", 22)))
test = c.employees(1 + 1).name
End Function
Private Function NewCollection(ParamArray params() As Variant) As Collection
Dim p As Variant
Set NewCollection = New Collection
For Each p In params
NewCollection.Add p
Next p
End Function
Private Function NewDictionary(ParamArray params() As Variant) As Dictionary
Dim k, v As Variant
Dim i As Integer
Debug.Assert (UBound(params) + 1) Mod 2 = 0
Set NewDictionary = New Dictionary
For i = LBound(params) To UBound(params) Step 2
NewDictionary.Add params(i), params(i + 1)
Next i
End Function
Public Function Person_ctor_(name As String, age As Integer) As Person
Set Person_ctor_ = New Person
Person_ctor_.init__ name, age
End Function
Public Function Company_ctor_(employees As Collection) As Company
Set Company_ctor_ = New Company
Company_ctor_.init__ employees
End Function
Public age as Integer
Public name as String
Public Function init__(name As String, age As Integer) As Variant
Me.name = name
Me.age = age
End Function
Public employees as Collection
Public Function init__(employees As Collection) As Variant
Set Me.employees = employees
End Function