Como enviar un objeto como parametro a una función o procedimiento

Bríndenme un poco de su ayuda.

Estoy haciendo una procedimiento que se ejecuta al ingresar a un textbox.

Al ingresar al textbox el procedimiento llama a un formulario. El usuario interactúa con el formulario y como resultado devuelve un valor que debería quedar en el textbox que origino la llamada. He tratado de poner el parámetro como textbox y como object, pero en la ejecución me indica el error: No coinciden los tipos (si defino el parámetro como textbox), se requiere un objeto (si defino el parámetro como objeto).

El código que uso:

  • El llamado (donde se produce el error)
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    proceso TextBox1
End Sub

  • El procedimiento en un módulo
Sub proceso(obj As TextBox)
    valor = -1
    UserForm1.Show
    Do While valor = -1
       DoEvents
    Loop
    MsgBox valor
    obj.Text = valor
End Sub

1 respuesta

Respuesta
-1

Te explico los pasos y luego te queda colocar las instrucciones con tus referencias:

1- Si se ejecuta al ingresar en un Textbox, el evento del Textbox puede ser Enter, por ej:

Private Sub TextBox2_Enter()
UserForm6.Show
End Sub

2- Con ese código el primer formulario queda abierto. Por lo tanto se puede hacer mención a sus controles.

3- El segundo formulario, en algún momento se cerrará... y en el evento de cierre se pasa el valor necesario al textbox de origen, que en mi ejemplo es el Userform2. Algo como esto:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'evento de cierre del 2do formulario
UserForm2.TextBox2 = Me.TextBox3

Gracias por responder, Elsa:

Puede que me haya faltado explicarlo mejor.

Cuando digo que envío el parámetro como textbox y que el valor debería quedar en el textbox que origino la llamada, es porque el procedimiento puede ser llamado de diferentes textbox. Por favor hecha una releída, quizás puedas encontrar la solución a mi problema.

Solo reemplacé tu llamada a 'proceso' a llamar directamente al otro formulario, ya que así mencionas en tu consulta inicial: '.. Al ingresar al textbox el procedimiento llama a un formulario.'

O sea que cada control Textbox tendrá en su evento Enter este llamado. Faltaría aquí reconocer quien lo llama... para volver allí con el valor y para eso utilicé una variable declarada como pública al inicio de cualquier módulo:

Public nbre as String

Private Sub TextBox1_Enter()
nbre = "TextBox1"
UserForm3.Show
End Sub
Private Sub TextBox2_Enter()
nbre = "TextBox2"
UserForm3.Show
End Sub
Private Sub TextBox3_Enter()
nbre = "TextBox3"
UserForm3.Show
End Sub

Y en el otro Userform, en algún evento que puede ser al cerrarlo se vuelca ese texto en el control desde donde fue llamado:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserForm2.Controls(nbre) = TextBox1.Text
End Sub

Tengo el ejemplo a tu disposición. Podés solicitarlo a los correos que aparecen en el sitio que dejo al pie.

Gracias por responder tan pronto.

Me gustaría poder poner la aplicación aquí, para que todos la vieran. En verdad aprecio tu interes y quisiera que tú y todos pudieran ver el código, el que puse en la pregunta, aplicado en un ejemplo. En realidad todo lo que me dices se sale de la pregunta que es como envío el objeto como parámetro. Yo envío el objeto, un textbox, como párametro obj, la función devuelve el valor de la siguiente forma: obj.text=valor

Yo no tengo problema con eso, el problema es el que describo en la pregunta, el error que me da al mandarlo como objeto o como texto. El código que puse funciona, ¿Trataste de probarlo?, pero sólo funciona si le quito el "as textbox"

Subí este video de ejemplo para que vieras la aplicación de este código. Este es un ejemplo simple, un caso en que se podría usar un combobox, pero el proceso podría ser cualquier cosa. Yo lo uso para obtener datos que no se pueden poner en un combobox

En lugar del video debieras colocar el libro con el ejemplo en algún sitio de descarga y así podemos ver tu código. Porque si bien dices que funciona a mí no me da resultados... pero claro, solo traté de recrear tus uf y tu código y quizás no sean así en realidad.

Ahora, ¿yo probé tu código y que te parece si pruebas el mío? Con un Userform2 para los 3 primeros controles (2 textbox y un combobox) y un Userform1 con un listbox para los valores a seleccionar (apto para cualquier tipo de controles)

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    proceso (TextBox1.Name)
End Sub
Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    proceso (TextBox2.Name)
End Sub
Private Sub ComboBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    proceso (ComboBox1.Name)
End Sub
Private Sub CommandButton2_Click()    
'guarda el dato seleccionado y cierra el UF 1
dato = ListBox1.Value
Unload Me
End Sub

En un módulo:

Public dato As String      'los datos a seleccionar son textos en el ejemplo
Sub proceso(nbre) 
UserForm1.Show
UserForm2.Controls(nbre) = dato
End Sub

Sdos. Quizás no sea lo que 'quieres' pero sí es lo que resuelve tu consulta. 

Se que el código que puse no funciona. La idea de poner el código era que alguien me dijera porqué no funciona. Olvídate de código y de todo lo que haya dicho. Nunca te acercaste a responder la pregunta, que es como enviar objetos como parámetros. Solicité eliminar este tema, por falta de expertos.

Evidentemente hablamos idiomas diferentes. Creo que lo que te envié hace justamente eso, enviar objetos (textbox, combobox, etc) como parametros.

Pero evidentemente no se te entiende considerando que pasaron varios días y nadie aporto algo mejor.

Ahora, ¿esto merece una votación negativa? He dedicado tiempo a intentar acercarte una solución o si lo prefieres una alternativa... Tu votación habla más MAL de ti que de mi respuesta...

Esto es un foro, los que participamos ponemos nuestras mejores intenciones y conocimiento en ayudar. Has sido en extremo una mala persona valorando de ese modo. Quizás todavía decidas anularla.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas