Recorrer objetos en parejas

6 envíos / 0 nuevos
Último envío
Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Recorrer objetos en parejas

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

 

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 6 horas 13 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
Re: Recorrer objetos en parejas

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.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Re: Recorrer objetos en parejas

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

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 6 horas 13 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
Re: Recorrer objetos en parejas

¿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.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Re: Recorrer objetos en parejas

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.

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Re: Recorrer objetos en parejas

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