Programmatically change the data source of a layer in ArcMap

Last Published: April 25, 2020


This article pertains to ArcGIS versions 8.x and 9.x. Later versions of ArcGIS may contain different functionality, as well as different names and locations for menus, commands and geoprocessing tools.

The sample code provided is to programmatically change a layer's data source in ArcMap.

Support for Visual Basic for Applications (VBA) for ArcMap and ArcCatalog ended with the ArcGIS 10.2.2 release, and Esri has not included VBA compatibility setups since version 10.5. See: ArcGIS Desktop and VBA Moving Forward


  1. Start ArcMap and add a feature class to the map.
  2. Create a new UIButtonControl: How To: Create a new UIButtonControl​
For more information on creating a UIControl, see the ArcGIS Desktop Help topic: 'Creating custom commands with VBA and UI Controls'
  1. Right-click the UIButtonControl and select View Source.
  2. Copy this code into the UIButtonControl's click event.
Dim pmxdoc As IMxDocument
Set pmxdoc = ThisDocument
Dim pmap As IMap
Set pmap = pmxdoc.ActiveView
Dim pfeatlayer As IFeatureLayer
Set pfeatlayer = pmap.Layer(0)
Dim pdatalayer As IDataLayer
Set pdatalayer = pfeatlayer
Dim pname As IName
Dim strTable As String
Dim strLocation As String
' Set the path to the directory containing the shapefile.
strLocation = "C:\testing\canada"
' Set the shapefile name to be used as the data source.
strTable = "provinces"
Dim pdatasetname As IDatasetName
Dim ptable As ITable
Dim pwrkspc As IWorkspaceName

Set pwrkspc = New WorkspaceName
pwrkspc.PathName = strLocation
' If a data source other than a shapefile is used,
' the workspace type will need to be changed.
pwrkspc.WorkspaceFactoryProgID = "esricore.shapefileworkspacefactory.1"

Set pdatasetname = New TableName
pdatasetname.Name = strTable
Set pdatasetname.WorkspaceName = pwrkspc
Set pname = pdatasetname
Set ptable = pname.Open
Dim pgeodataset As IGeoDataset
Set pgeodataset = ptable
Set m_penv = pgeodataset.Extent
Dim pfcname As IDatasetName
Set pfcname = pname
pdatalayer.DataSourceName = pname
Dim pav As IActiveView
Set pav = pmap
pav.Extent = m_penv
Set pav = pmap
  1. Change the values assigned to the STRLOCATION and STRTABLE variables to a shapefile data source.
  2. Click the UIButtonControl to execute the code and change the layer's data source.

Article ID:000006156

  • ArcMap 8 x
  • ArcMap 9 x

Receive notifications and find solutions for new or common issues

Get summarized answers and video solutions from our new AI chatbot.

Download the Esri Support App

Related Information

Discover more on this topic

Get help from ArcGIS experts

Contact technical support

Download the Esri Support App

Go to download options