matriz

Conjunto de elementos indizados secuencialmente y que tienen el mismo tipo intrínseco de datos. Cada elemento de una matriz posee un número de índice único que lo identifica. Los cambios efectuados a un elemento de una matriz no afectan a los demás elementos.


objeto Automation

Objeto que se expone para otras aplicaciones o herramientas de programación a través de las interfaces de Automatización.


clase

Definición formal de un objeto. La clase actúa como plantilla desde la cual se crea una instancia de un objeto en tiempo de ejecución. La clase define las propiedades del objeto y los métodos utilizados para controlar su comportamiento.


colección

Objeto que contiene un conjunto de objetos relacionados. La posición de un objeto en la colección puede cambiar cada vez que se produzca un cambio en la colección; por tanto, la posición de un objeto específico en la colección puede variar.


expresión

Combinación de palabras clave, operadores, variables y constantes que produce una cadena, un número o un objeto. Una expresión puede realizar un cálculo, manipular caracteres o comprobar datos.


identificador

Elemento de una expresión que hace referencia a una constante o una variable.


miembro

Elemento que constituye una colección, un objeto o un tipo definido por el usuario.


módulo

Conjunto de declaraciones y procedimientos.


expresión numérica

Cualquier expresión que puede evaluarse como un número. Los elementos de una expresión pueden incluir cualquier combinación de palabras clave, variables, constantes y operadores que dan como resultado un número.


objeto

Combinación de código y datos que se pueden tratar como una unidad, por ejemplo un control, un formulario o un componente de una aplicación. Cada objeto se define mediante una clase.


procedimiento

Secuencia con nombre de instrucciones que se ejecutan como una unidad. Por ejemplo, Function y Sub son tipos de procedimientos.


propiedad

Atributo con nombre de un objeto. Las propiedades definen características de los objetos, como tamaño, color y ubicación en la pantalla, o el estado de un objeto, como si está o no habilitado.


error en tiempo de ejecución

Error que ocurre cuando se está ejecutando el código. Un error de tiempo de ejecución aparece cuando una instrucción intenta llevar a cabo una operación no válida.


alcance

Define la visibilidad de una variable, un procedimiento o un objeto. Por ejemplo, una variable declarada como Public es visible para todos los procedimientos de todos los módulos. Las variables declaradas en procedimientos sólo son visibles dentro del procedimiento y pierden su valor entre llamadas.


expresión de cadena

Cualquier expresión cuyo valor es una secuencia de caracteres contiguos. Los elementos de una expresión de cadena pueden incluir una función que devuelve una cadena, un literal de cadena, una constante de cadena o una variable de cadena.


Operación no válida; se está ejecutando la secuencia de comandos

Ha intentado tener acceso a uno o más miembros del objeto ScriptControl mientras se ejecutaba una secuencia de comandos. Mientras se ejecuta una secuencia de comandos, la mayoría de las propiedades son de sólo lectura. Además, a los métodos que afectan a los miembros del objeto ScriptControl no se puede tener acceso mientras se ejecute una secuencia de comandos. Algunos ejemplos de estos métodos son AddCode y AddObject.


No se puede establecer la propiedad UseSafeSubset

No se puede establecer la propiedad UseSafeSubset. La aplicación que aloja el objeto ScriptControl ha forzado el modo de seguridad o el motor de secuencia de comandos no es compatible con las características de seguridad. Otra causa posible es que si el motor de secuencia de comandos no es compatible con las características de seguridad, no siempre se admite el cambio de la propiedad UseSafeSubset. Pruebe a establecer la propiedad UseSafeSubset antes de llamar a cualquier método o antes de establecer la propiedad Language.


Comando en ejecución anulado

La secuencia de comandos ha finalizado porque se ha excedido el tiempo de ejecución especificado en la propiedad Timeout.


Propiedad Language no establecida

Intentó utilizar un método o una propiedad que sólo se permite cuando la propiedad Language del objeto ScriptControl tiene asignado un lenguaje válido.


El miembro no es compatible con el motor de comandos seleccionado

Intentó tener acceso a un método o una propiedad que el motor de secuencia de comandos especificado por la propiedad Language no admite.


Objeto no válido

Intentó tener acceso a un objeto que ya no está disponible porque se ha restablecido ScriptControl.


Error (Objeto)

Contiene información sobre los errores en tiempo de ejecución y de compilación que se producen.

Comentarios

El objeto Error de ScriptControl proporciona un superconjunto de las propiedades que se encuentran en el objeto estándar Err de Microsoft® Visual Basic®. Las propiedades adicionales le permiten devolver información a los usuarios una vez producido un error detectable.

Otra importante diferencia entre el objeto Err de Visual Basic y el objeto Error de ScriptControl, es que el objeto Error no es global, es decir, un objeto Error no trata todos los errores de ScriptControl. Cada ScriptControl tiene su propio objeto Error. En Visual Basic hay un único objeto Err.

Las propiedades del objeto Error de ScriptControl se restablecen a cero, o a cadenas de caracteres de longitud cero (""), cada vez que se cambia la propiedad Language de ScriptControl o cuando se hace una llamada a cualquiera de los métodos siguientes: Reset, AddCode, Eval o ExecuteStatement. Utilice el método Clear para restablecer explícitamente las propiedades del objeto Error.

Cuando se produce un error durante una llamada al objeto ScriptControl, las propiedades del objeto Err de Visual Basic toman los mismos valores que las del objeto Error de ScriptControl. Cuando se produce un error de ejecución dentro del código del ScriptControl, sólo las propiedades del objeto Error de ScriptControl contienen la información de corrección.


Module (Objeto)

Un objeto Module es el miembro de ScriptControl donde se llevan a cabo todos los procedimientos, tipos y declaraciones de datos.

Comentarios

El contenido exacto de un módulo está determinado por el motor de secuencia de comandos que se esté utilizando.

El código de secuencia de comandos, incluyendo los procedimientos definidos por el motor de secuencia de comandos que se está utilizando, se agrega a un objeto Module mediante el método AddCode.

Se provee automáticamente a ScriptControl de un módulo Global. El código de secuencia de comandos agregado al propio ScriptControl va siempre en el módulo Global. El código de secuencia de comandos del módulo Global está disponible para todos los demás módulos del ScriptControl.

Para agregar módulos adicionales a la colección Modules se utiliza el método Add. El código de secuencia de comandos agregado a cualquier módulo adicional es local de dicho módulo.


Modules (Colección)

La colección Modules contiene todos los módulos de un objeto ScriptControl, incluyendo el módulo Global.

Comentarios

La colección Modules proporciona una forma cómoda de referirse a todos los módulos de un ScriptControl como si fueran un único objeto.

Para agregar módulos individuales se utiliza el método Add. Para devolver módulos específicos de la colección Modules se utiliza el método Item, mientras que con la instrucción For Each…Next se puede iterar toda la colección.

El módulo Global se encuentra siempre mediante la constante GlobalModule como un índice de la colección Modules.

Los demás módulos se pueden indizar por nombre o por número de módulo.


Procedure (Objeto)

El objeto Procedure es una unidad lógica de código definida por el motor de secuencia de comandos que se esté utilizando.

Comentarios

El objeto Procedure proporciona puntos de entrada a los procedimientos de un módulo.

Para agregar objetos Procedure individuales a la colección Procedures de un módulo específico se utiliza el método AddCode.


Procedures (Colección)

La colección Procedures contiene todos los procedimientos definidos en un objeto Module específico.

Comentarios

La colección Procedures proporciona una forma cómoda de referirse a todos los procedimientos de un objeto Module como si fueran un único objeto.

Para agregar procedimientos individuales a módulos especificados se utiliza el método AddCode. La colección Procedures del módulo Global contiene los procedimientos individuales agregados al ScriptControl.

Para devolver procedimientos específicos de la colección Procedures se utiliza el método Item, mientras que con la instrucción For Each…Next se puede iterar toda la colección.

Los procedimientos se pueden indizar por nombre o número de procedimiento.


ScriptControl (Objeto)

Permite las secuencias de comandos en una aplicación.

Comentarios

El objeto ScriptControl proporciona una interfaz sencilla para utilizar motores de secuencias de comandos compatibles con automatización ActiveX®. El objeto ScriptControl admite lo siguiente:

•	Cualquier lenguaje de secuencia de comandos compatible con automatización ActiveX.

•	Un cuadro de diálogo de ejecución de macros que enumera las macros disponibles.

•	La capacidad de compilar secuencias de comandos y mostrar información detallada explicativa de cualquier error que se produzca.

•	La capacidad de capturar y mostrar errores en tiempo de ejecución que se produzcan durante la ejecución de los comandos.

•	La capacidad de exponer la funcionalidad del modelo de objetos a las secuencias de comandos.

•	La capacidad de exponer funciones globales a las secuencias de comandos.

•	Una ventana Immediato.

•	La capacidad de limitar la ejecución de las secuencias de comandos tanto en cuanto a funcionalidad como a limitaciones de tiempo.


AllowUI (Propiedad)

Establece o devuelve un valor booleano que indica si una secuencia de comandos en ejecución, o el propio ScriptControl, puede mostrar elementos de la interfaz de usuario. Lectura/escritura.

