Useful Scripts for the Non-Programmer: Retrieving an Existing IWorkspace

October 5, 2011 — Corey Blakeborough

When writing code or running scripts for ArcGIS products, you’re likely to need to define an IWorkspace. An IWorkspace can be created from scratch or manually loaded, but the most useful task is to take the workspace from the environment you are already working in. When you obtain an existing workspace, you’re getting information about your current environment. This includes all of the feature classes, object classes, and datasets in your geodatabase.

Getting and defining your existing workspace as an IWorkspace object will allow you to perform a variety of very useful scripts. With this information in place, we will define many of these scripts in future issues.

In this article, we’ll be creating a VBA module to retrieve the workspace. The functions for this module can be saved and used with other scripts to easily obtain an IWorkspace. Each method has different requirements, so be sure to use the one that’s most convenient for you!

As a reminder, follow these steps to create a module:

  • Within ArcMap, drop down the Tools menu and choose MacrosVisual Basic Editor.
  • Within the Visual Basic environment, expand the Normal.mxt file and insert a new Module within the Modules folder.
  • Copy and paste each applicable function into the module depending on which scenarios you may encounter. Later, you may selectively choose from the functions based on your needs.

Retrive from last edit session

You must be editing within an edit session for this method to work, and you must use this method if your script will be editing any versioned data.

Public Function GetEditWorkspace()
Dim pEditor As IEditor
Dim pID As New UID

pID = “esriEditor.Editor”
Set pEditor = Application.FindExtensionByCLSID(pID)

If pEditor.EditState <> esriStateEditing Then
MsgBox “Must be editing!”
Exit Function
End If

Set GetEditWorkspace = pEditor.EditWorkspace
End Function

Retrieve from Layers

This method retrieves the workspace from the layers in your table of contents:


The script will loop through each layer and take the workspace from the first feature layer that contains one. If you’re using data from additional sources (for example, importing a shapefile or comparing data from two geodatabase connections), be sure that the layer in the desired workspace is at the topmost position in this list.

Public Function GetLayerWorkspace()
Dim mxDoc As IMxDocument
Set mxdoc = ThisDocument

Dim Layers As IEnumLayer
Dim ds As IDataset

Dim pID As New UID
pID.value = “{40A9E885-5533-11d0-98BE-00805F7CED21}”

Dim layer As IFeatureLayer
Set layer = mxDoc.FocusMap.layers(pID, True).Next
Set ds = layer.FeatureClass
Set GetLayerWorkspace = ds.workspace
End Function

Retrieve from ArcFM™ Login

If you use the Telvent ArcFM™ extension for ArcGIS, ArcFM™’s login prompt (pictured below) is one of the easiest ways to obtain an IWorkspace object.


Once a user is logged into ArcFM™, the workspace can be obtained with the following function:

Public Function GetArcFMWorkspace()
Dim loginUtils As IMMLoginUtils
Set loginUtils = New MMLoginUtils
Set GetArcFMWorkspace = loginUtils.LoginWorkspace
End Function

By inserting these functions into a module, you will be able to reference them in all of your future scripts. Now that you are in possession of these scripts, we can provide you with a wide variety of useful VBA scripts in the coming issues. Stay tuned!

We Wrote the Book

The Indispensible Guide to ArcGIS Online

Download It for Free

Corey Blakeborough

Corey Blakeborough is a Team Lead, Senior Consultant at the Utility & Telecommunications GIS consulting company SSP Innovations in Centennial, Colorado. Corey has over five years of experience with SSP, providing a variety of GIS and work management solutions.

What do you think?

Leave a comment, and share your thoughts

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>