Hola
Tengo una hoja donde hay una lista con varias columnas. La primera es un nombre, y a partir de ahí, las demás columnas son datos o cálculos.
Quiero que al darle a un botón me presente un formulario donde he colocado una serie de textbox y combobox relacionados. En el texbox pondré números (cantidades) y en el combo puedo seleccionar entre todos los nombres que tengo en la columna A.
Hasta aquí no tengo problemas. La duda viene en lo siguiente. Al darle al botón Ok la macro tiene que recorrer los controles de manera que identifique cada textbox con un combo. El resultado debe ser operar con el número del textbox en una columna determinada, pero solo en la fila que le corresponde según la selección que se haya hecho en el combo correspondiente.
Si no hubiera esa relación entre los componentes diferentes, la solución sería sencilla, y es la que utilizo para borrar los controles al activar el formulario:
Private Sub UserForm_Activate()
Dim a As Byte
Dim Combo As Control
Dim miControl As String
For Each Combo In UserForm2.Controls
miControl = Mid(Combo.Name, 1, 4) 'se fija cómo empieza el nombre
If miControl = "Comb" Then
Combo.Clear
Else
If miControl = "Text" Then
Combo.Text = ""
End If
End If
Next Combo
End Sub
Solución obtenida fácilmente de internet :P
Pero no sé cómo relacionar en el código el txtbox con el combo.
Muchas gracias
no sé si lo he entendido muy bien.a ver si esta pista te sirve:
se trataría de encontrar la fila donde se encuentra el nombre que has elegido en el combo
si fuese una fórmula de excel yo emplearía la función Coincidir para encontrar la posición de ese nombre dentro de la lista de nombres.
Bueno, pues también puedes utilizar las funciones de Excel dentro del código VBA (lo único que con su nombre en inglés y no todas las funciones están disponibles. En concreto la función coincidir sí está)
Application.WorksheetFunction.Match(...
------
Ya sé Excel, pero necesito más ahora en pdf
------
Ya sé Excel, pero necesito más.
Gracias por contestar tan rápido.
Ese no es mi problema. Relleno los datos del combo sin problemas.
La resolución también la hago sin problemas, porque me he creado una hoja auxiliar donde calculo la posición de lo que aparezca en el combo, y luego es sencillo resolver el tema con ActiveCell.Offset
El problema lo tengo en medio. Lo que hago ahora es ir pareja por pareja y repitiendo el código para cada pareja de controles.
Algo así:
If ComboBox1.Value <> "" Then
If TextBox1.Value <> "" Then
Worksheets("Ayuda búsqueda").Activate 'La hoja auxiliar
Range("A1").Value = ComboBox1.Value 'Cambio el valor en A1 para recalcular la posición
a = Range("A3").Value 'Resultado del cálculo de la posición del valor del combo en la lista
Worksheets("Cron Hill").Activate 'Vuelvo a la hoja principal
Range("A1").Select 'A partir de aquí opero con mis datos
ActiveCell.Offset(a, 5).Value = ActiveCell.Offset(a, 5).Value + TextBox1.Value
ActiveCell.Offset(a, 13).Value = ActiveCell.Offset(a, 13).Value - (TextBox1.Value / ActiveCell.Offset(a, 2).Value)
End If
End If
A partir de aquí repito el código para todas las parejas de controles TextBox + ComboBox
Me gustaría poder hacer un bucle For...Next que cuando trabaje con el ComboBox15 también actúe con el TextBox15, sin tener que repetir el código 15 veces.
Gracias
¿por qué no utilizas el nombre del control para referirte a él?
emplea la colección Controls del formulario, por ejemplo
Me.Controls("textbox1").Text = "hola"
también puedes hacer un bucle por todos estos controles (no distingue por tipos). Dentro del bucle comprueba por ejemplo su nombre
Dim recorrercontrol As Control
For Each recorrercontrol In Me.Controls
MsgBox recorrercontrol.Name
Next
pongo Me en estos ejemplo porque supongo que el código está dentro del propio formulario.
------
Ya sé Excel, pero necesito más ahora en pdf
------
Ya sé Excel, pero necesito más.
Pues me acabas de dar una idea con lo de Me.Controls("textbox1")
No sabía que me podía referir a los controles así.
Haré un bucle con una variable byte que haga de contador y utilizaré un par de variables de texto para poner los nombres.
Es tan sencillo como llamar a Me.Controls(variablecombo) o (variabletext), habiendo dado previamente a estas variables el valor de "comboBox"+contador o de "textbox"+contador
Si te parece, lo pruebo y si funciona copio aquí el código.
Muchas gracias.
Parece que funciona, aunque no he encontrado la manera de "concatenar" un string con el valor de una variable byte. Lo que he hecho es volver a apoyarme en mi hoja de apoyo de cálculos y utilizar directamente la orden "concatenar" de Excel, tomando posteriormente los valores de las celdas.
Queda algo como esto:
Private Sub CommandButton1_Click()
Dim a, contador As Byte
Dim vcombo, vtext As String
Application.ScreenUpdating = False
For contador = 1 To 11 ' hay 11 parejas de controles en este formulario
Worksheets("Ayuda búsqueda").Cells(7, 1).Value = contador 'En mi hoja de ayuda establezco el valor en la celda predeterminada
vcombo = Worksheets("Ayuda búsqueda").Cells(10, 1).Value 'Asigno los valores de las celdas calculadas con CONCATENAR
vtext = Worksheets("Ayuda búsqueda").Cells(11, 1).Value
If Me.Controls(vcombo).Value <> "" Then
If Me.Controls(vtext).Value <> "" Then 'Compruebo que tanto el combo como el text tienen valor
Worksheets("Ayuda búsqueda").Activate
Range("A1").Value = Me.Controls(vcombo).Value
a = Range("A3").Value
Worksheets("Cron Hill").Activate
Range("A1").Select
ActiveCell.Offset(a, 5).Value = ActiveCell.Offset(a, 5).Value + Me.Controls(vtext).Value
ActiveCell.Offset(a, 13).Value = ActiveCell.Offset(a, 13).Value - (Me.Controls(vtext).Value / ActiveCell.Offset(a, 2).Value)
End If
End If
Next contador
Range("N2").Select ' A partir de aquí recorro una columna entera para eliminar los valores 0 que resulten. Queda más limpio
For a = 0 To Range("A37").Value - 1
If ActiveCell.Offset(a, 0).Value = 0 Then ActiveCell.Offset(a, 0).Value = ""
Next a
Application.ScreenUpdating = True 'Por educación, jeje
UserForm1.Hide
End Sub