[{"data":1,"prerenderedAt":114},["ShallowReactive",2],{"article_the-solidworks-automation-triad_solidworks":3,"_apollo:default":112,"_apollo:identified":113},{"posts":4},{"nodes":5,"__typename":111},[6],{"id":7,"slug":8,"title":9,"uri":10,"excerpt":11,"locale":12,"featuredImage":15,"tableOfContents":23,"content":30,"date":31,"authorJobTitle":32,"author":33,"masterings":45,"globalTags":59,"products":68,"disciplines":81,"seo":100,"__typename":110},"cG9zdDo2OTk0MA==","the-solidworks-automation-triad","The SOLIDWORKS Automation Triad","\u002Fproducts\u002Fsolidworks\u002Fthe-solidworks-automation-triad","\u003Cp>Explore this blog to open the door to a whole new world of automation possibilities in SOLIDWORKS.\u003C\u002Fp>\n",{"locale":13,"__typename":14},"en_US","Locale",{"node":16,"__typename":22},{"large":17,"__typename":18,"medium_large":17,"thumbnail":19,"srcSet":20,"sizes":21},"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513.png","MediaItem","https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513-150x150.png","https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513.png 667w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513-300x230.png 300w","(max-width: 640px) 100vw, 640px","NodeWithFeaturedImageToMediaItemConnectionEdge",[24,25,26,27,28,29],"|-0","Understanding SOLIDWORKS Events, Interoperability, and How They Can Transform Your Macros|understanding-solidworks-events-interoperability-and-how-they-can-transform-your-macros-1","What Are SOLIDWORKS Events?|what-are-solidworks-events-2","Exploring Events in the Local API Help|exploring-events-in-the-local-api-help-3","Creating a Macro to React to Selection Events|creating-a-macro-to-react-to-selection-events-4","Interoperability: Communicating Between SOLIDWORKS and Excel|interoperability-communicating-between-solidworks-and-excel-5","\n\u003Ch2 class=\"wp-block-heading\" id=\"-0\">\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"153\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage001.png.webp\" alt=\"\" class=\"wp-image-69993\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage001.png.webp 400w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage001-300x115.png.webp 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Ch2 class=\"wp-block-heading\" id=\"understanding-solidworks-events-interoperability-and-how-they-can-transform-your-macros-1\">Understanding SOLIDWORKS Events, Interoperability, and How They Can Transform Your Macros\u003C\u002Fh2>\n\n\n\n\u003Cp>Many of us have recorded a macro using the built-in VB editor in SOLIDWORKS, hoping to run it later successfully. After all, not every SOLIDWORKS command can be recorded. Others have opened the editor and tried to build a macro from scratch, guided by the abundance of tutorials, forums, and examples available online.\u003C\u002Fp>\n\n\n\n\u003Cp>If you fall into one of these groups, or if you’re simply curious about what can be done with the VB editor, I want to introduce you to a couple of concepts the macro recorder does not take into account, concepts that not everyone knows about, but which open the door to a whole new world of automation possibilities:\u003Cbr>\u003Cstrong>SOLIDWORKS Events\u003C\u002Fstrong>, \u003Cstrong>Interoperability\u003C\u002Fstrong>, and later, \u003Cstrong>SOLIDWORKS Document Manager\u003C\u002Fstrong>.\u003C\u002Fp>\n\n\n\n\u003Cp>Let’s begin by understanding these events referred to as \u003Cstrong>Delegates\u003C\u002Fstrong> in the SOLIDWORKS API documentation.\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\" id=\"what-are-solidworks-events-2\">What Are SOLIDWORKS Events?\u003C\u002Fh2>\n\n\n\n\u003Cp>As the name suggests, events are specific moments or actions within SolidWorks that the API allows you to “listen” to. Examples include:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Opening a document\u003C\u002Fli>\n\n\n\n\u003Cli>Changing a custom property\u003C\u002Fli>\n\n\n\n\u003Cli>Selecting anything on screen\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp>Internally, all these are events, and the API lets us respond to them programmatically.\u003C\u002Fp>\n\n\n\n\u003Cp>The goal of this article is to help you understand:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>What these events are\u003C\u002Fli>\n\n\n\n\u003Cli>How to \u003Cem>listen\u003C\u002Fem> to them\u003C\u002Fli>\n\n\n\n\u003Cli>And how to leverage them so your automations don’t only run when you press a button, they can also react automatically to user actions inside SOLIDWORKS.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp>We won’t be building full macros here, but we will use code snippets to illustrate how everything works.\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\" id=\"exploring-events-in-the-local-api-help-3\">Exploring Events in the Local API Help\u003C\u002Fh2>\n\n\n\n\u003Cp>Open the local API Help installed with SOLIDWORKS.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"495\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-142732.png.webp\" alt=\"\" class=\"wp-image-69995\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-142732.png.webp 508w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-142732-300x292.png.webp 300w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"420\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage006.png\" alt=\"\" class=\"wp-image-69996\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage006.png 865w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage006-300x146.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage006-768x373.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Inside the \u003Cstrong>Content\u003C\u002Fstrong> section, you’ll find a node called \u003Cstrong>Delegates\u003C\u002Fstrong>. This is where SOLIDWORKS lists all the events available for your installed version.\u003C\u002Fp>\n\n\n\n\u003Cp>You can categorize them like this:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>\u003Cstrong>Application:\u003C\u002Fstrong> DSldWorksEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Assembly:\u003C\u002Fstrong> DAssemblyDocEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Drawing:\u003C\u002Fstrong> DDrawingDocEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Part:\u003C\u002Fstrong> DPartDocEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Feature Manager:\u003C\u002Fstrong> DFeatMgrViewEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Model View:\u003C\u002Fstrong> DModelViewEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Mouse:\u003C\u002Fstrong> DMouseEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Property Sheet:\u003C\u002Fstrong> DSWPropertySheetEvents\u003C\u002Fli>\n\n\n\n\u003Cli>\u003Cstrong>Task Pane:\u003C\u002Fstrong> DTaskpaneViewEvents\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp>Personally, the ones I use most are the events tied to the active document, but it’s worth exploring them all, many are extremely descriptive and include detailed documentation right in the API Help.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"525\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage008-1024x525.png.webp\" alt=\"\" class=\"wp-image-69997\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage008-1024x525.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage008-300x154.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage008-768x394.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage008-1536x788.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage008-2048x1051.png.webp 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>One important detail: \u003Cstrong>these delegates cannot be called manually.\u003C\u002Fstrong> SOLIDWORKS exposes them internally, and they fire automatically with the appropriate parameters whenever the event occurs.\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\" id=\"creating-a-macro-to-react-to-selection-events-4\">Creating a Macro to React to Selection Events\u003C\u002Fh2>\n\n\n\n\u003Cp>Let’s look at how to detect a selection inside the SOLIDWORKS interface. Start by creating a new macro in the VB editor.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"349\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage010-1024x349.png.webp\" alt=\"\" class=\"wp-image-69998\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage010-1024x349.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage010-300x102.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage010-768x262.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage010.png.webp 1192w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-1-clean-up-the-default-module\">1. Clean up the default module\u003C\u002Fh3>\n\n\n\n\u003Cp>Rename the automatically generated module for clarity, I recommend naming modules using a simple pattern:\u003C\u002Fp>\n\n\n\n\u003Cp>S01_Name\u003C\u002Fp>\n\n\n\n\u003Cp>S02_Name\u003C\u002Fp>\n\n\n\n\u003Cp>&#8230;\u003C\u002Fp>\n\n\n\n\u003Cp>This keeps modules ordered by execution sequence.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-2-strong-type-the-solidworks-application-object\">2. Strong-type the SOLIDWORKS application object\u003C\u002Fh3>\n\n\n\n\u003Cp>By default, the editor declares swApp as a generic Object.\u003Cbr>Replace it with the explicit type:\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Dim \u003C\u002Fem>\u003Cem>swApp\u003C\u002Fem>\u003Cem> As \u003C\u002Fem>\u003Cem>SldWorks\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>This enables \u003Cstrong>Early Binding\u003C\u002Fstrong>, which gives you \u003Cem>IntelliSense\u003C\u002Fem>, making it much easier to explore methods and properties.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full is-resized\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"460\" height=\"325\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage012.png.webp\" alt=\"\" class=\"wp-image-69999\" style=\"width:438px;height:auto\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage012.png.webp 460w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage012-300x212.png.webp 300w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full is-resized\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"376\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage013.png\" alt=\"\" class=\"wp-image-70001\" style=\"width:481px;height:auto\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage013.png 576w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage013-300x196.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-3-create-a-class-module-for-handling-events\">3. Create a Class Module for Handling Events\u003C\u002Fh3>\n\n\n\n\u003Cp>Right-click on \u003Cem>Modules\u003C\u002Fem> &gt; \u003Cem>Insert\u003C\u002Fem> &gt; \u003Cem>Class Module.\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full is-resized\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"682\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage016.png.webp\" alt=\"\" class=\"wp-image-70003\" style=\"width:752px;height:auto\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage016.png.webp 937w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage016-300x218.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage016-768x559.png.webp 768w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Rename it to something meaningful, for example \u003Cem>SolidEvents_Handler\u003C\u002Fem>.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"276\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage018-1024x276.png.webp\" alt=\"\" class=\"wp-image-70004\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage018-1024x276.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage018-300x81.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage018-768x207.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage018-1536x414.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage018.png.webp 1603w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Inside this class, declare variables for the objects whose events you want to listen to and use \u003Cem>WithEvents\u003C\u002Fem>:\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Dim WithEvents \u003C\u002Fem>\u003Cem>swApp\u003C\u002Fem>\u003Cem> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As \u003C\u002Fem>\u003Cem>SldWorks\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Dim WithEvents \u003C\u002Fem>\u003Cem>swPart \u003C\u002Fem>\u003Cem>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As \u003C\u002Fem>\u003Cem>PartDoc\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Dim WithEvents \u003C\u002Fem>\u003Cem>swAssembly\u003C\u002Fem>\u003Cem> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As \u003C\u002Fem>\u003Cem>AssemblyDoc\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Dim WithEvents \u003C\u002Fem>\u003Cem>swDrawing \u003C\u002Fem>\u003Cem>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As \u003C\u002Fem>\u003Cem>DrawingDoc\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"340\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage020-1024x340.png.webp\" alt=\"\" class=\"wp-image-70005\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage020-1024x340.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage020-300x100.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage020-768x255.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage020.png.webp 1224w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Add another variable of type ModelDoc2 to capture whichever document is currently active.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-4-initialize-the-class\">4. Initialize the Class\u003C\u002Fh3>\n\n\n\n\u003Cp>To instantiate a class, you need the \u003Cem>Class_Initialize\u003C\u002Fem> procedure.\u003Cbr>Select \u003Cstrong>Class\u003C\u002Fstrong> in the object dropdown and \u003Cstrong>Initialize\u003C\u002Fstrong> in the procedure dropdown.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"388\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage022-1024x388.png\" alt=\"\" class=\"wp-image-70006\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage022-1024x388.png 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage022-300x114.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage022-768x291.png 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage022.png 1260w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Inside this method, set up the main variables:\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Set swApp = Application.SldWorks\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>Set swModel = swApp.ActiveDoc\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>To determine the type of the active document, use:\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>swModel.GetType\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>This returns an integer defined in the API Help’s enumeration table.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"167\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage024-1024x167.png.webp\" alt=\"\" class=\"wp-image-70007\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage024-1024x167.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage024-300x49.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage024-768x125.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage024-1536x251.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage024.png.webp 1879w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full is-resized\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"894\" height=\"726\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage026.png\" alt=\"\" class=\"wp-image-70008\" style=\"width:717px;height:auto\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage026.png 894w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage026-300x244.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage026-768x624.png 768w\" sizes=\"auto, (max-width: 894px) 100vw, 894px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full is-resized\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"867\" height=\"884\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage027.png\" alt=\"\" class=\"wp-image-70009\" style=\"width:656px;height:auto\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage027.png 867w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage027-294x300.png 294w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage027-768x783.png 768w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Once initialized, you can begin capturing events\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"964\" height=\"582\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage030.png\" alt=\"\" class=\"wp-image-70010\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage030.png 964w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage030-300x181.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage030-768x464.png 768w\" sizes=\"auto, (max-width: 964px) 100vw, 964px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>The 99% of the macro must begin with that sentences (1 and 2)to avoid use the wrong methods or properties into the wrong type of document, this avoid the macro crashes in the beginning, in this case we set every kind of document but if we only want to run the macro in a DocPart just put an Exit Sub inside de DocAssembly and the DocDrawing condition, even a messagebox to notify it to the user.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-5-capturing-the-selection-event\">5. Capturing the Selection Event\u003C\u002Fh3>\n\n\n\n\u003Cp>For this demonstration, we will the \u003Cem>UserSelectionPostNotify event.\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>This event fires after \u003Cem>every time the user selects something\u003C\u002Fem> in SOLIDWORKS\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"969\" height=\"700\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage032.png\" alt=\"\" class=\"wp-image-70011\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage032.png 969w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage032-300x217.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage032-768x555.png 768w\" sizes=\"auto, (max-width: 969px) 100vw, 969px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>To inspect the selection, use the SelectionManager interface and its method:\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cem>GetSelectedObjectType3\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cp>The returned Long value corresponds to specific selection types, as documented in the enumeration table.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"762\" height=\"186\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage034.png\" alt=\"\" class=\"wp-image-70012\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage034.png 762w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage034-300x73.png 300w\" sizes=\"auto, (max-width: 762px) 100vw, 762px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"769\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage036-1024x769.png.webp\" alt=\"\" class=\"wp-image-70013\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage036-1024x769.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage036-300x225.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage036-768x577.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage036-1536x1154.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage036.png.webp 1738w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"868\" height=\"1008\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage038.png\" alt=\"\" class=\"wp-image-70014\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage038.png 868w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage038-258x300.png 258w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage038-768x892.png 768w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>At this point we have to run the macro and see what happens.\u003C\u002Fp>\n\n\n\n\u003Col class=\"wp-block-list\">\n\u003Cli>Go to the Module that SOLIDWORKS creates and declare a variable as a SolidworksEfents_Handler (which is the class that we create before).\u003C\u002Fli>\n\n\n\n\u003Cli>Open a new part and model something, then run the macro from the Procedure called Main (the name Main in vba is not necessary, you can put whatever you want but it is a good practice to put “main” as an entry point, it is a convention behavior in programming and in some languages it is mandatory for).\u003C\u002Fli>\n\u003C\u002Fol>\n\n\n\n\u003Cp>Show the de immediate window to debug (Ctrl+G) to print the values returned from the event\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large is-resized\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"305\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage040-1024x305.png.webp\" alt=\"\" class=\"wp-image-70015\" style=\"width:847px;height:auto\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage040-1024x305.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage040-300x89.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage040-768x229.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage040-1536x458.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage040.png.webp 1599w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"667\" height=\"512\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513.png.webp\" alt=\"\" class=\"wp-image-70016\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513.png.webp 667w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144513-300x230.png.webp 300w\" sizes=\"auto, (max-width: 667px) 100vw, 667px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>1 → Dimension\u003C\u002Fli>\n\n\n\n\u003Cli>2 → Face\u003C\u002Fli>\n\n\n\n\u003Cli>3 → Feature\u003C\u002Fli>\n\n\n\n\u003Cli>4 → Plane\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp>You can keep selecting whatever to see its long value from the enumerator\u003C\u002Fp>\n\n\n\n\u003Cp>This is what the immediate window shows, one number for each selection that we been made\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"791\" height=\"441\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage053.png\" alt=\"\" class=\"wp-image-70017\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage053.png 791w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage053-300x167.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage053-768x428.png 768w\" sizes=\"auto, (max-width: 791px) 100vw, 791px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>And this is what API Help says:\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"688\" height=\"268\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144649.png.webp\" alt=\"\" class=\"wp-image-70018\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144649.png.webp 688w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-144649-300x117.png.webp 300w\" sizes=\"auto, (max-width: 688px) 100vw, 688px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>From here, you can add logic to react only to certain types. For our example, we will use Dimensions and Features to control them externally before.\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\" id=\"interoperability-communicating-between-solidworks-and-excel-5\">Interoperability: Communicating Between SOLIDWORKS and Excel\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-1-solidworks-to-excel\">1. SOLIDWORKS to Excel\u003C\u002Fh3>\n\n\n\n\u003Cp>Now let’s talk about interoperability, or how COM objects work.\u003C\u002Fp>\n\n\n\n\u003Cp>\u003Cstrong>COM\u003C\u002Fstrong> stands for \u003Cem>Component Object Model\u003C\u002Fem>, and it’s what allows applications to communicate through their \u003Cstrong>.tlb (Type Library)\u003C\u002Fstrong> files.\u003C\u002Fp>\n\n\n\n\u003Cp>Thanks to COM, SOLIDWORKS can talk to Excel, and Excel can also talk to SOLIDWORKS.\u003C\u002Fp>\n\n\n\n\u003Cp>To use Excel from SOLIDWORKS, simply enable the Excel reference in the VB editor:\u003C\u002Fp>\n\n\n\n\u003Cp>Tools → References → Microsoft Excel XX.X Object Library\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"298\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage063-1024x298.png.webp\" alt=\"\" class=\"wp-image-70019\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage063-1024x298.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage063-300x87.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage063-768x224.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage063.png.webp 1333w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"563\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage065-1024x563.png.webp\" alt=\"\" class=\"wp-image-70020\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage065-1024x563.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage065-300x165.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage065-768x422.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage065.png.webp 1323w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Once added, you can use all Excel objects, methods, and properties just like in VBA inside Excel.\u003C\u002Fp>\n\n\n\n\u003Cp>In the example macro, we will populate an Excel table with the dimensions and features selected in SOLIDWORKS.\u003C\u002Fp>\n\n\n\n\u003Cp>When the macro runs:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>It will launch an Excel session if one isn’t already open\u003C\u002Fli>\n\n\n\n\u003Cli>It will create a new table with 3 columns in \u003Cem>Sheet1\u003C\u002Fem>\u003C\u002Fli>\n\n\n\n\u003Cli>A small non-modal form will appear, keeping the connection alive\u003C\u002Fli>\n\n\n\n\u003Cli>While the form is visible, any selection in SOLIDWORKS matching the defined types will be added as a new row in Excel (I tried to do a GIF, but I don’t have permissions to install third-party software; what I have is a video)\u003C\u002Fli>\n\n\n\n\u003Cli>When the form closes, all COM pointers are cleaned (set to Nothing) to avoid leaving dangling references\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"482\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage068-1024x482.png.webp\" alt=\"\" class=\"wp-image-70021\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage068-1024x482.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage068-300x141.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage068-768x362.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage068-1536x723.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage068-2048x964.png.webp 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"677\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage070-1024x677.png.webp\" alt=\"\" class=\"wp-image-70022\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage070-1024x677.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage070-300x198.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage070-768x508.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage070.png.webp 1165w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Notice two things: the file is saved as an Excel macro file (.xlsm), and the B2 cell has the path to the part from which we are taking data. We will use it after; just save whenever you finish picking dimensions or features.\u003C\u002Fp>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-2-excel-to-solidworks\">2. Excel to SOLIDWORKS\u003C\u002Fh3>\n\n\n\n\u003Cp>Let&#8217;s go with the funny part. In the same way that we can drive Excel objects through SOLIDWORKS, we are going to drive SOLIDWORKS from Excel with events.\u003C\u002Fp>\n\n\n\n\u003Cp>The first step, as before, is to add the references in an Excel VBA project. We need the Programmer tab in the Excel ribbon to launch the VB editor.\u003C\u002Fp>\n\n\n\n\u003Cp>Normally, we get it through the Excel Options &gt; Customize Ribbon &gt; Programmer (check it)\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"534\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145105.png.webp\" alt=\"\" class=\"wp-image-70023\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145105.png.webp 684w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145105-300x234.png.webp 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Now from the programmer tab we can launch de VB Editor\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"681\" height=\"167\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145146.png.webp\" alt=\"\" class=\"wp-image-70024\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145146.png.webp 681w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145146-300x74.png.webp 300w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>The Excel VB objects have some differences with the SOLIDWORKS VB Editor.\u003C\u002Fp>\n\n\n\n\u003Cp>The first time we launch the editor, we see one object for the current session and one for every sheet in the workbook. In the sheet objects, we can use the Events that fire, for example, every time a cell changes.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"449\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage080-1024x449.png.webp\" alt=\"\" class=\"wp-image-70025\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage080-1024x449.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage080-300x131.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage080-768x337.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage080.png.webp 1524w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>We will use this event to listen to every change in the columns that we have the dimensions values or even feature status.\u003C\u002Fp>\n\n\n\n\u003Cp>Now we need the same structure that the SOLIDWORKS macro has:\u003C\u002Fp>\n\n\n\n\u003Col class=\"wp-block-list\">\n\u003Cli>One module to use as a start point (main procedure)\u003C\u002Fli>\n\n\n\n\u003Cli>One class module to gets the Excel events (the WorksSheet object that we saw before)\u003C\u002Fli>\n\n\n\n\u003Cli>One form to keep the connection\u003C\u002Fli>\n\u003C\u002Fol>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"398\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145435.png.webp\" alt=\"\" class=\"wp-image-70026\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145435.png.webp 668w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145435-300x179.png.webp 300w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Just remember that we can take the form from the SOLIDWORKS VBE windows and drag it to the Excel window to get the same form.\u003C\u002Fp>\n\n\n\n\u003Cp>We have to load the SOLIDWORKS references as we did before in SOLIDWORKS.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"698\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100.png\" alt=\"\" class=\"wp-image-70027\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100.png 889w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100-300x236.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100-768x603.png 768w\" sizes=\"auto, (max-width: 889px) 100vw, 889px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Once we have the Excel code, we can launch the connection and see what happens.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"687\" height=\"309\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145621.png.webp\" alt=\"\" class=\"wp-image-70028\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145621.png.webp 687w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145621-300x135.png.webp 300w\" sizes=\"auto, (max-width: 687px) 100vw, 687px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Ch3 class=\"wp-block-heading\" id=\"h-3-excel-to-solidworks-via-document-manager\">3. Excel to SOLIDWORKS via Document Manager\u003C\u002Fh3>\n\n\n\n\u003Cp>There is another scenario to keep in mind, from what we have seen, we need an open SOLIDWORKS session to drive the model dimensions, feature states, etc.\u003C\u002Fp>\n\n\n\n\u003Cp>But with SOLIDWORKS Document Manager, an API that allows us to read and write data within a SOLIDWORKS file, we can drive a model, change references and extract BOMs…\u003C\u002Fp>\n\n\n\n\u003Cp>In this case, we want to configure a 3D Model using an Excel configurator. To achieve this, we might think once we start to model. We have to parametrize every single dimension that we want to be driven.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"753\" height=\"692\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145707.png.webp\" alt=\"\" class=\"wp-image-70029\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145707.png.webp 753w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145707-300x276.png.webp 300w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Put = and the name of a Custom Property\u003C\u002Fp>\n\n\n\n\u003Cp>Equations can be derived with custom properties, which is something that we can also read\u002Fwrite without opening SOLIDWORKS, even without any license, just from the Document Manager.\u003Cbr>The first step here is to request for an Document Manager API key, once we have that code we can install the Document Manager SDK and use it, in this case, from excel.\u003C\u002Fp>\n\n\n\n\u003Cp>To do that, once again, we have to load its references in a VBA project\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"698\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100-1.png\" alt=\"\" class=\"wp-image-70030\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100-1.png 889w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100-1-300x236.png 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage100-1-768x603.png 768w\" sizes=\"auto, (max-width: 889px) 100vw, 889px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Then, using the Document Manager API Help, we can see an example to use it.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"859\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage113-1024x859.png.webp\" alt=\"\" class=\"wp-image-70031\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage113-1024x859.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage113-300x252.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage113-768x644.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage113-1536x1289.png.webp 1536w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage113.png.webp 1896w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>As we can see, the unique parameter that we need is the License Key, I recommend to have it in a separated file an read it rather than write the entire key in the vba project.\u003C\u002Fp>\n\n\n\n\u003Cp>The next step is to open the file through Document Manager.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"567\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145853.png.webp\" alt=\"\" class=\"wp-image-70032\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145853.png.webp 684w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145853-300x249.png.webp 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>After getting the doc that we want, that is the one the excel file has the path, we modify its Custom Properties.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-full\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"572\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145954.png.webp\" alt=\"\" class=\"wp-image-70033\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145954.png.webp 683w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fscreenshot-2026-05-27-145954-300x251.png.webp 300w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>The final step is to save the file.\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"670\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage115-1024x670.png.webp\" alt=\"\" class=\"wp-image-70034\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage115-1024x670.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage115-300x196.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage115-768x503.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage115.png.webp 1522w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n\n\n\n\u003Cp>Here there is not events to be fired, just a button to execute the procedure.\u003C\u002Fp>\n\n\n\n\u003Cp>We just have to set every single cell with data to its proper Custom Property, next time that SOLIDWORKS file is opened just rebuild it.\u003C\u002Fp>\n\n\n\n\u003Cp>This is how to build a kind of configurator for offers, for example, with a 3D generator:\u003C\u002Fp>\n\n\n\n\u003Cfigure class=\"wp-block-image size-large\">\u003Cimg loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"982\" src=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage117-1024x982.png.webp\" alt=\"\" class=\"wp-image-70035\" srcset=\"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage117-1024x982.png.webp 1024w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage117-300x288.png.webp 300w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage117-768x737.png.webp 768w, https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fimage117.png.webp 1301w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \u002F>\u003C\u002Ffigure>\n","2026-06-08T08:00:00","",{"node":34,"__typename":44},{"nicename":35,"description":36,"slug":35,"name":37,"firstName":38,"lastName":39,"avatar":40,"__typename":43},"acmiquel","I started using 3D modeling programs almost 20 years ago, passionate about photorealistic renderings I would wait hours on my old machine to do what now takes seconds, a SOLIDWORKS user for 10+ years.","Antonio Carmona","Antonio","Carmona",{"url":41,"__typename":42},"https:\u002F\u002Fblog-assets.solidworks.com\u002Fuploads\u002F2026\u002F05\u002Fcropped-antonio-carmona_2-96x96.jpg","Avatar","User","NodeWithAuthorToUserConnectionEdge",{"nodes":46,"edges":53,"__typename":58},[47],{"id":48,"name":49,"slug":50,"uri":51,"__typename":52},"dGVybToxOTk2","Tutorials","tutorials","\u002Fmastering\u002Ftutorials\u002F","Taxonomy_mastering",[54],{"isPrimary":55,"node":56,"__typename":57},true,{"id":48,"name":49,"slug":50,"uri":51,"__typename":52},"PostToTaxonomy_masteringConnectionEdge","PostToTaxonomy_masteringConnection",{"nodes":60,"__typename":67},[61],{"id":62,"name":63,"slug":64,"uri":65,"__typename":66},"dGVybTo5NjAx","3D CAD","3d-cad","\u002Ftags\u002F3d-cad\u002F","Taxonomy_tag","PostToTaxonomy_tagConnection",{"edges":69,"nodes":78,"__typename":80},[70],{"isPrimary":55,"node":71,"__typename":77},{"id":72,"name":73,"slug":74,"uri":75,"__typename":76},"dGVybTo1Ng==","SOLIDWORKS","solidworks","\u002Fproducts\u002Fsolidworks\u002F","Taxonomy_product","PostToTaxonomy_productConnectionEdge",[79],{"id":72,"name":73,"slug":74,"uri":75,"__typename":76},"PostToTaxonomy_productConnection",{"nodes":82,"edges":95,"__typename":99},[83],{"id":84,"name":63,"slug":64,"uri":85,"parentId":86,"disciplines":87,"__typename":94},"dGVybTo2MA==","\u002Fdisciplines\u002F3d-cad\u002F","dGVybTo1OA==",{"nodes":88,"__typename":93},[89],{"title":63,"uri":90,"parentId":91,"__typename":92},"\u002Fdisciplines\u002Fdesign-engineering\u002F3d-cad","cG9zdDozNzcz","Discipline","Taxonomy_disciplineToDisciplineConnection","Taxonomy_discipline",[96],{"isPrimary":55,"node":97,"__typename":98},{"parentId":86,"id":84,"name":63,"slug":64,"uri":85,"__typename":94},"PostToTaxonomy_disciplineConnectionEdge","PostToTaxonomy_disciplineConnection",{"canonical":101,"title":102,"metaDesc":32,"opengraphAuthor":32,"opengraphDescription":103,"opengraphTitle":9,"opengraphUrl":101,"opengraphSiteName":104,"opengraphPublishedTime":105,"opengraphModifiedTime":106,"twitterTitle":32,"twitterDescription":32,"readingTime":107,"metaRobotsNoindex":108,"__typename":109},"https:\u002F\u002Fblog-contrib-prd.itvpc.solidworks.com\u002Fproducts\u002Fsolidworks\u002Fthe-solidworks-automation-triad\u002F","The SOLIDWORKS Automation Triad - Blog Solidworks","Explore this blog to open the door to a whole new world of automation possibilities in SOLIDWORKS.","Blog Solidworks","2026-06-08T12:00:00+00:00","2026-06-08T12:00:03+00:00",17,"index","PostTypeSEO","Post","RootQueryToPostConnection",{},{},1782691520345]