Sintaxis

object.AllowUI [= valor]

La propiedad AllowUl tiene estas partes:

Parte	Descripción
object	Obligatorio. Puede ser cualquier objeto de la lista "Aplicable a" o una referencia a él.
valor	Opcional. Valor booleano que es True si se permite mostrar elementos de la interfaz de usuario y False en caso contrario.
Comentarios

La propiedad AllowUl se aplica a los elementos de la interfaz de usuario que muestra el propio ScriptControl o las máquinas de las secuencias de comandos.

En VBScript, por ejemplo, si AllowUl es False, la instrucción MsgBox no funcionará. Tenga en cuenta que si AllowUl es False, no hay ninguna forma de notificar al usuario la ocurrencia de un evento TimeOut.


CodeObject (Propiedad)

Devuelve un objeto que sirve para llamar a miembros públicos de un módulo especificado. Sólo lectura.

Sintaxis

object.CodeObject

Object es el nombre de un módulo específico o hace referencia a él.

Comentarios

En una aplicación, el programador proporciona los nombres de miembros públicos de un módulo mediante el objeto ScriptControl.


Column (Propiedad)

Devuelve una ubicación de columna que indica el lugar aproximado del código de secuencia de comandos donde se ha producido el error. Sólo lectura.

Sintaxis

Error.Column

Comentarios

Utilice las propiedades Column y Line para determinar la ubicación aproximada del código de secuencia de comandos donde se ha producido el error. Si no está disponible esta información, la propiedad Column se pone a cero.

Nota   No todas las propiedades del objeto Error son válidas siempre. Cuando una propiedad no resulte adecuada para un error específico, su valor será 0 o una cadena de caracteres de longitud cero ("").


Count (Propiedad)

Devuelve el número de elementos de una colección. Sólo lectura.

Sintaxis

object.Count

Object es cualquier colección de la lista "Aplicable a" o una referencia a ella.


Description (Propiedad)

Devuelve una breve descripción de un error. Sólo lectura.

Sintaxis

Error.Description

Comentarios

Utilice la propiedad Description para notificar al usuario acerca de un error que el programador no puede o no quiere tratar. La propiedad Description muestra los mensajes de error integrados del sistema.

Nota   No todas las propiedades del objeto Error son válidas siempre. Cuando una propiedad no resulte adecuada para un error específico, su valor será 0 o una cadena de caracteres de longitud cero ("").


Error (Propiedad)

Devuelve un objeto Error que contiene información detallada acerca del último error ocurrido. Sólo lectura.

Sintaxis

ScriptControl.Error

Comentarios

El objeto Error devuelto se utiliza para errores de compilación y para errores en tiempo de ejecución.

Nota   No todas las propiedades del objeto Error son válidas siempre. Cuando una propiedad no resulte adecuada para un error específico, su valor será 0 o una cadena de caracteres de longitud cero ("").


HasReturnValue (Propiedad)

Devuelve True si un procedimiento tiene un valor de retorno y False en caso contrario. Sólo lectura.

Sintaxis

object.HasReturnValue

Object es el nombre de un procedimiento específico o una referencia a él.


HelpContext (Propiedad)

Devuelve el número de identificación de contexto de un tema en un archivo de Ayuda de Microsoft Windows. Sólo lectura.

Sintaxis

Error.HelpContext

Comentarios

La propiedad HelpContext sirve para mostrar automáticamente el tema de Ayuda especificado por la propiedad HelpFile.

Nota   En su aplicación, debe escribir rutinas que se encarguen de tratar los errores típicos. Al programar con un objeto, puede utilizar su archivo de Ayuda para mejorar la calidad del tratamiento de errores o para mostrar al usuario un mensaje explicativo en caso de que el error sea irrecuperable.

Nota   No todas las propiedades del objeto Error son válidas siempre. Cuando una propiedad no resulte adecuada para un error específico, su valor será 0 o una cadena de caracteres de longitud cero ("").


HelpFile (Propiedad)

Devuelve una expresión de cadena que es la ruta totalmente cualificada a un archivo de Ayuda de Microsoft® Windows. Sólo lectura.

Sintaxis

Error.HelpFile

Comentarios

Si se especifica un archivo de Ayuda en la propiedad HelpFile, el usuario lo llama automáticamente al hacer clic en el botón Ayuda del cuadro de diálogo del mensaje de error (o presiona la tecla F1). Si la propiedad HelpContext contiene un identificador de contexto válido para el archivo especificado, se muestra automáticamente el tema. Si no se especifica nada en HelpFile, se muestra el archivo de Ayuda de Visual Basic.

Nota   En su aplicación, debe escribir rutinas que se encarguen de tratar los errores típicos. Al programar con un objeto, utilice su archivo de Ayuda para mejorar la calidad de su tratamiento de errores o para mostrar al usuario un mensaje explicativo en caso de que el error sea irrecuperable.

Nota   No todas las propiedades del objeto Error son válidas siempre. Cuando una propiedad no resulte adecuada para un error específico, su valor será 0 o una cadena de caracteres de longitud cero ("").


Language (Propiedad)

Establece o devuelve el nombre del lenguaje de secuencia de comandos que se está utilizando. Lectura y escritura.

Sintaxis

ScriptControl.Language [= lenguaje]

Cuando se establece la propiedad Language, lenguaje puede ser VBScript, JScript o cualquier otro lenguaje de secuencia de comandos adecuado.

Comentarios

Si restablece la propiedad Languaje en código en ejecución, se quita todo el código existente de todos los módulos, reiniciando el uso de Script Control.


Line (Propiedad)

Devuelve una ubicación de línea que indica el lugar del código de secuencia de comandos donde se ha producido el error. Sólo lectura.

Sintaxis

Error.Line

Comentarios

Utilice las propiedades Line y Column para determinar la ubicación aproximada del código de secuencia de comandos donde se ha producido el error. Si no está disponible la información de línea, la propiedad Line se pone a cero.

Nota   No todas las propiedades del objeto Error son válidas siempre. Cuando una propiedad no resulte adecuada para un error específico, su valor será 0 o una cadena de caracteres de longitud cero ("").


Modules (Propiedad)

Devuelve la colección de módulos del objeto ScriptControl. Sólo lectura.

Sintaxis

ScriptControl.Modules

Comentarios

Siempre existe un módulo al menos. Si no se ha declarado explícitamente ningún módulo, existe un módulo Global implícito que se utiliza en todos los códigos de secuencias de comandos agregados. Para tener acceso al módulo Global se utiliza la constante GlobalModule como índice de la colección Modules.


Name (Propiedad)

Devuelve el nombre de un módulo, procedimiento u objeto. Sólo lectura.

Sintaxis

object.Name

Object es cualquier objeto de la lista "Aplicable a" o una referencia a él.

Comentarios

El nombre de object se establece en el momento de agregarlo a ScriptControl mediante los métodos Add o AddObject.


NumArgs (Propiedad)

Devuelve el número de argumentos requeridos por un procedimiento. Sólo lectura.

Sintaxis

object.NumArgs

Object es un objeto Procedure o una referencia a él.


Number (Propiedad)

Devuelve un valor numérico que especifica un error en tiempo de ejecución. Number es la propiedad predeterminada del objeto Error. Sólo lectura.

Sintaxis

Error.Number

Comentarios

Los números de error sólo se aplican a los errores de tiempo de ejecución.


Procedures (Propiedad)

Devuelve la colección de procedimientos definidos en un módulo especificado. Sólo lectura.

Sintaxis

object.Procedures

Object es un objeto Module o una referencia a él.


SitehWnd (Propiedad)

Establece o devuelve el hWnd de la ventana utilizada mediante la ejecución del código de secuencia de comandos para mostrar cuadros de diálogo y otros elementos de la interfaz de usuario. Lectura y escritura.

Sintaxis

ScriptControl.SitehWnd [= valor]

El argumento valor puede ser 0 o el número de un hWnd válido.

Comentarios

Si el objeto ScriptControl se está utilizando como un control (y no como un objeto Automation), el valor por defecto de la propiedad SitehWnd es el hWnd del contenedor del control. Si ScriptControl se ha creado como un objeto de Automatización, el valor por defecto de SitehWnd es 0, que indica la ventana del escritorio. En cualquier caso, el usuario puede cambiar el valor a un hWnd válido en cualquier momento.


Source (Propiedad)

Devuelve una expresión de cadena que especifica el tipo de error que se ha producido. Sólo lectura.

Sintaxis

Error.Source

Comentarios

En Microsoft® Internet Explorer, la expresión devuelta por la propiedad Source, especificando la clase de error producido, puede ser una de las siguientes:

•	Microsoft JScript™ error de compilación.

•	Microsoft JScript error en tiempo de ejecución.

•	Microsoft VBScript error de compilación.

•	Microsoft VBScript error de ejecución.


State (Propiedad)

Establece o devuelve el modo del objeto ScriptControl. Lectura/escritura.

Sintaxis

ScriptControl.State [= estado]

El argumento estado puede ser una de las constantes siguientes:

Constante	Valor	Descripción
Initialized	0	El motor de interpretación de comandos ejecutará el código pero no recibirá ningún evento generado por objetos agregados por medio del método AddObject.
Connected	1	El motor de interpretación de comandos recibirá los eventos generados por objetos agregados por medio del método AddObject.


Text (Propiedad)

Devuelve una cadena de caracteres que contiene la parte del código de interpretación de comandos que rodea el lugar donde se ha producido un error de análisis en el código. Sólo lectura.

Sintaxis

Error.Text

Comentarios

El código de interpretación de comandos devuelto por la propiedad Text es el contexto en el cual se ha producido el error.


Timeout (Propiedad)

Establece o devuelve un intervalo de tiempo, en milisegundos, transcurrido el cual, se ofrece al usuario la opción de interrumpir o continuar la ejecución del código de interpretación de comandos.

Sintaxis

ScriptControl.Timeout [= valor]

Si valor se especifica utilizando la constante NoTimeout (-1), no se utiliza límite de tiempo. Cuando valor es 0, el evento Timeout se produce tan pronto como se determina que una ejecución de comandos interpretados ha detenido el proceso de mensajes de Windows durante una décima de segundo, aproximadamente. Cuando valor es mayor de cero, representa el número de milisegundos que deben transcurrir antes de que se produzca el evento Timeout.

Comentarios

Cuando se produce un evento Timeout, ScriptControl comprueba la propiedad AllowUI de todos los objetos ScriptControl en funcionamiento, para ver si le está permitido mostrar elementos de la interfaz de usuario.

Cuando se produce un evento Timeout, si la propiedad AllowUl es True en cualquier control de funcionamiento, se avisa al usuario por medio de un cuadro de diálogo. Si se selecciona End, ScriptControl detiene la ejecución de todos los motores de interpretación de comandos hasta que todos ellos hayan sido retirados de la pila de llamadas. Si se selecciona Continue, la ejecución del código de interpretación de comandos sigue durante otro periodo de tiempo, cuya duración se basa en el valor mínimo de la propiedad Timeout de todos los motores de interpretación de comandos que están en funcionamiento. Al final de cada periodo se muestra el cuadro de diálogo y se solicita de nuevo la intervención del usuario.

Si la propiedad AllowUl es False cuando se produce un evento Timeout, se detiene inmediatamente la ejecución de los comandos y el usuario no recibe ninguna notificación de lo que ha sucedido.


UseSafeSubset (Propiedad)

Establece o devuelve un valor booleano que indica si a la aplicación host tiene requisitos de seguridad. UseSafeSubset es True si la aplicación host requiere controles seguros, False, en caso contrario.

Sintaxis

ScriptControl.UseSafeSubset [=valor]

Si valor es True, no se permite tener acceso a algunos objetos y procedimientos.

Comentarios

El motor de interpretación de comandos que se está utilizando determina si la propiedad UseSafeSubset está establecida y cuándo. Si no se especifica lenguaje, (propiedad Language), UseSafeSubset se puede establecer en cualquier momento.

Los hosts de motores de interpretación de comandos pueden colocar requerimientos de seguridad en sus motores. Por ejemplo, Microsoft Internet Explorer sólo permite que los motores de interpretación de comandos creen y utilicen objetos externos que estén marcados como seguros para interpretación de comandos. Otros host prefieren no aplicar ningún requerimiento de seguridad. La propiedad UseSafeSubset indica a un objeto ScriptControl el nivel de seguridad adecuado que debe exigir a sus motores de interpretación de comandos. Si UseSafeSubset es True, sólo se permite a los motores de interpretación de comandos crear o utilizar objetos marcados como seguros para interpretación de comandos. Para obtener más información sobre la forma de hacer objetos seguros para la interpretación de comandos, busque "IObjectSafety" o "safe for scripting" en http://www.micrososft.com.

Cuando el objeto ScriptControl está contenido en un host que exige controles de seguridad, se fuerza a que la propiedad UseSafeSubset sea True y se convierta en sólo lectura.


Ejemplo de la propiedad AllowUI

El siguiente ejemplo muestra el uso de la propiedad AllowUI:

Private Sub Command1_Click()

   Dim sc, p1

   p1 = "Sub Main" & vbNewLine & _

        "   MsgBox ""La interfaz de usuario está activada.""" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = False

   sc.Language = "VBScript"

   sc.AddCode p1

   On Error Resume Next

   sc.Run "Main"

   If sc.error.Number = 70 Then

      MsgBox "La interfaz de usuario está desactivada. Haga clic en Aceptar para activarla y continuar."

      sc.AllowUI = True

      sc.Run "Main"

   End If

End Sub


Ejemplo de la propiedad CodeObject

El siguiente ejemplo muestra el uso de la propiedad CodeObject:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m, o

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   sc.AllowUI = True

   Set m = sc.Modules.Add("Module1") ' Módulo nuevo.

   ' Agrega tres procedimientos nuevos a Module1.

   m.AddCode "Sub Sub1 : MsgBox ""Sub1"": End Sub"

   m.AddCode "Sub Sub2 : MsgBox ""Sub2"": End Sub"

   m.AddCode "Sub Sub3 : MsgBox ""Sub3"": End Sub"

   ' Establece la referencia a CodeObject.

   Set o = m.CodeObject

   ' Ejecuta el miembro público de Module1.

   o.Sub2

End Sub


Ejemplo de la propiedad Column

El siguiente ejemplo muestra el uso de la propiedad Column:

Private Sub Command1_Click()

   Dim sc, p1, Msg

   ' Crea una secuencia de comandos que produce un
   ' error.

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Agrega la secuencia de comandos a ScriptControl.

   sc.AddCode p1

   ' Configura el tratamiento de errores.

   On Error Resume Next

   ' Ejecuta el código de secuencia de comandos.

   sc.Run "Main"

   ' Trata los errores.

   If sc.Error.Number <> 0 Then

      Msg = "Error de automatización!" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & " en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos."

      ' Muestra información del error.

      MsgBox Msg

   End If

End Sub


Ejemplo de la propiedad Count

El siguiente ejemplo muestra el uso de la propiedad Count:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Inicializa el generador de números pseudoaleatorios

   Randomize

   ' Agrega algunos procedimientos al módulo Global.

   For i = 1 To Int((10 * Rnd + 1))

      Code = "Sub Sub" & i & ": MsgBox Sub" & i

      Code = Code & ": End Sub"

      sc.AddCode Code

   Next

   ' Agrega algún número de módulos.

   For i = 1 To Int((10 * Rnd + 1))

      ' Agrega un módulo.

      Set m = sc.Modules.Add("Module" & CStr(i))

      ' Agrega algún número de procedimientos.

      For j = 1 To Int((10 * Rnd) + 1)

         ' Crea una plantilla para procedimientos.

         Code = "Sub Sub" & j & ": MsgBox Sub" & j

         Code = Code & ": End Sub"

         ' Agrega un procedimiento al módulo.

         m.AddCode Code

      Next

    Next

    ' Crea un informe de los módulos y procedimientos.

    Report = "El código ScriptControl contiene "

    Report = Report & sc.Modules.Count & " módulos. "

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' Muestra la información.

    MsgBox Report

End Sub


Ejemplo de la propiedad Description

El siguiente ejemplo muestra el uso de la propiedad Description.

Private Sub Command1_Click()

   Dim sc, p1, Msg

   ' Crea una secuencia de comandos que produce un
   ' error.

   p1 = "Sub Main" & vbNewLine & _

        " ' " & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Agrega la secuencia de comandos a ScriptControl.

   sc.AddCode p1

   ' Configura el tratamiento de errores.

   On Error Resume Next

   ' Ejecuta el código de secuencia de comandos.

   sc.Run "Main"

   ' Trata algunos errores.

   If sc.Error.Number <> 0 Then

      Msg = "Error de automatización" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & "en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos."

      ' Muestra información del error.

      MsgBox Msg

   End If

End Sub


Ejemplo de la propiedad HasReturnValue

El siguiente ejemplo muestra el uso de la propiedad HasReturnValue.

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m, Code, ProcName

   'Inicializa el generador de código pseudoaleatorio.

   Randomize

   ' Estable una referencia a ScriptControl.

   Set sc = CreateObject("ScriptControl")

   ' Inicializa el lenguaje de ScriptControl.

   sc.Language = "VBScript"

   ' Agrega algunos procedimientos al módulo Global.

   Code = "Sub Proc1(a): MsgBox ""Proc1 "" & a "

   Code = Code & ": End Sub"

   sc.AddCode Code

   Code = "Sub Proc2(a,b): MsgBox ""Proc2 "" & (a + b)"

   Code = Code & " : End Sub"

   sc.AddCode Code

   Code = "Function Proc3(a,b): Proc3= a * b"

   Code = Code & ":  End Function"

   sc.AddCode Code

   ' Genera un número del 1 al 3 para utilizarlo en la
   ' elección

   ' de un nombre de procedimiento aleatorio para este
   ' ejemplo.

   ProcName = "Proc" & Int(3 * Rnd + 1)

   ' Establece una referencia al módulo Global.

   Set m = sc.Modules("Global")

   ' Comprueba si ProcName retorna un valor.

   If m.Procedures(ProcName).HasReturnValue Then

      ' Ejecuta el código para que retorne un valor.

      m.ExecuteStatement ("x = " & ProcName & "(2, 3)")

      MsgBox ProcName & " retorna " & m.Eval("x") & "."

   Else

      MsgBox ProcName & " no retorna ningún valor."

   End If

End Sub


Ejemplo de la propiedad Language

El siguiente ejemplo muestra el uso de la propiedad Language:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, p1, Msg

   ' Crea un error.

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Agrega la secuencia de comandos a ScriptControl.

   sc.AddCode p1

   ' Configura el tratamiento de errores.

   On Error Resume Next

   ' Ejecuta el código de secuencia de comandos.

   sc.Run "Main"

   ' Trata los errores.

   If sc.Error.Number <> 0 Then

      Msg = "Error de automatización!" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & " en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos."

      ' Muestra información del error.

      MsgBox Msg

   End If

End Sub


Ejemplo de la propiedad Line

El siguiente ejemplo muestra el uso de la propiedad Line:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, p1, Msg

   ' Crea una secuencia de comandos que causa un error.

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Agrega el comando a ScriptControl.

   sc.AddCode p1

   ' Configura el tratamiento de errores.

   On Error Resume Next

   ' Ejecuta el código de secuencia de comandos.

   sc.Run "Main"

   ' Trata algunos errores.

   If sc.Error.Number <> 0 Then

      Msg = "Error de automatización" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & " en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos."

      ' Muestra información del error.

      MsgBox Msg

   End If

End Sub


Ejemplo de la propiedad Modules

El siguiente ejemplo muestra el uso de la propiedad Modules:

Private Sub Command1_Click()

' Crea algunas variables

   Dim sc, m, mc, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Obtiene la colección Modules de ScriptControl.

   Set mc = sc.Modules

   ' Inicializa el generador de números pseudoaleatorios

   Randomize

   ' Agrega algunos procedimientos al módulo Global.

   For i = 1 To Int((10 * Rnd + 1))

   ' Crea una plantilla para procedimientos.

   Code = "Sub Sub" & i & ": MsgBox Sub"

   Code = Code & i & ": End Sub"

      sc.AddCode Code

   Next

   ' Agrega algún número de módulos.

   For i = 1 To Int((10 * Rnd + 1))

      ' Agrega un módulo.

      Set m = mc.Add("Module" & CStr(i))

      ' Agrega algún número de procedimientos.

      For j = 1 To Int((10 * Rnd) + 1)

         ' Crea una plantilla para procedimientos.

         Code = "Sub Sub" & j & ": MsgBox Sub"

         Code = Code & j & ": End Sub"

         ' Agrega un procedimiento al módulo.

         m.AddCode Code

      Next

    Next

    Report = "El código ScriptControl contiene "

    Report = Report & sc.Modules.Count & " módulos. "

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' Muestra el informe.

    MsgBox Report

End Sub


Ejemplo de la propiedad Name

El siguiente ejemplo muestra el uso de la propiedad Name:

Private Sub Command1_Click()

' Crea algunas variables

   Dim sc, m, mc, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Obtiene la colección Modules de ScriptControl.

   Set mc = sc.Modules

   ' Inicializa el generador de números
   ' pseudoaleatorios

   Randomize

   ' Agrega algunos procedimientos al módulo Global.

   For i = 1 To Int((10 * Rnd + 1))

   ' Crea una plantilla para procedimientos.

   Code = "Sub Sub" & i & ": MsgBox Sub"

   Code = Code & i & ": End Sub"

      sc.AddCode code

   Next

   ' Agrega algún número de módulos.

   For i = 1 To Int((10 * Rnd + 1))

      ' Agrega un módulo.

      Set m = mc.Add("Module" & CStr(i))

      ' Agrega algún número de procedimientos.

      For j = 1 To Int((10 * Rnd) + 1)

         ' Crea una plantilla para procedimientos.

         Code = "Sub Sub" & j & ": MsgBox Sub"

         Code = Code & j & ": End Sub"

         ' Agrega un procedimiento al módulo.

         m.AddCode code

      Next

    Next

    Report = "El código ScriptControl contiene "

    Report = Report & sc.Modules.Count & " módulos. "

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' Muestra el informe.

    MsgBox Report

End Sub


Ejemplo de la propiedad NumArgs

El siguiente ejemplo muestra el uso de la propiedad NumArgs:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m, Code, ProcName, ArgCount, Msg

   Randomize

   ' Establece una referencia a ScriptControl.

   Set sc = CreateObject("ScriptControl")

   ' Inicializa el lenguaje de ScriptControl.

   sc.Language = "VBScript"

   ' Agrega algunos procedimientos al módulo Global.

   Code = "Sub Proc1(a): MsgBox ""Proc1 "" & a "

   Code = Code & ": End Sub"

   sc.AddCode code

   Code = "Sub Proc2(a,b): MsgBox ""Proc2 "" & (a + b)"

   Code = Code & " : End Sub"

   sc.AddCode code

   Code = "Function Proc3(a,b): Proc3= a * b"

   Code = Code & ":  End Function"

   sc.AddCode code

   ' Genera un número del 1 al 3 para utilizarlo en la elección

   ' de un nombre de procedimiento aleatorio para este ejemplo.

   ProcName = "Proc" & Int(3 * Rnd + 1)

   ' Establece una referencia al módulo Global.

   Set m = sc.Modules("Global")

   ' Comprueba el número de argumentos.

   ArgCount = m.Procedures(ProcName).NumArgs

   Msg = ProcName & " necesita " & ArgCount

   If ArgCount > 1 Then

       Msg = Msg & " argumentos."

   Else

       Msg = Msg & " argumento."

   End If

   MsgBox Msg

End Sub


Ejemplo de la propiedad Number

El siguiente ejemplo muestra el uso de la propiedad Number:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, p1, Msg

   ' Crea una secuencia de comandos que causa un error.

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Agrega la secuencia de comandos a ScriptControl.

   sc.AddCode p1

   ' Configura el tratamiento de errores.

   On Error Resume Next

   ' Ejecuta el código de secuencia de comandos.

   sc.Run "Main"

   ' Trata algunos errores.

   If sc.Error.Number <> 0 Then

      Msg = "Error de automatización!" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & " en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos."

      ' Muestra información del error.

      MsgBox Msg

   End If

End Sub


Ejemplo de la propiedad Procedures

El siguiente ejemplo muestra el uso de la propiedad Procedures:

Dim sc

Sub Main()

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = True

End Sub

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim m, i, j, pc, code, report

   If Not IsObject(sc) Then Main

   ' Obtiene la colección Modules de ScriptControl.

   Set mc = sc.Modules

   ' Pone algunos procedimientos en el módulo Global.

   Randomize ' Inicializa el generador de números pseudoaleatorios

   For i = 1 To Int((10 * Rnd + 1))

      code = "Sub Sub" & i & ": MsgBox Sub" & i & ": End Sub"

      sc.AddCode code

   Next

   ' Agrega algún número de módulos.

   For i = 1 To Int((10 * Rnd + 1))

      ' Agrega un módulo.

      Set m = mc.Add("Module" & CStr(i))

      ' Agrega algún número de procedimientos.

      For j = 1 To Int((10 * Rnd) + 1)

         ' Crea una plantilla para los procedimientos que agregamos.

         code = "Sub Sub" & j & ": MsgBox Sub" & j & ": End Sub"

         ' Agrega un procedimiento al módulo.

         m.AddCode code

      Next

    Next

    For Each m In sc.Modules

       ' Establece la referencia a la colección Procedures.

       Set pc = m.Procedures

       ' Agrega la cuenta de los procedimientos en este módulo.

       ProcCount = ProcCount + pc.Count

    Next

    ' Resumen del resultado.

    report = "El código ScriptControl contiene "

    report = report & sc.Modules.Count & " módulos y " & ProcCount & " procedimientos."

    ' Muestra el informe

    MsgBox report

    ' Restablece ScriptControl

    sc.Reset

End Sub


Ejemplo de la propiedad SitehWnd

El siguiente ejemplo muestra el uso de la propiedad SitehWnd:

Private Sub Command1_Click()

  Dim sc

  Set sc = CreateObject("ScriptControl")

  sc.Language = "VBScript"

  ' Obtiene el hWnd del formulario.

  sc.SitehWnd = Form1.hWnd

  sc.AddCode "MsgBox ""Hola a todos"""

End Sub


Ejemplo de la propiedad Source

El siguiente ejemplo muestra el uso de la propiedad Source:

Private Sub Command1_Click()

   Dim sc, p1

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   sc.AddCode p1

   On Error Resume Next

   sc.Run "Main"

   If sc.Error.Number <> 0 Then

   Msg = "Error de automatización" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & " en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos. Es un "

      Msg = Msg & sc.Error.Source

      MsgBox Msg

      sc.Error.Clear

   End If

End Sub


Ejemplo de la propiedad State

El siguiente ejemplo muestra el uso de la propiedad State:

' Crea una variable de módulo para ScriptControl.

Dim sc

Sub Main()

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = True

End Sub

Function ToggleState()

  ' Inicializa ScriptControl si no se hizo.

  If Not IsObject(sc) Then Main

  sc.State = sc.State Xor 1

End Sub


Ejemplo de la propiedad Text

El siguiente ejemplo muestra el uso de la propiedad Text:

Private Sub Command1_Click()

  Dim sc

  Set sc = CreateObject("ScriptControl")

  sc.Language = "VBScript"

  On Error Resume Next

  sc.AddCode "Sub Sub1: MsgBox ""Sub1"": End Sub"

  ' Agrega código incompleto que causa un error de
  ' análisis.

  sc.AddCode "Sub Sub2"

  ' Informa del contexto del error de análisis.

  MsgBox sc.Error.Text

End Sub


Ejemplo de la propiedad Timeout

El siguiente ejemplo muestra el uso de la propiedad Timeout:

Private Sub Command1_Click()

   Dim sc, p1, Msg

   p1 = "Sub Main" & vbNewLine & _

        "    For i = 1 to 100000" & vbNewLine & _

        "        x = x + i" & vbNewLine & _

        "    Next" & vbNewLine & _

        "    Msgbox ""Done"" " & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Establece el tiempo de espera en 1 segundo.

   sc.Timeout = 1000

   sc.AddCode p1

   ' Configura el tratamiento de errores.

   On Error Resume Next

   sc.Run "Main"

   ' Trata errores.

   If sc.Error.Number <> 0 Then

      Msg = "Error de automatización" & vbNewLine

      Msg = Msg & "Error " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & " en la línea: "

      Msg = Msg & sc.Error.Line

      Msg = Msg & ", columna: " & sc.Error.Column

      Msg = Msg & " del código de secuencia de
                  " comandos."

      MsgBox Msg

    End If

End Sub


Ejemplo de la propiedad UseSafeSubset

El siguiente ejemplo muestra el uso de la propiedad UseSafeSubset:

' Crea una variable de módulo para ScriptControl.

Dim sc

Sub Main()

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.addcode("function create() { fs = CreateObject('scripting.filesystemobject'); } ")

    sc.codeobject.create

    sc.UseSafeSubset = True

    ToggleState

    sc.codeobject.create

End Sub

Sub ToggleState()

  ' Inicializa ScriptControl si no se hizo.

  If Not IsObject(sc) Then Main

  sc.State = sc.State Xor 1

End Sub


Add (Método)

Agrega un nuevo módulo a la colección Modules.

Sintaxis

ScriptControl.Modules.Add(nombre[, objeto])

El método Add tiene estas partes:

Parte	Descripción
nombre	Requerido. Nombre de la cadena del módulo agregado.
objeto	Opcional. El nombre de un objeto asociado al módulo.
Comentarios

De forma opcional, un módulo agregado puede tener un objeto asociado. Si se especifica esta clase de objeto, el código de tratamiento de eventos se puede escribir detrás del objeto y sus objetos subordinados.


AddCode (Método)

Agrega el código especificado a un módulo.

Sintaxis

objeto.AddCode código

El método AddCode tiene estas partes:

Parte	Descripción
objeto	Requerido. El objeto al que se le agrega el código o al que se hace referencia. Puede ser cualquier objeto de la lista "Aplicable a".
código	Requerido. El código que contiene la cadena que se agrega al objeto.
Comentarios

Para bloques de código, como Sub...End Sub, Function...End Function, If…Then…Else y Select Case, debe proporcionar el bloque completo como el argumento code del método AddCode. No puede separar el código en el bloque sobre varias invocaciones de AddCode. Para separar cada instrucción del bloque, utilice dos puntos (:) o un carácter de nueva línea (vbNewLine) incrustado.

Puede llamar a AddCode varias veces.


AddObject (Método)

Crea un modelo de objetos del host disponible para un motor de secuencia de comandos.

Sintaxis

ScriptControl.AddObject(nombre, objeto[, agregarmiembros])

El método AddObject tiene estas partes:

Parte	Descripción
nombre	Requerido. Nombre por el cual reconoce el código de ScriptControl el objeto agregado.
objeto	Requerido. Nombre del objeto del host expuesto en tiempo de ejecución.
agregarmiembros	Opcional. Valor Booleano. True si los miembros de object tienen acceso de forma global a ScriptControl y sus miembros; False (predeterminado) si no tienen acceso.
Comentarios

Utilice el método AddObject para hacer que objetos del host estén disponibles para un motor de comandos. El método AddObject permite a un usuario de ScriptControl proporcionar un conjunto de pares nombre/objeto al código de automatización. El motor de secuencia de comandos puede exponer nombre de cualquier forma. En VBScript y JScript, cada nombre aparece como un nombre al que se tiene acceso de forma global mediante el código agregado a ScriptControl.


Clear (Método)

Borra todas las propiedades del objeto Error.

Sintaxis

Error.Clear

Comentarios

Las propiedades del objeto Error se borran de forma rutinaria cuando se ejecutan los métodos Reset, AddCode, Eval o ExecuteStatement. El método Clear se utiliza para borrar las propiedades del objeto Error en todas las demás situaciones.


Eval (Método)

Evalúa una expresión y retorna el resultado.

Sintaxis

objeto.Eval(expresión)

El método Eval tiene estas partes:

Parte	Descripción
objeto	Requerido. El objeto en el que se evalúa la expresión o al que hace referencia. Puede ser cualquier objeto de la lista "Aplicable a".
expresión	Requerido. La cadena que contiene la expresión que se va a evaluar.
Comentarios

El contexto del método Eval está determinado por el argumento objeto. Si objeto es un módulo, el contexto se limita a ese módulo. Si objeto es el ScriptControl, el contexto es el módulo Global.

Es importante tener en cuenta que en VBScript, una expresión como x = y se puede interpretar de dos formas. La primera es que el valor de y se asigne a x, y la segunda que x tenga el mismo valor que y. El método Eval utilizará siempre la segunda interpretación, mientras que ExecuteStatement siempre utilizará la primera.

Nota   En JScript™ no existe confusión entre asignación y comparación porque el operador de asignación (=) es distinto del operador de comparación (==).


ExecuteStatement (Método)

Ejecuta una instrucción especificada.

Sintaxis

objeto.ExecuteStatement instrucción

El método ExecuteStatement tiene estas partes:

Parte	Descripción
objeto	Requerido. El objeto que proporciona el contexto donde se evalúa la instrucción o una referencia a ella. Puede ser cualquier objeto de la lista "Aplicable a".
instrucción	Requerido. Cadena que contiene la instrucción que se va a ejecutar.
Comentarios

El contexto del método ExecuteStatement está determinado por el argumento objeto. Si objeto es un módulo, el contexto está limitado al módulo con nombre. Si objeto es el ScriptControl, el contexto es el módulo Global.

Es importante tener en cuenta que una expresión como x = y puede interpretarse de dos formas. La primera es que el valor de y se asigne a x, y la segunda es que x tenga el mismo valor que y. El método ExecuteStatement utilizará siempre la primera interpretación, mientras que Eval utilizará siempre la segunda.

Nota   En JScript™ no existe confusión entre asignación y comparación porque el operador de asignación (=) es distinto del operador de comparación (==).


Item (Método)

Retorna un miembro específico de una colección mediante una posición o mediante una clave.

Sintaxis

objeto.Item(índice)

El método Item tiene estas partes:

Parte	Descripción
objeto	Requerido. Puede ser cualquier colección de la lista "Aplicable a" o una referencia a ella.
índice	Requerido. Una expresión que especifica la posición de un miembro de la colección. Si es una expresión numérica, índice debe ser un número del 1 al valor de la propiedad Count de la colección. Si es una expresión de cadena, índice se debe corresponder con el nombre del miembro especificado cuando se agregó a la colección. Utilice la constante GlobalModule para tener acceso al módulo Global especial que está siempre presente en la colección Modules.
Comentarios

En general, el orden de los miembros de una colección no puede considerarse estático. Sin embargo, entre adiciones y eliminaciones, los miembros no se mueven.


Reset (Método)

Descarta todo el código de secuencia de comandos y objetos que se han agregado a ScriptControl.

Sintaxis

ScriptControl.Reset

Comentarios

La propiedad State de ScriptControl se restablece a Initialized (0). Esto significa que se ignora todo el código, se destruyen todos los módulos y dejan de ser válidas las referencias a objetos externos.


Run (Método)

Ejecuta un procedimiento especificado.

Sintaxis

objeto.Run(nombreProcedimiento, arg1, arg2, …, argn)

El método Run tiene estas partes:

Parte	Descripción
objeto	Requerido. El objeto donde se ejecuta el procedimiento o una referencia al mismo. Puede ser cualquier objeto de la lista "Aplicable a".
nombreProcedimiento	Requerido. Nombre de cadena del procedimiento que se va a ejecutar.
arg1 - argn	Requerido. Cualquier argumento proporcionado al procedimiento que se va a ejecutar.
Comentarios

Hay dos formas de ejecutar un procedimiento:

•	Utilice el método Run. Para ello, especifique el nombre del procedimiento como una cadena. Esto es útil cuando los nombres de los procedimientos no se conocen de antemano.

•	Utilice la propiedad CodeObject y llámela directamente. Esto es útil cuando conoce los nombres de todos los procedimientos.


Ejemplo del método Add

El siguiente ejemplo muestra el uso del método Add:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Agrega un módulo.

   Set m = sc.Modules.Add("Module1")

   ' Agrega código al módulo.

   m.AddCode "Sub Main : MsgBox ""Hola a todos"" : End Sub"

   ' Ejecuta la secuencia de comandos.

   m.Run "Main"

End Sub


Ejemplo del método AddCode

El siguiente ejemplo muestra el uso del método AddCode:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Agrega un módulo.

   Set m = sc.Modules.Add("Module1")

   ' Agrega código al módulo.

   m.AddCode "Sub Main : MsgBox ""Hola a todos"" : End Sub"

   ' Ejecuta la secuencia de comandos.

   m.Run "Main"

End Sub


Ejemplo del método AddObject

El siguiente ejemplo muestra el uso del método AddObject:

Private Sub Command1_Click()

   Dim p1, sc

   ' Crea una instancia de FileSystemObject.

   Set fs = CreateObject("Scripting.FileSystemObject")

   ' Inicializa ScriptControl.

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = False

   ' Agrega FileSystemObject a ScriptControl

   sc.AddObject "FileSystem", fs, True

   ' Define el código de automatización

   p1 = "Sub Sub1" & vbNewLine & _

        "  Dim Msg" & vbNewLine & _

        "  Msg = ""Tiene """ & vbNewLine & _

        "  Msg = Msg & FileSystem.Drives.Count" & vbNewLine & _

        "  Msg = Msg & "" unidades conectadas.""" & vbNewLine & _

        "  MsgBox Msg" & vbNewLine & _

        "End Sub"

   ' Agrega el código

   sc.AddCode p1

   ' Ejecuta el código

   sc.Run "Sub1"

End Sub


Ejemplo del método Clear

El siguiente ejemplo muestra el uso del método Clear:

Private Sub Command1_Click()

   Dim sc, p1, msg

   p1 = "Sub Main" & vbNewLine & _

        "   On Error Resume Next" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   sc.AddCode p1

   On Error Resume Next

   sc.Run "Main"

   If sc.Error.Number Then

      msg = "Error de automatización" & vbNewLine

      msg = msg & "Error " & sc.Error.Number

      msg = msg & " (" & sc.Error.Description & ")"

      msg = msg & " en la línea: "

      msg = msg & sc.Error.Line

      msg = msg & ", columna: " & sc.Error.Column

      msg = msg & " del código de secuencia de

      comandos."

      MsgBox msg

      sc.Error.Clear

   Else

      MsgBox "No se produjo ningún error."

   End If

End Sub


Ejemplo del método Eval

El siguiente ejemplo muestra el uso del método Eval:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Agrega un módulo.

   Set m = sc.Modules.Add("Module1")

   ' Agrega código al módulo.

   m.AddCode "Private x"

   m.AddCode "x = 1"

   ' Muestra la evaluación de la expresión.

   MsgBox m.Eval("x = y")' Muestra False

End Sub


Ejemplo del método ExecuteStatement

El siguiente ejemplo muestra el uso del método ExecuteStatement:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Agrega un módulo.

   Set m = sc.Modules.Add("Module1")

   ' Agrega código al módulo.

   m.AddCode "Private x"

   m.AddCode "x = 1"

   ' Ejecuta la instrucción de asignación.

   m.ExecuteStatement("x = 3")

   ' Muestra la evaluación de x.

   MsgBox m.Eval("x")

End Sub


Ejemplo del método Item

El siguiente ejemplo muestra el uso del método Item:

Private Sub Command4_Click()

   ' Crea algunas variables.

   Dim sc, m, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' Inicializa el generador de números pseudoaleatorios

   Randomize

   ' Agrega algunos procedimientos al módulo Global.

   For i = 1 To Int((10 * Rnd + 1))

      Code = "Sub Sub" & i & ": MsgBox Sub" & i

      Code = Code & ": End Sub"

      sc.AddCode code

   Next

   ' Agrega algún número de módulos.

   For i = 1 To Int((10 * Rnd + 1))

      ' Agrega un módulo.

      Set m = sc.Modules.Add("Module" & CStr(i))

      ' Agrega algún número de procedimientos.

      For j = 1 To Int((10 * Rnd) + 1)

         ' Crea una plantilla para procedimientos.

         Code = "Sub Sub" & j & ": MsgBox Sub"

         Code = Code & j & ": End Sub"

         ' Agrega un procedimiento al módulo.

         m.AddCode Code

      Next

    Next

    ' Crea un informe de módulos y procedimientos.

    Report = "El código de ScriptControl contiene "

    Report = Report & sc.Modules.Count & " módulos. "

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' Muestra la información.

    MsgBox Report

End Sub


Ejemplo del método Reset

El siguiente ejemplo muestra el uso del método Reset:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = True

    ' Configura el tratamiento de errores.

    On Error Resume Next

    ' Agrega código de secuencia de comandos.

    sc.AddCode "Sub Main " : MsgBox ""Hola a todos"" : End Sub"

    ' Ejecuta el código

    sc.Run "Main

    ' Restablece ScriptControl.

    sc.Reset

    ' Intenta ejecutarlo de nuevo.

    Sc.Run "Main"

    If Err.Number = 438 Then MsgBox "Sub Main ya no existe."

End Sub


Ejemplo del método Run

El siguiente ejemplo muestra el uso del método Run:

Private Sub Command1_Click()

   ' Crea algunas variables.

   Dim sc

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' Agrega la secuencia de comandos a ScriptControl.

   sc.AddCode "Sub Main : MsgBox ""Hola a todos"" : End Sub"

   ' Ejecuta el código de secuencia de comandos.

   sc.Run "Main"

End Sub


Error (Evento)

Se produce como respuesta a un error en tiempo de ejecución.

Sintaxis

Private Sub ScriptControl_Error

Comentarios

Se puede producir un evento Error durante una recepción de evento o durante una llamada directa al motor de secuencia de comandos, al llamar a un evento devuelto por la propiedad CodeObject. Puede encontrar información detallada sobre el error específico mediante diversas propiedades del objeto Error de ScriptControl.


Timeout (Evento)

Se produce cuando ha transcurrido el tiempo especificado en la propiedad Timeout y un usuario ha seleccionado End en el cuadro de diálogo resultante.

Sintaxis

Private Sub ScriptControl_Timeout

Comentarios

Si hay varios objetos ScriptControl, sólo se produce el evento Timeout para el objeto ScriptControl inicial.


Constantes de ScriptControl

El objeto ScriptControl utiliza dos categorías diferentes de constantes: constantes que se aplican a la biblioteca de objetos ScriptControl y constantes que definen el estado de ScriptControl.

Constantes de ScriptControl

Las constantes utilizadas por la biblioteca de objetos ScriptControl son las siguientes:

Constante	Valor	Descripción
GlobalModule	Global	El motor de comandos admite como mínimo un módulo Global, que se crea cuando la propiedad Language de ScriptControl se establece a un lenguaje válido.GlobalModule se utiliza como un índice de la colección Modules de ScriptControl para recuperar este módulo en particular.
NoTimeout	-1	Se utiliza para establecer la propiedad Timeout de ScriptControl de forma que el motor de comandos nunca exceda el tiempo de espera.
Estados de ScriptControl

Las constantes que se utilizan para indicar el estado de ScriptControl son las siguientes:

Constante	Valor	Descripción
Initialized	0	Inicializa el motor de comandos. Éste ejecutará el código pero no recibirá los eventos generados por los objetos agregados mediante el método AddObject.
Connected	1	El motor de comandos recibirá los eventos generados por los objetos agregados mediante el método AddObject.


Agregar un modelo de objetos a Script Control

Una de las principales características de Script Control es que tiene la capacidad de agregar el modelo de objetos de un objeto Automation al control. Esto incluye archivos .DLL ActiveX® y archivos .EXE ActiveX, así como otros objetos. Cuando esto se lleva a cabo, el motor de secuencias de comandos puede llamar y utilizar las propiedades y métodos públicos del objeto. En otras palabras, Script Control se puede comportar como un macromotor que llama a los métodos públicos de las propiedades de un componente o conjunto de componentes.

La siguiente figura muestra una implementación sencilla de este concepto.

Una aplicación que contiene Script Control ejecuta una secuencia de comandos que está contenida en el formulario frmScript. La secuencia de comandos, que está escrita en VBScript, llama a la función Multiply que está definida en el componente MyDLL.dll. La secuencia de comandos asigna el resultado de la función a una variable, le suma 2 y muestra el resultado final.

Utilizar el método AddObject

La sintaxis del método AddObject requiere una cadena y el objeto que desea agregar. La cadena es el nombre del objeto cuando se llama al objeto en una secuencia de comandos. Por ejemplo, el siguiente fragmento de código agrega un módulo de clase llamado MiClase a Script Control. El nombre del objeto se establece a MyScriptObject:

Option Explicit

