Macro Excel que haga referencia a uno o otro control

Esta macro la reconoces ¿qué pretendo?

Sub Seleccionar_Linea()
'comentado x Elsamatilde
    'activa la celda A2 (de la hoja activa)
Range("a2").Activate
    'declara una variable que contendrá las celdas de la región actual
Set Rango = Range("A1").CurrentRegion
    'guarda en la variable 'Valor' el dato seleccionado de la lista
    'listindex indica el nro de índice del elemento seleccionado
valor = MPAG.cmbEdProv.List(MPAG.cmbEdProv.ListIndex)
    'busca ese valor en el rango y si lo encuentra lo selecciona
Rango.Find(What:=valor, LookAt:=xlWhole, After:=ActiveCell).Activate 'Busca la linea, el valor seleccionado en el Combno
Range("A" & ActiveCell.Row & ":i" & ActiveCell.Row).Select 'Selecciona linea de la celda seleccionada
End Sub

En el formulario, tengo una pagina con 4 pestañas como `podiste ver en el tema anterior, en las pestañas Edicion (2ª y 4ª) los controles Combo tiene nombre diferente como es obvio.

Dime o hazme algo para que use la MISMA MACRO para los 2 controles segun este usando, o uno o otro.

Uno es:   valor = MPAG.cmbEdProv.List(MPAG.cmbEdProv.ListIndex)

Y el otro seria. O lo es:  valor = MPAG. CmbEdProd. List(MPAG. CmbEdProd. ListIndex)

1 Respuesta

Respuesta
1

La rutina se ejecuta seguramente al Change o Click del control Combobox, cualquiera sea su nombre.

Dejo entonces las macros para 2 controles (debes ajustar el nombre de cada uno y si tiene más de una col seguir el ejemplo de la lista que dejara en macro original.)

Dim Valor    'variable de alcance en todo el formulario.
Private Sub ComboBox1_Change()
'guarda en la variable 'Valor' el dato seleccionado y llama a la macro
Valor = ComboBox1.Value
Call Seleccionar_Linea
End Sub
Private Sub ComboBox2_Change()
Valor = ComboBox2.Value
Call Seleccionar_Linea
End Sub
Sub Seleccionar_Linea()
'x Elsamatilde
    'activa la celda A2 (de la hoja activa)
Range("a2").Activate
    'declara una variable que contendrá las celdas de la región actual
Set Rango = Range("A1").CurrentRegion
    'busca el Valor en el rango y si lo encuentra lo selecciona
Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate 'Busca la linea, el valor seleccionado en el Combno
Range("A" & ActiveCell.Row & ":i" & ActiveCell.Row).Select 'Selecciona linea de la celda seleccionada
End Sub

Sdos

Elsa

Perdoname Elsa pero he estado dando vueltas a esto y no logro dar con el fallo.

Con esta macro funciona perfecto

Private Sub cmbEdProd_Change()
Dim busq As Range
'-----
Dim Valor 'variable de alcance en todo el formulario.
'guarda en la variable 'Valor' el dato seleccionado y llama a la macro
Valor = cmbEdProd.value
Call Seleccionar_Linea
'-----
On Error GoTo o
Set busq = Sheets("Prod_Entrada").Cells.Find(cmbEdProd, LookAt:=xlWhole)
txtcli10 = busq.Offset(0, -1) 'Item
txtcli20 = busq.Offset(0, 0) 'Producto/Descripcion
txtcli30 = busq.Offset(0, 1) 'Cod
txtcli40 = busq.Offset(0, 2) 'cantidad
txtcli50 = busq.Offset(0, 3) 'Ubicacion
txtcli60 = busq.Offset(0, 4) 'Precio+IVA
txtcli60 = Format(txtcli60, "currency")
txtcli70 = busq.Offset(0, 5) '#Factura
txtcli70 = Format(txtcli70, "000000")
txtcli80 = busq.Offset(0, 7) 'Observaciones
Exit Sub
o: txtcli20 = ""
End Sub

En un modulo para las 2 Change esto

Sub Seleccionar_Linea()
'x Elsamatilde
    'activa la celda A2 (de la hoja activa)
Range("a2").Activate
    'declara una variable que contendrá las celdas de la región actual
Set Rango = Range("A1").CurrentRegion
    'busca el Valor en el rango y si lo encuentra lo selecciona
Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate 'Busca la linea, el valor seleccionado en el Combno
Range("A" & ActiveCell.Row & ":L" & ActiveCell.Row).Select 'Selecciona linea de la celda seleccionada
End Sub

En la iguiente me manda error  en linea:

Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate 'Busca la linea, el valor seleccionado en el Combno

y dice: Error 91 en tiempo de ejecucion. Variable de objeto o bloque With no establecido

Private Sub cmbEdProv_Change()
Dim busq As Range
'----
Dim Valor 'variable de alcance en todo el formulario.
'guarda en la variable 'Valor' el dato seleccionado y llama a la macro
Valor = cmbEdProv.value
Call Seleccionar_Linea
'----
On Error GoTo o
Set busq = Sheets("Proveedor").Cells.Find(cmbEdProv, LookAt:=xlWhole)
txtmoc100 = busq.Offset(0, -2) 'Item
txtmoc20 = busq.Offset(0, -1) 'Razon Social/Proveedor
txtmoc30 = busq.Offset(0, 0) 'RIF/CI
txtmoc40 = busq.Offset(0, 1) 'Direccion
txtmoc50 = busq.Offset(0, 2) 'Ciudad
txtmoc200 = busq.Offset(0, 3) 'Articulos
txtmoc60 = busq.Offset(0, 4) 'Telf 1
txtmoc70 = busq.Offset(0, 5) 'Telf 2
txtmoc80 = busq.Offset(0, 6) 'Observaciones
Exit Sub
o: txtmoc4 = ""
End Sub

La misma macro original, la de arriba de todo esto, la duplico y le doy nombre Sub Seleccionar_Linea() y Sub Seleccionar_Linea1()  Asigno a un change Call Sub Seleccionar_Linea() y a otro Call Seleccionar_Linea1(), funciona bien la 1ª ves que la uso pero aun sin cerrar el form, voy para usala la 2ª ves y me manda

Error 381 en tiempo de ejecucion

No se puede obtener la propiedad List. Indice de matriz de propiedades no valido.

Per osi cierro el form y vuelvo repite lo mismo, uso la primera ves en los 2 change y si voy para usar la 2ª vez el mismo error siempre

Todo el código que dejé en el cuadro al inicio, va EN EL FORMULARIO, nada va en módulo.

Solo debes REEMPLAZAR LOS NOMBRES DE LOS COMBOS, cmbEdProv en todas las veces que aparece Combobox1 y el otro nombre de tu control donde dice Combobox2

Hasta aquí lo que solicitaste está perfectamente respondido. Los 2 combos pueden utilizar la misma rutina para seleccionar el rango A:L de la fila del dato encontrado.

Pero ahora le estás agregando algo más... ya no solo es 'seleccionar la fila'... sino que pasas datos a los campos... ¿entonces PARA QUE SELECCIONAR LA FILA?

No puedes tomar códigos que ves en otras respuestas y tratar de colocarlo en tu formulario, si tu tarea es otra.

Por favor, realiza tu consulta puntual. Solicitá lo que necesites en concreto, no tratando de adaptar rutinas de otros o para otros casos.

Por lo tanto para nuevas tareas debes dejar nuevas consultas.

Sdos!

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas