Tom's way works just fine, using the SQL end of things. To answer your last question, AccessADO looks like a Command object to me.
I don't do it his way. I use a Command object, set its CommandType property to adcmdstoredproc, use the createparameter method to add any necessary parameters to the command object's parameters collection, and execute the command, setting a recordset equal to the result of said execution. Here's some code, freshly kyped from MSDN, that illustrates this in detail:
***
Public Sub AppendX()
Dim cnn1 As ADODB.Connection
Dim cmdByRoyalty As ADODB.Command
Dim prmByRoyalty As ADODB.Parameter
Dim rstByRoyalty As ADODB.Recordset
Dim rstAuthors As ADODB.Recordset
Dim intRoyalty As Integer
Dim strAuthorID As String
Dim strCnn As String
' Open connection.
* Set cnn1 = New ADODB.Connection
* strCnn = "Provider=sqloledb;" & _
* "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
* cnn1.Open strCnn
cnn1.CursorLocation = adUseClient
' Open command object with one parameter.
* Set cmdByRoyalty = New ADODB.Command
* cmdByRoyalty.CommandText = "byroyalty" 'name of stored proc
* cmdByRoyalty.CommandType = adCmdStoredProc
' Get parameter value and append parameter.
intRoyalty = Trim(InputBox("Enter royalty:"

)
* Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", _
adInteger, adParamInput)
* cmdByRoyalty.Parameters.Append prmByRoyalty 'can pass intRoyalty as argument here
** prmByRoyalty.Value = intRoyalty
' Create recordset by executing the command.
** Set cmdByRoyalty.ActiveConnection = cnn1
* Set rstByRoyalty = cmdByRoyalty.Execute 'can pass cnn1 as argument here
' Open the Authors table to get author names for display.
Set rstAuthors = New ADODB.Recordset
rstAuthors.Open "authors", cnn1, , , adCmdTable
' Print current data in the recordset, adding
' author names from Authors table.
Debug.Print "Authors with " & intRoyalty & " percent royalty"
Do While Not rstByRoyalty.EOF
strAuthorID = rstByRoyalty!au_id
Debug.Print " " & rstByRoyalty!au_id & ", ";
rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
rstByRoyalty.MoveNext
Loop
rstByRoyalty.Close
rstAuthors.Close
cnn1.Close
End Sub
***
I put an asterisk in front of the lines illustrating the most important concepts.
Where I put **, the property value is a bit superfluous, in that the value can be supplied as an argument to one of the methods that open the object, e. g. the value can be supplied as an argument to the CreateParameter method. In fact, it should be done this way when possible, since persisting state unnecessarily between method calls represents a performance hit.
Bob Rodes