I am trying to create a button for ArcMap and I get Run time error 91 object variable or with block variable not set. I know the problem is one line 84 & 86. If I take them out the code runs, but it returns all my locations from the table. Also if you change the SEARCH_THRESHHOLD to 10000000, the code run with line 84 and 86 in there, but the same thing happens, it returns all my locations. I have the same code in another ArcMap and it works just fine. So I don't know what the problem is. Is there a setting I need to change in ArcMap itself? I am using ArcMap 10.3.1.
Here is the code:
Option Explicit
Const dbpath = "C:\Users\edunker\Documents\"
Const dbname = "WorkOrderDatabase.accdb"
'Const coord_file = "currcoords.dat"
'Const signshp_path = "s:\Highway\Signs\signdb\"
'Const signshp_file = "signsall"
Const GPS_BAUD = 4800
Const GPS_PORT = 1
Const SEARCH_THRESHHOLD = 10
Private Sub EditWorkOrderData_MouseDown(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long)
Dim pMxDoc As IMxDocument
Dim pGPSPoint As IPoint
Dim pCursorPoint As IPoint
Set pCursorPoint = New Point
Dim pLocationFeat As IFeature
Dim pSignFClass As IFeatureClass
Set pMxDoc = ThisDocument
pCursorPoint.x = pMxDoc.CurrentLocation.x
pCursorPoint.y = pMxDoc.CurrentLocation.y
Dim pGeometry As IGeometry
Set pGeometry = pCursorPoint
Dim pTopoOperator As ITopologicalOperator
Set pTopoOperator = pCursorPoint
Dim dblSearchDistance As Double
dblSearchDistance = SEARCH_THRESHHOLD
Dim pBufferGeometry As IGeometry
Set pBufferGeometry = pTopoOperator.Buffer(dblSearchDistance)
Set pLocationFeat = GetSelectedLocation(pBufferGeometry)
If pLocationFeat Is Nothing Then Exit Sub
Shell "c:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe " & dbpath & dbname & " /cmd Locationedit=" & pLocationFeat.Value(pLocationFeat.Fields.FindField("LocationID")), vbMaximizedFocus
End Sub
Public Function GetSelectedLocation(pGeom As IGeometry) As IFeature
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim strRoadNumber As String
Dim strLocationType As String
Dim strLocationID As String
'Dim strOrientation As String
Dim i As Long
Dim pFLayer As IFeatureLayer
Dim pFClass As IFeatureClass
Dim pID As New esriSystem.UID ' New esriCore.UID
Dim pAllFLayers As IEnumLayer
pID.Value = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}"
Set pAllFLayers = pMap.Layers(, True)
Set pFLayer = pAllFLayers.Next
Do Until pFLayer Is Nothing
If pFLayer.Name = "LocationData" Then Exit Do
Set pFLayer = pAllFLayers.Next
Loop
Set pFClass = pFLayer.FeatureClass
Dim pScratchWorkspace As IWorkspace
Dim pScratchWorkspaceFactory As IScratchWorkspaceFactory
Set pScratchWorkspaceFactory = New ScratchWorkspaceFactory
Set pScratchWorkspace = pScratchWorkspaceFactory.DefaultScratchWorkspace
Dim pSpatialFilter As ISpatialFilter
Set pSpatialFilter = New SpatialFilter
'Set pSpatialFilter.Geometry = pGeom
'pSpatialFilter.GeometryField = "SHAPE"
'pSpatialFilter.SpatialRel = esriSpatialRelContains
Dim pFeatureCursor As IFeatureCursor
Set pFeatureCursor = pFClass.Search(pSpatialFilter, False)
Dim pFeat As IFeature
Dim pTempFeat As IFeature
Set pFeat = pFeatureCursor.NextFeature
strRoadNumber = pFeat.Value(pFeat.Table.FindField("RoadNumber"))
strLocationType = pFeat.Value(pFeat.Table.FindField("LocationType"))
strLocationID = pFeat.Value(pFeat.Table.FindField("LocationID"))
'strOrientation = pFeat.Value(pFeat.Table.FindField("ORIENTATIO"))
If pFeat Is Nothing Then
MsgBox "You must select a Location", vbCritical
Set GetSelectedLocation = Nothing
Exit Function
End If
If pFeat.Fields.FindField("LocationID") = -1 Then
MsgBox "You must select a sign to position first", vbCritical
Set GetSelectedLocation = Nothing
Exit Function
End If
Set pTempFeat = pFeatureCursor.NextFeature
If Not pTempFeat Is Nothing Then
Set pFeat = pTempFeat
Load frmMultiplePoint
frmMultiplePoint.lstLocation.Clear
frmMultiplePoint.lstLocation.AddItem
frmMultiplePoint.lstLocation.List(0, 0) = strRoadNumber
frmMultiplePoint.lstLocation.List(0, 1) = strLocationType
frmMultiplePoint.lstLocation.List(0, 2) = strLocationID
'frmMultiplePoint.lstLocation.List(0, 3) = strOrientation
Do While Not pFeat Is Nothing
strRoadNumber = pFeat.Value(pFeat.Table.FindField("RoadNumber"))
strLocationType = pFeat.Value(pFeat.Table.FindField("LocationType"))
strLocationID = pFeat.Value(pFeat.Table.FindField("LocationID"))
'strOrientation = pFeat.Value(pFeat.Table.FindField("ORIENTATIO"))
frmMultiplePoint.lstLocation.AddItem
frmMultiplePoint.lstLocation.List(frmMultiplePoint.lstLocation.ListCount - 1, 0) = strRoadNumber
frmMultiplePoint.lstLocation.List(frmMultiplePoint.lstLocation.ListCount - 1, 1) = strLocationType
frmMultiplePoint.lstLocation.List(frmMultiplePoint.lstLocation.ListCount - 1, 2) = strLocationID
'frmMultiplePoint.lstSigns.List(frmMultiplePoint.lstSigns.ListCount - 1, 3) = strOrientation
Set pFeat = pFeatureCursor.NextFeature
Loop
frmMultiplePoint.Show
If frmMultiplePoint.Tag = "OK" Then
Set pFeatureCursor = pFClass.Search(pSpatialFilter, False)
For i = 0 To frmMultiplePoint.lstLocation.ListIndex
Set pFeat = pFeatureCursor.NextFeature
Next
MsgBox "Selecting Location with ID: " & pFeat.Value(pFeat.Table.FindField("LocationID")), vbInformation, "Success"
Else 'frmMultiplePoint.Tag = "CANCEL"
Set GetSelectedLocation = Nothing
Exit Function
End If
End If
Set GetSelectedLocation = pFeat
End Function
Hi Ethan,
Interesting question.
Which lines are 84 and 86?
Leo.
Line 84 is:
Set pSpatialFilter.Geometry = pGeom
and Line 86 is:
SpatialFilter.SpatialRel = esriSpatialRelContains
Option Explicit
Const dbpath = "C:\Users\edunker\Documents\"
Const dbname = "WorkOrderDatabase.accdb"
'Const coord_file = "currcoords.dat"
'Const signshp_path = "s:\Highway\Signs\signdb\"
'Const signshp_file = "signsall"
Const GPS_BAUD = 4800
Const GPS_PORT = 1
Const SEARCH_THRESHHOLD = 10
Private Sub EditWorkOrderData_MouseDown(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long)
Dim pMxDoc As IMxDocument
Dim pGPSPoint As IPoint
Dim pCursorPoint As IPoint
Set pCursorPoint = New Point
Dim pLocationFeat As IFeature
Dim pSignFClass As IFeatureClass
Set pMxDoc = ThisDocument
pCursorPoint.x = pMxDoc.CurrentLocation.x
pCursorPoint.y = pMxDoc.CurrentLocation.y
Dim pGeometry As IGeometry
Set pGeometry = pCursorPoint
Dim pTopoOperator As ITopologicalOperator
Set pTopoOperator = pCursorPoint
Dim dblSearchDistance As Double
dblSearchDistance = SEARCH_THRESHHOLD
Dim pBufferGeometry As IGeometry
Set pBufferGeometry = pTopoOperator.Buffer(dblSearchDistance)
Set pLocationFeat = GetSelectedLocation(pBufferGeometry)
If pLocationFeat Is Nothing Then Exit Sub
Shell "c:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe " & dbpath & dbname & " /cmd Locationedit=" & pLocationFeat.Value(pLocationFeat.Fields.FindField("LocationID")), vbMaximizedFocus
End Sub
Public Function GetSelectedLocation(pGeom As IGeometry) As IFeature
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim strRoadNumber As String
Dim strLocationType As String
Dim strLocationID As String
'Dim strOrientation As String
Dim i As Long
Dim pFLayer As IFeatureLayer
Dim pFClass As IFeatureClass
Dim pID As New esriSystem.UID ' New esriCore.UID
Dim pAllFLayers As IEnumLayer
pID.Value = "{E156D7E5-22AF-11D3-9F99-00C04F6BC78E}"
Set pAllFLayers = pMap.Layers(, True)
Set pFLayer = pAllFLayers.Next
Do Until pFLayer Is Nothing
If pFLayer.Name = "LocationData" Then Exit Do
Set pFLayer = pAllFLayers.Next
Loop
Set pFClass = pFLayer.FeatureClass
Dim pScratchWorkspace As IWorkspace
Dim pScratchWorkspaceFactory As IScratchWorkspaceFactory
Set pScratchWorkspaceFactory = New ScratchWorkspaceFactory
Set pScratchWorkspace = pScratchWorkspaceFactory.DefaultScratchWorkspace
Dim pSpatialFilter As ISpatialFilter
Set pSpatialFilter = New SpatialFilter
Set pSpatialFilter.Geometry = pGeom ' <------
pSpatialFilter.GeometryField = "SHAPE" ' <------ fail, error 91
pSpatialFilter.SpatialRel = esriSpatialRelContains ' <------
Dim pFeatureCursor As IFeatureCursor
Set pFeatureCursor = pFClass.Search(pSpatialFilter, False)
Dim pFeat As IFeature
Dim pTempFeat As IFeature
Set pFeat = pFeatureCursor.NextFeature
strRoadNumber = pFeat.Value(pFeat.Table.FindField("RoadNumber"))
strLocationType = pFeat.Value(pFeat.Table.FindField("LocationType"))
strLocationID = pFeat.Value(pFeat.Table.FindField("LocationID"))
'strOrientation = pFeat.Value(pFeat.Table.FindField("ORIENTATIO"))
If pFeat Is Nothing Then
MsgBox "You must select a Location", vbCritical
Set GetSelectedLocation = Nothing
Exit Function
End If
If pFeat.Fields.FindField("LocationID") = -1 Then
MsgBox "You must select a sign to position first", vbCritical
Set GetSelectedLocation = Nothing
Exit Function
End If
Set pTempFeat = pFeatureCursor.NextFeature
If Not pTempFeat Is Nothing Then
Set pFeat = pTempFeat
Load frmMultiplePoint
frmMultiplePoint.lstLocation.Clear
frmMultiplePoint.lstLocation.AddItem
frmMultiplePoint.lstLocation.List(0, 0) = strRoadNumber
frmMultiplePoint.lstLocation.List(0, 1) = strLocationType
frmMultiplePoint.lstLocation.List(0, 2) = strLocationID
'frmMultiplePoint.lstLocation.List(0, 3) = strOrientation
Do While Not pFeat Is Nothing
strRoadNumber = pFeat.Value(pFeat.Table.FindField("RoadNumber"))
strLocationType = pFeat.Value(pFeat.Table.FindField("LocationType"))
strLocationID = pFeat.Value(pFeat.Table.FindField("LocationID"))
'strOrientation = pFeat.Value(pFeat.Table.FindField("ORIENTATIO"))
frmMultiplePoint.lstLocation.AddItem
frmMultiplePoint.lstLocation.List(frmMultiplePoint.lstLocation.ListCount - 1, 0) = strRoadNumber
frmMultiplePoint.lstLocation.List(frmMultiplePoint.lstLocation.ListCount - 1, 1) = strLocationType
frmMultiplePoint.lstLocation.List(frmMultiplePoint.lstLocation.ListCount - 1, 2) = strLocationID
'frmMultiplePoint.lstSigns.List(frmMultiplePoint.lstSigns.ListCount - 1, 3) = strOrientation
Set pFeat = pFeatureCursor.NextFeature
Loop
frmMultiplePoint.Show
If frmMultiplePoint.Tag = "OK" Then
Set pFeatureCursor = pFClass.Search(pSpatialFilter, False)
For i = 0 To frmMultiplePoint.lstLocation.ListIndex
Set pFeat = pFeatureCursor.NextFeature
Next
MsgBox "Selecting Location with ID: " & pFeat.Value(pFeat.Table.FindField("LocationID")), vbInformation, "Success"
Else 'frmMultiplePoint.Tag = "CANCEL"
Set GetSelectedLocation = Nothing
Exit Function
End If
End If
Set GetSelectedLocation = pFeat
End Function
Okay so the line switched because of extra line spaces its now line 93 and line 95.