' Declara la variable de objeto para el objeto MiClase.

Private objMiClase As New MiClase

Private Sub Form_Load()

' El nombre de Script Control is scDemo.

scDemo.AddObject "MiObjetoComandos", objMiClase

End Sub

Si posteriormente escribe una secuencia de comandos que llama a los métodos o propiedades de este objeto, la secuencia de comandos debe usar el nombre MiObjetoComandos. Por ejemplo, si el módulo de clase contiene una función pública denominada Tasar y una propiedad pública llamada Tasa, la secuencia de comandos podría contener el siguiente código:

' Esto es código de VBScript.

Sub EjecutarObjeto()

Dim NuevaTasa

NuevaTasa = InputBox("Nueva tasa:",,.09)

' Establece la propiedad del objeto.

MiObjetoComando.Tasar = NuevaTasa

Dim precio

precio = InputBox("Precio:",,100)

' Realiza una operación con la función Tasar.

MsgBox MiObjetoComando.Tasar(precio)

End Sub

Use el método Run para ejecutar la secuencia de comandos:

ScriptControl1.Run "RunObject"


Crear un proyecto sencillo de secuencia de comandos

Para agregar un modelo de objetos de un componente a Script Control, siga estos pasos y cree un sencillo proyecto en Visual Basic llamado SecuenciaSencilla.

 Para crear el proyecto SecuenciaSencilla

1	En el menú Archivo, haga clic en Nuevo proyecto.

2	En el cuadro de diálogo Nuevo proyecto, haga doble clic en el icono Exe estándar.

3	Presione F4 para abrir la ventana Propiedades. Haga doble clic en la propiedad Name y cambie el nombre del formulario a frmSecuenciaSencilla.

4	Haga doble clic en la propiedad Caption y establezca su valor a Secuencia de comandos sencilla.

5	En el menú Proyecto, haga clic en Agregar módulo de clase.

6	En el cuadro de diálogo Agregar módulo de clase, haga doble clic en el icono Módulo de clase.

Agregará el modelo de objetos a Script Control.

7	En la ventana Propiedades, haga doble clic en Name y cambie el nombre a MiClase.

8	Agregue el siguiente código al módulo de clase:

Option Explicit

Private ObjTasa As Double

Public Property Get Tasa() As Double

    Tasa = ObjTasa

End Property

Public Property Let Tasa(nuevaTasa As Double)

    ObjTasa = nuevaTasa

End Property

Public Function Tasar(precio) As Double

    Tasar = precio + (precio * ObjTasa)

End Function

9	Agregue los controles CommandButton1, TextBox1 y ListBox1 al formulario y establezca sus propiedades a los valores de la siguiente lista.

Control	Propiedad	Valor

CommandButton1	Name	cmdAddCode

Caption	AddCode

Height	255

Left	0

Top	240

Width	1215

TextBox1	Name	txtScript

MultiLine	True

ScrollBars	2 - Vertical

Height	1575

Left	1320

Top	240

Width	4335

 ListBox1	Name	lstProcedures

Height	645

Left	1320

Top 	2150

Width	4335

10	Haga clic con el botón secundario en el cuadro de herramientas y haga clic en Componentes para mostrar el cuadro de diálogo Componentes. Haga doble clic en Microsoft Script Control 5.0 y haga clic en Aceptar.

11	En el cuadro de herramientas, haga doble clic en el icono ScriptControl para agregarlo al formulario.

12	Cambie el nombre de Script Control scDemo.

13	Pegue el código siguiente en la sección Declaration del formulario.

Option Explicit

Private MiObjeto As New MiClase

Private Sub Form_Load()

' Agrega MiObjeto a Script Control. Esto agrega

' el modelo de objetos al

' control.

scDemo.AddObject "objScript", MiObjeto

' Agrega la secuencia de comandos al control TextBox.

txtScript.Text = _

"Sub EstablecerTasa()" & vbCrLf & _

"  Dim Tasa" & vbCrLf & _

"  Tasa = InputBox(""Tasa:"",,.086)" & _

vbCrLf & _

"  objScript.Tasa = Tasa" & vbCrLf & _

"End Sub" & vbCrLf & vbCrLf & _

"Sub PrecioTotal()" & vbCrLf & _

"  Dim precio, ttl" & vbCrLf & _

"  precio = InputBox(""Precio:"",,100)" & _

vbCrLf & _

"  ttl =objScript.Tasar(precio)" & vbCrLf & _

"  MsgBox ttl" & vbCrLf & _

"End Sub"

End Sub

Private Sub cmdAddCode_Click()

' Agrega al control el código del cuadro

' de texto.

scDemo.AddCode txtScript.Text

' Borra el cuadro de lista y agrega el nombre de cada

' procedimiento a la colección Procedures.

lstProcedures.Clear

Dim p As Procedure

For Each p In scDemo.Procedures

lstProcedures.AddItem p.Name

Next

End Sub

Private Sub lstProcedures_Click()

' Run the procedure in the ListBox.

scDemo.Run lstProcedures.Text

End Sub

 Para ejecutar el proyecto SecuenciaSencilla

1	Presione F5 para ejecutar el proyecto.

2	Haga clic en AgregarCódigo para agregar código al control. El control ListBox se llena con los nombres de procedimientos que acaba de agregar.

3	En el control ListBox, haga clic en EstablecerTasa. Un cuadro de diálogo muestra el valor predeterminado 8.6. Cambie la tasa o haga clic en Aceptar.

4	En el control ListBox, haga clic en PrecioTotal. Un cuadro de diálogo muestra el valor predeterminado 100. Cambie el valor y haga clic en Aceptar. Se mostrará el total resultante de sumar el valor más la tasa de impuestos.

 Para modificar el código en el control TextBox

También puede cambiar el código antes de agregarlo de nuevo al control.

1	En el control TextBox, cambie el valor predeterminado EstablecerTasa de MsgBox al valor 4.2

2	Haga clic en AgregarCódigo.

3	En el control ListBox, haga clic en EstablecerTasa. Ahora habrá cambiado el valor predeterminado.

 Agregue un procedimiento en el control TextBox

Pruebe a insertar su propio código en el control TextBox.

1	En el control TextBox, pegue el siguiente código:

Sub TasaVariable()

   Dim Años, resultado, ttlInterés

   Dim i, principal, saldo, interés, hipoteca

   principal = InputBox("Préstamo:",,100000)

   Años = InputBox("Cuánto tiempo:",,15)

   resultado = "Saldo" & vbtab & "Interés" & vbcrlf

   For i = 1 to Años * 12

    interés =  (principal * objScript.Tasa) / 12

    principal = principal - interés

    ttlInterés = ttlInterés + interés

    resultado = resultado & i & vbtab & formatNumber(interés,2) & vbcrlf

    Next

    MsgBox resultado

    MsgBox "Interés total pagado:" & "$" & formatNumber(ttlInterés,2)

  End Sub

2	Haga clic en AgregarCódigo.

3	Haga clic en EstablecerTasa, cambie la tasa y haga clic en Aceptar.

4	Haga clic en TasaVariable para ejecutar el nuevo procedimiento.


Utilizar Microsoft Script Control

Microsoft Script Control permite al usuario escribir y ejecutar secuencias de comandos para cualquier motor de secuencia de comandos. Con Script Control se incluyen dos motores de secuencia de comandos, VBScript y JScript™. Además, puede agregar a Script Control el modelo de objetos de cualquier objeto Automation. Si lo hace, las propiedades y los métodos públicos del objeto Automation quedarán disponibles para que los utilice el motor de secuencia de comandos. Si combina el modelo de objetos de una aplicación con un motor de secuencia de comandos podrá crear una aplicación de automatización que ejecute macros para controlar la aplicación.

Crear una instancia de Script Control

Se puede crear una instancia de Microsoft Script Control como un control o como un objeto Automation independiente. Esta característica permite que cualquier host pueda usar Script Control, mediante cualquier lenguaje de secuencia de comandos.

El siguiente ejemplo puede incluirse en cualquier formulario. Tenga en cuenta que la variable sc no está declarada como de tipo ScriptControl porque no se hace, ni se tiene que hacer, referencia al Control en el proyecto. Siempre y cuando exista y esté registrado Script Control, funcionará el siguiente código:

Private Sub Command1_Click()

Dim sc

Dim strPrograma As String

strPrograma = "Sub Main" & vbCrLf & _

"MsgBox ""Hola mundo""" & vbCrLf & _

"End Sub"

Set sc = CreateObject("ScriptControl")

sc.language = "VBScript"

sc.addcode strPrograma

sc.run "Main"

End Sub

Si hace una referencia explícita a Script Control en las referencias de su proyecto, puede crear una instancia de Script Control si utiliza el siguiente código:

Dim sc As ScriptControl

Mostrar los elementos de la interfaz de usuario

La propiedad AllowUI determina si la máquina de secuencia de comandos puede mostrar o no elementos de la interfaz de usuario. Esto se puede aplicar al propio Script Control, por ejemplo cuando muestra mensajes de tiempo de espera. También se puede aplicar a máquinas de secuencia de comandos que utilizan interfaces de automatización ActiveX™. Por ejemplo, el siguiente código generará un error al intentar mostrar el cuadro de mensaje Hola mundo:

ScriptControl1.AllowUI = False

Dim strX As String

strX = "Sub Hola" & vbCrLf & _

"MsgBox ""Hola mundo""" & vbCrLf & _

"End Sub"

ScriptControl1.AddCode strX

ScriptControl1.Run "Hola" 	' Interfaz de usuario

' no permitida

Crear código de secuencias de comandos

Microsoft Script Control permite crear una aplicación que ejecuta un lenguaje de secuencia de comandos, como VBScript o JScript. Por ejemplo, suponga que tiene un botón en un formulario y que desea ejecutar algún código VBScript al presionar el botón. El botón se llama Ejecutar AsignarNombre y desea que el código de secuencia de comandos ejecute un procedimiento llamado AsignarNombre. La idea es que se ejecute el procedimiento AsignarNombre en el motor de secuencias de comandos VBScript cuando el usuario hace clic en el botón Ejecutar AsignarNombre.

El botón Ejecutar AsignarNombre usa el método Run de Script Control para ejecutar la secuencia de comandos El código que debería aparecer en el evento Click del botón Ejecutar AsignarNombre es el siguiente:

' El nombre del control de secuencia de

' comandos es ScriptControl1.

Private Sub EjecutarAsignarNombre_Click()

ScriptControl1.Run "AsignarNombre"

End Sub

Para crear el resto del código necesario para esta secuencia de comandos, seleccione un lenguaje de secuencia de comandos, agregue el código a un procedimiento y ejecute éste.

1	Seleccione un lenguaje de secuencia de comandos

El primer paso consiste en configurar Script Control para el lenguaje de secuencia de comandos correcto. De forma predeterminada, Script Control usa VBScript como lenguaje de secuencia de comandos. Al crear Script Control como objeto Automation, la propiedad Language no se inicia y se debe establecer mediante código.

Para asignar a la propiedad Language el valor JScript, use la ventana Propiedades. También puede usar la propiedad Language en el código, como se muestra a continuación:

ScriptControl1.Language = "JScript"

Script Control puede usar otros lenguajes de secuencia de comandos.

2	Agregue código a un procedimiento

Antes de ejecutar el procedimiento AsignarNombre, use el método AddCode para agregar todo el procedimiento a Script Control. Se producirá un error si intenta agregar un procedimiento incompleto (que no termine con End Sub o End Function). En el siguiente ejemplo se agrega código de procedimiento a Script Control:

' Cuando se carga la aplicación ScriptRun,

' se agrega el siguiente código al procedimiento

' AsignarNombre del control.

Private Sub Form_Load()

Dim strCódigo As String

strCódigo = _

   "Sub AsignarNombre()" & vbCrLf & _

" Dim strNombre" & vbCrLf & _

" strNombre = InputBox(""¿Nombre?"")" & vbCrLf & _

   " MsgBox ""Su nombre es "" & strNombre" & vbcrLf & _

"End Sub"

ScriptControl1.AddCode strCódigo

End Sub

Como alternativa, puede agregar código de procedimiento mediante un control TextBox:

Private Sub Form_Load()

' El código se guarda en el cuadro de texto

' llamado txtScript del formulario frmScript.

ScriptControl1.AddCode frmScript.txtScript.Text

End Sub

Puede agregar argumentos a un procedimiento o una función.

Private Sub EvalFunc()

' Crea la función.

Dim strFunción As String

strFunción = _

"Function DevolverEsto(x, y)" & vbCrLf & _

" DevolverEsto = x * y" & vbCrLf & _

"End Function"

' Agrega el código y luego ejecuta la función.

ScriptControl1.AddCode strFunción

MsgBox ScriptControl1.Run("DevolverEsto", 3, 25)

End Sub

3	Ejecute el procedimiento

El método Run ejecuta cualquier procedimiento completo que se haya agregado a Script Control. El siguiente fragmento de código ejecuta tres procedimientos definidos:

ScriptControl1.Run "FindName"

ScriptControl1.Run "AddName"

ScriptControl1.Run "Quit"

Ejecutar instrucciones de secuencias de comandos y evaluar resultados

Puede ejecutar una instrucción de secuencias de comandos que utiliza el método ExecuteStatement. Puede evaluar líneas de código de secuencias de comandos con el método Eval. En el siguiente ejemplo, el método ExecuteStatement se usa para asignar el valor 100 a la variable x. Las siguientes dos líneas usan el método Eval para verificar las instrucciones x = 100 y x = 100/2. La segunda línea devuelve True; la tercera línea devuelve False.

Private Sub ProbarEsto()

    ScriptControl1.ExecuteStatement "x = 100"

    MsgBox ScriptControl1.Eval("x = 100")  ' Verdadero

    MsgBox ScriptControl1.Eval("x = 100/2")  ' Falso

End Sub

Usar la propiedad Error

Los errores de Script Control pueden tener dos orígenes distintos: el propio Script Control o la secuencia de comandos que el control está intentando ejecutar. Para depurar el código de secuencia de comandos, use la propiedad Error, que devuelve una referencia al objeto Error. Al usar el objeto Error, Script Control puede devolver el número y la descripción del error y también el número de la línea en la que se produce el error dentro de la secuencia de comandos.

Ejecute el siguiente código para ver un ejemplo de cómo Script Control encuentra un error:

Private Sub MiError()

' Esta secuencia de comandos le permite

' dividir por cero sin obtener un error.

Dim strCódigo As String

strCódigo = _

"Sub DividirPorCero()" & vbCrLf & _

"Dim primo" & vbCrLf & _

"primo = 3" & vbCrLf & _

"MsgBox primo/0" & vbCrLf & _

"End Sub"

On Error GoTo scError

With ScriptControl1

.AddCode strCódigo

.Run "DividirPorCero"

End With

Exit Sub

scError:

' Use el objeto Error para informar al usuario

' del error y en qué línea se ha producido.

Debug.Print ScriptControl1.Error.Number & _

":" & ScriptControl1.Error.Description & _

" en la línea " & ScriptControl1.Error.Line

Exit Sub

End Sub


Utilizar la colección Modules

Usar módulos y procedimientos

En Microsoft® Visual Basic®, el código se escribe en módulos. Cada módulo contiene un conjunto de funciones y procedimientos que se relacionan de una manera lógica. Cada objeto Module de la colección Modules tiene una relación uno a uno con cada secuencia de comandos que desea administrar. Cada objeto Module contiene una colección de objetos Procedure, cada uno de los cuales se puede ejecutar mediante el método Run.

Agregar procedimientos al módulo Global

Script Control contiene un objeto Module predeterminado, el módulo Global. Otros módulos pueden llamar a todos los procedimientos contenidos en el módulo Global. Por ejemplo, el siguiente código devolverá el nombre de módulo predeterminado (Global):

' El control Script se llama scDemo.

MsgBox scDemo.Modules(1).Name ' devuelve "Global"

Si trabaja sólo con un objeto Module, únicamente puede agregar código al módulo Global si llama al método AddCode sin especificar un módulo, como se muestra a continuación:

' Agrega el código del cuadro de texto llamado

' txtMisComandos.

scDemo.AddCode txtMisComandos.Text

De manera similar, puede ejecutar cualquier código que agregue al módulo Global predeterminado si llama al método Run en Script Control:

' Ejecuta un procedimiento llamado EjecutarEsto.

scDemo.Run "EjecutarEsto"

Agregar módulos y procedimientos

Puede usar el método Add, como cualquier objeto de colecciones, para agregar módulos a la colección, asignando un nombre a cada módulo a medida que lo agrega. Por tanto, puede usar dicho nombre para especificar el objeto Module y llamar a sus procedimientos.

En el siguiente ejemplo, en primer lugar se agrega a la colección un módulo denominado Números. A continuación, el código agrega los procedimientos de un control TextBox al objeto Module de dicha colección. Finalmente se ejecuta un procedimiento del módulo.

scDemo.Modules.Add "Números"

scDemo.Modules("Números").Procedures.Add _

txtMisComandos.Text

' Ejecuta un procedimiento llamado Factores.

scDemo.Run scDemo.Modules("Números"). _

Procedures("Factores")

Borrar la colección Modules

Para borrar todos los objetos Module de la colección Modules, use el método Reset. La propiedad Count de la colección se restablecerá al valor 1 y sólo permanecerá el objeto del módulo Global. También se borrarán todos los procedimientos (incluidos los almacenados en el módulo Global).

Usar la propiedad CodeObject

Después de haber poblado un objeto Module con procedimientos, puede usar la propiedad CodeObject para llamar directamente a un procedimiento en lugar de usar el método Run. El siguiente código es un ejemplo de esto:

Dim modX As Module

Set modX = scDemo.Modules.Add("miMód")

Dim strX As String

strX = "Sub Hola" & vbCrLf & _

"MsgBox ""Hola mundo""" & vbCrLf & _

"End Sub"

modX.AddCode strX

Dim objX As Object

' Establece la variable a CodeObject y llama

' al procedimiento.

Set objX = modX.CodeObject

objX.Hola