2012-09-06 18 views
5

Estoy creando una aplicación de VBA, y tengo el siguiente código:objeto de error Requerido Excel VBA


Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort (previousCell) '**Here i get object required** 

ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private Function getEffort(ByVal cell As range) 

' do soemthing 

End Sub 

no estoy seguro de por qué me sale el mensaje de error: Object required error at getEffort(previousCell). Si paso en el Target, funciona.

Gracias

+0

¿Debería _Private Function_ ser _Private Sub_ ya que no le interesa obtener un valor devuelto y la función privada termina con "END SUB"? – ray

+2

No use paréntesis cuando llame a getEffort. Si usa paréntesis, su código esperará un valor de retorno (¿getEffort devuelve algo?) –

+0

Nota: puede usar parantheses si escribe 'Call' antes del nombre secundario -' Call getEffort (previousCell) ' –

Respuesta

0

Parece objetivo no se ajusta a una instancia de un objeto que le está dando el error. cuando pasa al destino, el argumento de la función función (argumento) se establece en una instancia de un objeto. cuando configuramos la celda anterior = el objetivo debe ser algo o obtendremos el error de ejecución.

intente configurar previouscell = activecell

0

dos cosas: en primer lugar, es necesario no utilizar () o incluir algún tipo de valor de retorno al llamar getEffort como una función. También necesita determinar si desea que sea un sub/función, en este momento está usando ambos. ¿Presumiblemente lo está convirtiendo en un submarino?

Dim previousCell As range 


Private Sub Worksheet_SelectionChange(ByVal target As range) 

Application.EnableEvents = False 
On Error GoTo ws_exit: 


Set previousCell = target 
getEffort previousCell '**Here i get object required** 
'or... 
call getEffort(previousCell) 

'add this too.. 
'exit sub 
ws_exit: 
    Application.EnableEvents = True 
    MsgBox Err.Description 

End Sub 

Private sub getEffort(ByVal cell As range) 

' do soemthing 

End sub 

Además, el programa principal no sale de su estado de cuenta antes de error, por lo que aparecerá cuadro de mensaje siempre. Intente agregar Exit Sub antes de la etiqueta de error para evitar que aparezca siempre un cuadro de mensaje en blanco.

18

Como han sugerido otros, el problema es el paréntesis. Lo que nadie ha explicado adecuadamente es por qué es el paréntesis.

Cuando se dice esto:

getEffort previousCell 

Entonces está de paso del objeto Range previousCell en el procedimiento getEffort. Eso es lo que el procedimiento espera y, por lo tanto, es feliz.

Cuando se dice esto:

getEffort (previousCell) 

Los paréntesis alrededor previousCell causa VBA para evaluar el objeto previousCell. Cuando VBA evalúa un objeto, devuelve la propiedad predeterminada de ese objeto. La propiedad predeterminada del objeto Range es .Value, que es una cadena.

Así que se evalúa previousCell y cadena se pasa a getEffort. Por supuesto, getEffort espera un objeto Range, por lo que recibirá el mensaje de error.

El hecho de que esté asignando Target a previousCell es una pista falsa. Probablemente introdujo los paréntesis cuando cambió al previousCell. Si no me cree, intente esto:

getEffort (Target) 

Aparecerá el mismo mensaje de error.

+3

+1 para awesome explicación. –

+2

Para obtener información adicional, consulte mi respuesta a una pregunta diferente: [ByRef parece recibir el valor y no la referencia en VBA 6.0] (http://stackoverflow.com/a/4877030/154439) – mwolfe02