ER/Studio Data Architect supports programmatic event handling.
To better understand when these events are triggered, I’ll share an updated script of the sample macro: ERSBasicHandlers.bas
The option for the Create Handlers has been checked:

This macro speaks different texts depending on the event.
Moreover, I’ll also share a second macro which reads the definitions of the selected entities|tables.
You can see these 2 macros in action in this video:
Const VOICE_INDEX% = 1 ' Change this number to change the voice. Max value depends on your OS.
Const SPEAK_TIMEOUT% = 10 ' Stop speaking after 10s
Const SVSFlagsAsync% = 1
Dim Sapi As Object
Private Sub Read(txt$)
If Sapi Is Nothing Then
Set Sapi = CreateObject("SAPI.Spvoice")
Set Sapi.Voice = Sapi.GetVoices.Item(VOICE_INDEX)
Sapi.Speak "TTS object created!", SVSFlagsAsync
End If
' The speaking of the text string
Sapi.Speak txt, SVSFlagsAsync
' Blocks the caller until either the voice has finished speaking or the specified time interval has elapsed.
' Sapi.WaitUntilDone (SPEAK_TIMEOUT * 1000)
End Sub
Sub CreateEntityHandler(CurEntity As Object, CurDiagram As Object)
Dim e As Entity
Dim d As Diagram
Set e = CurEntity
Set d = CurDiagram
Read IIf(d.ActiveModel.Logical, "Entity", "Table") & " created: " & IIf(d.ActiveModel.Logical, e.EntityName, e.TableName)
End Sub
Sub CreateAttributeHandler(CurAttribute As Object, CurDiagram As Object)
Dim a As AttributeObj
Dim d As Diagram
Set a = CurAttribute
Set d = CurDiagram
Read IIf(d.ActiveModel.Logical, "Attribute", "Column") & " created: " & IIf(d.ActiveModel.Logical, a.AttributeName, a.ColumnName)
End Sub
Sub CreateRelationshipHandler(CurRelationship As Object, CurDiagram As Object)
Dim rs As Relationship
Set rs = CurRelationship
Read "Relationship created: " & rs.Name
End Sub
Sub CreateIndexHandler(CurIndex As Object, CurDiagram As Object)
Dim i As Index
Set i = CurIndex
Read "Index created: " & i.Name
End Sub
Sub CreateModelHandler(CurModel As Object, CurDiagram As Object)
Dim m As Model
Set m = CurModel
Read "Model created: " & m.Name
End Sub
Sub CreateSubModelHandler(CurSubModel As Object, CurDiagram As Object)
Dim sm As SubModel
Set sm = CurSubModel
Read "SubModel created: " & sm.Name
End Sub
Sub CreateDomainHandler(CurDomain As Object, CurDiagram As Object)
Dim d As Domain
Set d = CurDomain
Read "Domain created: " & d.Name
End Sub
Sub CreateDefaultHandler(CurDefault As Object, CurDiagram As Object)
Dim d As Default
Set d = CurDefault
Read "Default created: " & d.Name
End Sub
Sub CreateUserDatatypeHandler(CurUserDatatype As Object, CurDiagram As Object)
Dim udt As UserDatatype
Set udt = CurUserDatatype
Read "UserDatatype created: " & udt.Name
End Sub
Sub CreateRuleHandler(CurRule As Object, CurDiagram As Object)
Dim r As Rule
Set r = CurRule
Read "Rule created: " & r.Name
End Sub
Sub CreateViewHandler(CurView As Object, CurDiagram As Object)
Dim v As View
Set v = CurView
Read "View created: " & v.Name
End Sub
Sub CreateTriggerHandler(CurTrigger As Object, CurDiagram As Object)
Dim t As Trigger
Set t = CurTrigger
Read "Trigger created: " & t.Name
End Sub
Sub CreateProcedureHandler(CurProcedure As Object, CurDiagram As Object)
Dim p As Procedure
Set p = CurProcedure
Read "Procedure created: " & p.Name
End Sub
Sub CreateViewRelationshipHandler(CurViewRelationship As Object, CurDiagram As Object)
Dim vrs As ViewRelationship
Set vrs = CurViewRelationship
Dim d As Diagram
Set d = CurDiagram
Read "ViewRelationship created for " & IIf(d.ActiveModel.Logical, "Entity", "Table") & ": " & IIf(d.ActiveModel.Logical, vrs.ParentEntity.EntityName, vrs.ParentEntity.TableName)
End Sub
Sub CreateDiagramHandler(CurDiagram As Object)
Dim d As Diagram
Set d = CurDiagram
Read "Diagram created: " & d.ProjectName
End Sub
Sub CreateEntityDisplayHandler(CurEntityDisplay As Object, CurDiagram As Object)
Dim ed As EntityDisplay
Set ed = CurEntityDisplay
Read "Entity Display created: " & ed.Name
End Sub
Sub CreateRelationshipDisplayHandler(CurRelationshipDisplay As Object, CurDiagram As Object)
Dim rsd As RelationshipDisplay
Set rsd = CurRelationshipDisplay
Read "Relationship Display created: " & rsd.ParentRelationship.Name
End Sub
Sub CreateViewDisplayHandler(CurViewDisplay As Object, CurDiagram As Object)
Dim vd As ViewDisplay
Set vd = CurViewDisplay
Read "View Display created: " & vd.Name
End Sub
Sub CreateViewRelationshipDisplayHandler(CurViewRelationshipDisplay As Object, CurDiagram As Object)
Dim vrsd As ViewRelationshipDisplay
Set vrsd = CurViewRelationshipDisplay
Dim d As Diagram
Set d = CurDiagram
Read "View Relationship Display created for " & IIf(d.ActiveModel.Logical, "Entity", "Table") & ": " & IIf(d.ActiveModel.Logical, vrsd.ParentViewRelationship.ParentEntity.EntityName, vrsd.ParentViewRelationship.ParentEntity.TableName)
End Sub
Sub CreateViewFieldHandler(CurViewField As Object, CurDiagram As Object)
Dim vf As ViewField
Set vf = CurViewField
Read "View Field created: " & vf.Alias
End Sub
Sub CreateFKColumnPairHandler(CurFKColumnPair As Object, CurDiagram As Object)
Dim fkcp As FKColumnPair
Set fkcp = CurFKColumnPair
Dim d As Diagram
Set d = CurDiagram
Read "FK Column Pair created. Parent " & IIf(d.ActiveModel.Logical, "attribute", "column") & ": " & IIf(d.ActiveModel.Logical, fkcp.ParentAttribute.AttributeName, fkcp.ParentAttribute.ColumnName) & "." & vbCrLf & "Child " & IIf(d.ActiveModel.Logical, "attribute", "column") & ": " & IIf(d.ActiveModel.Logical, fkcp.ChildAttribute.AttributeName, fkcp.ChildAttribute.ColumnName)
End Sub
Sub CreateIndexColumnHandler(CurIndexColumn As Object, CurDiagram As Object)
Dim ic As IndexColumn
Set ic = CurIndexColumn
Read "Index Column created for column: " & ic.ColumnName
End Sub
Sub CreateSubTypeHandler(CurSubType As Object, CurDiagram As Object)
Dim st As SubType
Set st = CurSubType
Read "SubType created for entity: " & st.Entity.EntityName
End Sub
Sub CreateSubTypeClusterHandler(CurSubTypeCluster As Object, CurDiagram As Object)
Dim stc As SubTypeCluster
Set stc = CurSubTypeCluster
Read "SubType Cluster created with Discriminator: " & stc.Discriminator
End Sub
'#Language "WWB-COM"
'
''MACRO TITLE: Read Definition
'
'This macro is reading the Definition of the currently selected
' Entities or Tables
'
'-------------------------------------------------------------------
Option Explicit
Const VOICE_INDEX% = 0 ' Change this number to change the voice. Max value depends on your OS.
Const SPEAK_TIMEOUT% = 10 ' Stop speaking after 10s
Const SVSFlagsAsync% = 1
Dim Sapi As Object
Sub Main
Dim MyDiagram As Diagram
Dim MyModel As Model
Dim MyEntity As Entity
Dim MySubModel As SubModel
Dim MySelObject As SelectedObject
Dim ID As Integer
Dim Logical As Boolean
Dim ObjectName As String
Dim ObjType As Integer
Debug.Clear
' Display the available voices
DisplayVoices
'Get the current diagram.
Set MyDiagram = DiagramManager.ActiveDiagram
'Get the current model.
Set MyModel = MyDiagram.ActiveModel
'Get the current submodel.
Set MySubModel = MyModel.ActiveSubModel
'Determine if the model is logical or physical.
Logical = MyModel.Logical
'Iterate through all the selected entities in the submodel
For Each MySelObject In MySubModel.SelectedObjects
'Get type of the selected object.
ObjType = MySelObject.Type
'We only want to get the entities, so check the object type.
If ObjType = 1 Then
'Get the ID of the selected object.
ID = MySelObject.ID
'Now, get the actual entity object with this ID.
Set MyEntity = MyModel.Entities.Item(ID)
'If the model is logical, get the entity name.
'If it is physical, get the table name.
ObjectName = IIf(Logical, "Entity " & MyEntity.EntityName, "Table " & MyEntity.TableName)
If MyEntity.Definition = "" Then
Read ObjectName & " has no definition!"
Else
Read "The definition of " & ObjectName & " is:"
Read MyEntity.Definition
End If
End If
Next MySelObject
Debug.Print ""
Debug.Print "End!"
End Sub
Private Sub Read(txt$)
If Sapi Is Nothing Then
Set Sapi = CreateObject("SAPI.Spvoice")
Set Sapi.Voice = Sapi.GetVoices.Item(VOICE_INDEX)
' Sapi.Speak "TTS object created!", SVSFlagsAsync
End If
Debug.Print "Reading: " & txt
' The speaking of the text string
Sapi.Speak txt, SVSFlagsAsync
' Blocks the caller until either the voice has finished speaking or the specified time interval has elapsed.
Sapi.WaitUntilDone (SPEAK_TIMEOUT * 1000)
End Sub
Private Sub DisplayVoices
Dim v As Object
Dim i%
If Sapi Is Nothing Then
Set Sapi = CreateObject("SAPI.Spvoice")
Set Sapi.Voice = Sapi.GetVoices.Item(VOICE_INDEX)
End If
i = 0
For Each v In Sapi.GetVoices
Debug.Print i & ": " & v.GetDescription 'The token's name
i += 1
Next
Debug.Print
End Sub
A short video which shows how to create a macro from a script in ER/Studio Data Architect: