2012-07-18 10 views
11

He estado trabajando con Access por un tiempo, y aunque entiendo el beneficio obvio de una función sobre un Sub, si puede devolver valores como resultado, no estoy seguro de por qué debería usar un Sub sobre una función. Después de todo a menos que esté equivocado; Las funciones pueden hacer todo lo que Subs puede hacer?Propósito de usar sub rutinas sobre las funciones

Nota: Soy plenamente consciente de cómo usar los Sub y las funciones, por lo que no busco una explicación de cómo funcionan.

+0

Una llamada de * subrutina * es una afirmación; una llamada de una función es una * expresión *. Las subrutinas son para situaciones en las que necesita hacer algo sin producir un valor de retorno. – dasblinkenlight

+0

Todos, gracias por las respuestas, agradezco los puntos, sin embargo, lo que estoy tratando de hacer es, si necesito ejecutar una rutina que no devuelva un valor. ¿Un subtraductor traerá beneficios sobre una función, @TheNewOne ha resaltado que los tiempos de sub ejecución pueden ser mejores pero no se puede leer como una conclusión comprobada? –

+1

Encontré una discusión en bytes.com que puede ser de interés. No estoy seguro de si juzgará la (muy leve) mejora del rendimiento con un Sub como una conclusión comprobada. Personalmente, utilizo un criterio simple: el procedimiento será un Sub a menos que lo necesite para devolver un valor con la asignación de tipo de datos AS de una función. http://bytes.com/topic/access/answers/209591-function-vs-sub-public-vs-private – HansUp

Respuesta

8

La diferencia principal no es solo el valor de retorno, parece que los subs son más rápidos que las funciones (al menos en .net) porque el código MSIL de subs es mucho más corto cuando no se devuelve ningún valor. así que los subs generales son más rápidos cuando no se devuelve ningún valor. oh acabo de encontrar una gran fuente para ello (habla sobre .net), tal vez le gustaría leer más al respecto- Functions vs. Subroutines

+0

Tan sorprendente como es que la única diferencia sería un ligero aumento de velocidad para los valores que no devuelven la rutina, que parece ser la única respuesta, porras. –

+1

@MattDonnan, aunque esta respuesta es interesante, no es relevante para su pregunta porque VBA es un entorno completamente diferente que no tiene nada que ver con .NET Framework. Esto es un poco como hacer suposiciones sobre el rendimiento de un carrito de golf al examinar el rendimiento de un automóvil deportivo. Hay algunas similitudes, pero las diferencias son mucho más significativas. – phoog

+0

Hola, por supuesto, más rápido no es mucho y me pareció correcto también para vba y en 10,000,000 llamadas subs son más rápidas en 1 segundo. aclamaciones. – TheNewOne

1

Sí, una función es solo un Sub que devuelve un valor.

0

Notará que los eventos son siempre subs, nunca funciona. Sin embargo, en MS Access, puede ser útil para crear funciones cuando se desea usarlos como la propiedad de un evento:

On Close: = MyCloseFunction() 

Subs puede devolver un valor ByRef.

11

En términos de rendimiento, esto no sería un problema importante aquí.

La principal diferencia es que la función definida por el usuario se puede utilizar en la expresión de su código, donde no puede hacerlo un sub.

Esto es realmente un ENORME Monte Everest de una diferencia aquí.

Esta diferencia no está limitada a Access, sino que tiende a aplicarse a todos los lenguajes de programación y sistemas que se me ocurren que admiten la creación de funciones definidas por el usuario.

La ventaja clave de la utilización de función definida son muchas, pero el problema más fundamental es que tal función se puede utilizar en las expresiones.

Por ejemplo, al hacer clic en un botón de un formulario, generalmente puede tener una sola rutina VBA [Código de evento] asociada a ese botón.

Sin embargo se puede colocar también una expresión en la hoja de propiedades de esta manera:

=MyUserFunction() 

Lo anterior es un consejo útil, ya que entonces se puede poner de relieve 10 controles en un formulario, y el tipo en la expresión anterior y usted acaba de asignar la función anterior a esos 10 botones. No puedes hacer lo anterior con un sub.

Otra diferencia significativa es que puede usar una función como una fuente de datos (expresión) para un cuadro de texto en un formulario o informe (de nuevo, no puede hacer esto con un sub).

Otra diferencia significativa es que puede utilizar estas funciones en SQL. Esta es una habilidad verdaderamente fantástica ya que puede tener el código "ejecutado" para cada fila de una consulta. Y esto significa que puede ampliar la capacidad y funcionalmente de SQL.

Y puede incluso utilizar esta idea para mostrar una variable VBA en una consulta SQL ya que simplemente crea una función pública que devuelve la variable VBA y puede utilizarse en una consulta; sin embargo, no puede usar variables VBA en una consulta !

Y esto se extiende de SQL abre un sinfín de ideas:

Por lo tanto, se puede construir una función pública llamada Mañana()

Public Function Tomorrow() as date 

    Tomorrow() = date() + 1 

End Function. 

Ahora en el generador de consultas, puedo ir:

Select FirstName, lastName, Tomorrow() as NextDay from tblCustomers 

Y usted puede incluso hacer conversiones personalizadas tales como:

Select FirstName, LastName, Celsius([DailyGreenHouseTemp]) from tblGreenHouse. 

