I have a simple project which involves the use of several buttons in order to make various datasets visible depending on which category is required at the time.
It works fine using the popular GetLayerByName function (http://bit.ly/Ha2iGK) but unfortunately there are duplicate layer names scattered across the mxd. To get around this I modified it slightly to look at both the layer name and the layer description, but as raster catalogs are unable to store a description (this is unfortunately not in a geodatabase in case that makes any difference) the code falls over.
I've got a separate routine that clears all of the layers once the button is clicked and then it turns on the layers listed under another sub using [layername], [layerdescription]:
Set pLayer = GetLayerByName("Wet (483)", "L6_Dry")
If Not pLayer Is Nothing Then
pLayer.Visible = True
End If
Does anyone have any ideas or suggestions on how I can get it to skip/ignore the catalogs? I've never had much dealing with them inside VBA so any help at all would be greatly appreciated.
Public Function GetLayerByName(sLayerName As String, sLayerDesc As String) As ILayer
Dim pMxDocument As IMxDocument
Dim pCompositeLayer As ICompositeLayer
Dim pMap As IMap
Dim l As Long
Dim m As Long
Set pMxDocument = ThisDocument
Set pMap = pMxDocument.FocusMap
For l = 0 To pMap.LayerCount - 1
Set GetLayerByName = LayerByName(pMap.Layer(l), sLayerName, sLayerDesc)
If Not GetLayerByName Is Nothing Then Exit Function
Next l
End Function
Private Function LayerByName(pLayer As ILayer, sName As String, sLayerDesc As String) As ILayer
Dim pReturnLayer As ILayer
Dim pCompositeLayer As ICompositeLayer
Dim l As Long
Dim pLayerGenProp As ILayerGeneralProperties
'#### This is where the error appears!####
Set pLayerGenProp = pLayer
Dim thestring As String
thestring = pLayerGenProp.LayerDescription
If UCase$(pLayer.Name) = UCase$(sName) And UCase$(thestring) = UCase$(sLayerDesc) Then
Set LayerByName = pLayer
Exit Function
End If
If Not TypeOf pLayer Is IGroupLayer Then Exit Function
Set pCompositeLayer = pLayer
For l = 0 To pCompositeLayer.Count - 1
Set pReturnLayer = LayerByName(pCompositeLayer.Layer(l), sName, sLayerDesc)
If Not pReturnLayer Is Nothing Then
Set LayerByName = pReturnLayer
Exit Function
End If
Next l
End Function
