Cómo devolver un resultado de una función de VBA

¿Cómo devuelvo un resultado de una función?

Por ejemplo:

Public Function test() As Integer return 1 End Function 

Esto da un error de comstackción.

¿Cómo hago que esta función devuelva un número entero?

Para los tipos de devolución no objeto, debe asignar el valor al nombre de su función, como este:

 Public Function test() As Integer test = 1 End Function 

Ejemplo de uso:

 Dim i As Integer i = test() 

Si la función devuelve un tipo de Objeto, entonces debes usar la palabra clave Set así:

 Public Function testRange() As Range Set testRange = Range("A1") End Function 

Ejemplo de uso:

 Dim r As Range Set r = testRange() 

Tenga en cuenta que la asignación de un valor de retorno al nombre de la función no finaliza la ejecución de su función. Si desea salir de la función, debe indicar explícitamente la Exit Function . Por ejemplo:

 Function test(ByVal justReturnOne As Boolean) As Integer If justReturnOne Then test = 1 Exit Function End If 'more code... test = 2 End Function 

Documentación: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx

Las funciones de VBA tratan el nombre de la función como un tipo de variable. Entonces, en lugar de usar una statement de ” return “, simplemente diría:

 test = 1 

Observe, sin embargo, que esto no se rompe de la función. Cualquier código después de esta statement también se ejecutará. Por lo tanto, puede tener muchas instrucciones de asignación que asignen valores diferentes para test , y cualquiera que sea el valor cuando llegue al final de la función será el valor devuelto.

Simplemente establecer el valor de retorno para el nombre de la función todavía no es exactamente el mismo que el de Java (u otra) statement de return , porque en java, return sale de la función, así:

 public int test(int x) { if (x == 1) { return 1; // exits immediately } // still here? return 0 as default. return 0; } 

En VB, el equivalente exacto toma dos líneas si no está configurando el valor de retorno al final de su función . Entonces, en VB el corolario exacto se vería así:

 Public Function test(ByVal x As Integer) As Integer If x = 1 Then test = 1 ' does not exit immediately. You must manually terminate... Exit Function ' to exit End If ' Still here? return 0 as default. test = 0 ' no need for an Exit Function because we're about to exit anyway. End Function 

Como este es el caso, también es bueno saber que puede usar la variable de retorno como cualquier otra variable en el método. Me gusta esto:

 Public Function test(ByVal x As Integer) As Integer test = x ' <-- set the return value If test <> 1 Then ' Test the currently set return value test = 0 ' Reset the return value to a *new* value End If End Function 

O bien, el ejemplo extremo de cómo funciona la variable de rendimiento (pero no necesariamente un buen ejemplo de cómo debe codificarse realmente): la que lo mantendrá despierto por la noche:

 Public Function test(ByVal x As Integer) As Integer test = x ' <-- set the return value If test > 0 Then ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT, ' AND THE RESULT RESETTING THE RETURN VALUE. test = test(test - 1) End If End Function 

El siguiente código almacena el valor de retorno en la variable retVal y luego se puede usar MsgBox para mostrar el valor:

 Dim retVal As Integer retVal = test() Msgbox retVal