La lectura diaria de la temperatura por encima pude en en grados Fahrenheit y sólo tiene que definir una función pública llamada Celsius así:

Public Function Celsius(Temperature As Variant) As Variant 

    Celsius = (Temperature * 1.8) + 32 

End Function 

Ahora bien, aunque la función de arriba es simple, que podría hacer registro complejo conjunto procesamiento de un complejo Algoritmo para determinar la humedad sobre una maceta en función de la temperatura y la humedad.

Así que una vez que definimos dicha función pública, entonces el concepto clave es que dicha función se puede usar no solo en el código VBA como expresión, sino que también se puede utilizar lo suficientemente increíble como SQL.

Así que incluso en el código, puede ir:

If MyCustomfucntion(SomeVar) = lngTestValue then 

De nuevo en lo anterior, no se puede utilizar un sub en expresiones VBA.

Y aún más interesante es cuando se utiliza XML personalizado para cintas en Access, luego, si utiliza una expresión function() para el atributo "on action" entonces puede evitar la necesidad de volver a llamar a ribbon. Aún mejor es que la cinta llamará a esas funciones() en el formulario actual, no a un módulo de código público como DEBE hacer con las llamadas de cinta.

Probablemente podría escribir en otras 10 páginas en cuanto a la diferencia, pero creo que comenzaría a ser redundante y no quiero que parezca condensado de ninguna manera aquí.

Por lo tanto, la diferencia básica entre un sub y la función en VBA o, de hecho, en la mayoría de los lenguajes de programación es bastante similar.

Y los beneficios de usar una función en Access o casi cualquier lenguaje de programación también son muy similares. Por ejemplo, puedo definir una función definida por el usuario en t-sql (escalar), y de nuevo puede utilizar esa función t-sql en cualquiera de sus códigos t-sql o incluso desea que cree y use para el servidor sql.

Así que esta es la diferencia básica y simple entre un sub y una función, y me atrevo a decir que aquellos que han escrito código de computadora en casi cualquier lenguaje de programación se darán cuenta al instante de las diferencias importantes y útiles entre una subrutina y una función .

+2

Gracias Albert, realmente aprecio la cantidad de tiempo que has dedicado para explicar las diferencias. Puede ser por la redacción de mi pregunta (y me disculpo si lo es), pero estoy al tanto de lo anterior y tengo experiencia en esta área (aunque sé que esto sirve como información útil para quien pueda recoger este hilo) Sé lo grandiosas que son las funciones y las posibilidades que posibilitan. A lo único que estaba tratando de llegar es por qué el "Sub" podría ser una mejor opción para tomar. –

+0

@MattDonnan, como mencioné, Sub es la * única * opción para un evento. – Fionnuala

+1

@Remou Veo lo que quiere decir, si utilizo alguno de los eventos integrados, insertará el código como un Sub, sin embargo, este es el comportamiento integrado de Access, presumiblemente MS podría haber configurado Eventos para generar automáticamente funciones en su lugar si deseado. Lamentablemente, la pregunta que hice no va a ser de gran valor para nadie, solo me pregunto cuál es el propósito de la existencia de un submarino, ¿por qué no son todas funciones? –

1

No estoy del todo seguro, sin embargo, creo que los subs son más rápidos que las funciones porque las variables de una subrutina se definen al crear la subrutina y se accede haciendo referencia a la ubicación de la memoria. Las funciones deben asignar espacio de memoria cada vez que se acceda a ellas.

Las subrutinas modifican las variables en el código de llamada y las funciones las dejan intactas.Por lo tanto, una subrutina puede proporcionar varias piezas de información modificadas al código de llamada (tantos cambios como variables, incluidas las matrices), pero una función solo puede proporcionar una respuesta a la vez para los valores que se le pasan. Debido a esta diferencia, si es importante que una variable en una subrutina no cambie su valor, se debe asignar el valor a una variable temporal definida dentro de la propia subrutina.

1

Fwiw (mi teoría;) -

permite pensar en el mundo real para entender esto.

Digamos que quiere hacer algo. Hay (al menos) 2 formas de hacer esto.

En primer lugar, envíe solicitudes de información a los ayudantes y ellos le devolverán la información por usted. para que pueda mantener el control, es decir, toda la información fluye hacia usted y está decidiendo qué hacer a continuación, si corresponde. esto es más del ambiente controlado centralmente. esta es la esencia de la 'función' en vba

Segunda manera, divida el trabajo en tareas separadas y asigne la responsabilidad a sus ayudantes para terminar la tarea para usted, es decir, el trabajo real se lleva a cabo aquí por ayudantes en lugar de recopilar información. Esta es la esencia de 'sub' en vba.

Así que piense qué hacer si se rompe el código. con llamadas a funciones, usted se concentra en el comando central para buscar el motivo de la falla. Con las llamadas secundarias, tiene que toparse con el trabajo de cada subprocurador y descubrir qué hicieron mal.

Por supuesto, puede arruinar el propósito y tener funciones de trabajo y subs solo obtener información, ¡pero eso sería realmente confuso cuando las cosas se rompan! Ah, pero no puede hacer eso, lea este enlace: http://www.cpearson.com/excel/differen.htm, que establece que Excel prohíbe las funciones que cambian los valores de las celdas y los subs que se llaman desde las celdas.

Cuestiones relacionadas