Saltar al contenido

Ayuda macro


Jemudel

Recommended Posts

publicado

Buenas a todos,

Necesito ayuda para una macro que no tengo forma de hacerla.

Tengo una tabla con 5 columnas, sus encabezados se llaman “A”, “B”, “C”, “D” y “E”.

Busco datos en las columnas A B C y D, y cuando coincidan me den el dato que hay en la celda correspondiente de la columna E.

Muchas gracias de antemano.

publicado

Set ws = ThisWorkbook.Worksheets("Datos hidráulicos") ' Nombre de tu hoja específica.
    Set tbl = ws.ListObjects("TablaHidráulica") ' Nombre de tu tabla específica.
    Model = Me.MODELO
    
      If Me.CheckBox_PRESOSTATO = True Then Presostato = "SI"
      If Me.CheckBox_PRESOSTATO = False Then Presostato = "NO"
      
      If Me.OptionButton_010MS = True Then Velocidad = "0,10 m/s."
      If Me.OptionButton_015MS = True Then Velocidad = "0,15 m/s."
      If Me.OptionButton_020MS = True Then Velocidad = "0,20 m/s."

    
    'Para modelo PHE-15
      If Me.RECORRIDO.Value <= 5900 Then RecorridoDep = "HASTA 5900mm."
      If Me.RECORRIDO.Value > 5900 Or Me.RECORRIDO.Value <= 8500 Then RecorridoDep = "DE 5901mm. A 8500mm."
    'Para modelo PHE-30
      If Me.RECORRIDO.Value <= 3900 Then RecorridoDep = "HASTA 3900mm."
      If Me.RECORRIDO.Value > 3900 Or Me.RECORRIDO.Value <= 6100 Then RecorridoDep = "DE 3901mm. A 6100mm."
      If Me.RECORRIDO.Value > 6100 Or Me.RECORRIDO.Value <= 10000 Then RecorridoDep = "DE 6101mm. A 10000mm."
    'Para modelo PHE-50
      If Me.RECORRIDO.Value <= 2700 Then RecorridoDep = "HASTA 2700mm."
      If Me.RECORRIDO.Value > 2700 Or Me.RECORRIDO.Value <= 4300 Then RecorridoDep = "DE 2701mm. A 4300mm."
      If Me.RECORRIDO.Value > 4300 Or Me.RECORRIDO.Value <= 9500 Then RecorridoDep = "DE 4301mm. A 9500mm."
      If Me.RECORRIDO.Value > 9500 Or Me.RECORRIDO.Value <= 10000 Then RecorridoDep = "DE 9501mm. A 10000mm."
      If Me.RECORRIDO.Value > 10000 Or Me.RECORRIDO.Value <= 12000 Then RecorridoDep = "DE 10001mm. A 12000mm."
    'Para modelo PHE-70
      If Me.RECORRIDO.Value <= 1900 Then RecorridoDep = "HASTA 1900mm."
      If Me.RECORRIDO.Value > 1900 Or Me.RECORRIDO.Value <= 3100 Then RecorridoDep = "DE 1901mm. A 3100mm."
      If Me.RECORRIDO.Value > 3100 Or Me.RECORRIDO.Value <= 7100 Then RecorridoDep = "DE 3101mm. A 7100mm."
      If Me.RECORRIDO.Value > 7100 Or Me.RECORRIDO.Value <= 7500 Then RecorridoDep = "DE 7101mm. A 7500mm."
      If Me.RECORRIDO.Value > 7500 Or Me.RECORRIDO.Value <= 10000 Then RecorridoDep = "DE 7501mm. A 10000mm."
    
    
    Set C = tbl.ListColumns("MODELOS").Range.Find(Model, , , xlWhole)
    If Not C Is Nothing Then
        For i = C.Row - 1 To tbl.ListRows.Count + 1
            If C = tbl.DataBodyRange(i, tbl.ListColumns("MODELOS").Index) Then
                If tbl.DataBodyRange(i, tbl.ListColumns("PRESOSTATO").Index) = Presostato Then
                    If tbl.DataBodyRange(i, tbl.ListColumns("VELOCIDAD").Index) = Velocidad Then
                        If tbl.DataBodyRange(i, tbl.ListColumns("RECORRIDOS").Index) = RecorridoDep Then
                            Deposito = tbl.DataBodyRange(i, tbl.ListColumns("DEPÓSITO").Index)
                            CodDeposito = tbl.DataBodyRange(i, tbl.ListColumns("COD. DEPÓSITO").Index)
                            Exit For
                        End If
                    End If
                End If
            End If
        Next i
    End If
    
    Application.Sheets("Valores").Range("D2").Value = Deposito
    Application.Sheets("Valores").Range("D3").Value = CodDeposito


   End Sub

El codigo que tengo es este con una tabla con encabezados image.thumb.png.74b9136e4e14a68c5f5066457db7ee4d.png

y un formulario  con un combobox donde elijo el modelo, un textbox donde introduzco el recorrido, un chektbox donde marco si lleva presostato o no y un opcionbutton donde elijo la velocidad.

rellenando el formulario, lo que quiero es que donde coincidan los valores, me de el valor de la celda de la fila donde coinciden de la columna DEPOSITO.

 

publicado

Hola Jesus!!!

No es exactamente lo que busco.

Lo que necesito es que me de el valor de la columna "DEPÓSITOS".

Por ejemplo:

Elijo

Modelo: "PHE-30" debe buscar en la tabla columna "MODELOS" celda "PHE-30".

Presostato: "SI" debe buscar en la tabla columna "PRESOSTATO" celda "SI"

Velocidad: "0,15m/s."  debe buscar en la tabla columna "VELOCIDAD"  celda "0,10m/s."

Recorrido: "5000" debe buscar en la tabla columna "RECORRIDOS"   celda "DE 3901 mm. a 6100mm."

Y con estas coincidencias en la misma fila de la tabla, me de el valor de la columna "DEPOSITOS" que sería en este caso "20L".

 

A ver si así te vale lo que necesito Jesús.

Muchas gracias por tu interés y tiempo.

 

 

publicado
Private Sub ACEPTAR_Click()
'Aqui habilitamos el botón de "Ir a Excel".
    Me.SALIR.Enabled = True
    

Dim Hoja As Worksheet
    Set Hoja = ThisWorkbook.Sheets("Valores")

        Hoja.Range("A6").Value = Me.MODELO.Value

        
'Ingresamos los valores de cada casilla en las celdas correspondientes. (MODELO)

     Application.Sheets("Valores").Range("D1").Value = Me.MODELO.Value
     

     
'Ingresamos el valor de la "VELOCIDAD".
 
    If Me.OptionButton_010MS.Value = True Then
            Application.Sheets("Valores").Range("D5").Value = "0,10 m/s"
        ElseIf Me.OptionButton_015MS.Value = True Then
            Application.Sheets("Valores").Range("D5").Value = "0,15 m/s"
        ElseIf Me.OptionButton_020MS.Value = True Then
            Application.Sheets("Valores").Range("D5").Value = "0,20 m/s"
        Else
    End If
    

'Aqui definimos los valores de los datos a buscar.
        Dim ws As Worksheet 'Variable para todas las busquedas.
        Dim tbl As ListObject 'Variable para todas las busquedas.
        Dim Model As String 'Variable para todas las busquedas.
        Dim Velocidad As String 'Variable para todas las busquedas.
        Dim Voltaje As String 'Variable para todas las busquedas.
        Dim Presostato As String 'Variable para todas las busquedas.
        Dim C As Range, i& 'Variable para todas las busquedas.
        Dim RecorridoDep As String 'Variable para todas las busquedas.
             Dim Deposito$
        Dim CodDeposito$
        
        
        

    Set ws = ThisWorkbook.Worksheets("Datos hidráulicos") ' Nombre de tu hoja específica.
    Set tbl = ws.ListObjects("TablaHidráulica") ' Nombre de tu tabla específica.
    Model = Me.MODELO
    
      If Me.CheckBox_PRESOSTATO = True Then Presostato = "SI"
      If Me.CheckBox_PRESOSTATO = False Then Presostato = "NO"
      
      If Me.OptionButton_010MS = True Then Velocidad = "0,10 m/s."
      If Me.OptionButton_015MS = True Then Velocidad = "0,15 m/s."
      If Me.OptionButton_020MS = True Then Velocidad = "0,20 m/s."

    
    'Para modelo PHE-15
    If Me.MODELO = "PHE-15" Then
      If CDbl(Me.RECORRIDO.Value) <= 5900 Then RecorridoDep = "HASTA 5900mm."
      If CDbl(Me.RECORRIDO.Value) > 5900 And CDbl(Me.RECORRIDO.Value) <= 8500 Then RecorridoDep = "DE 5901mm. A 8500mm."
    
    'Para modelo PHE-30
    ElseIf Me.MODELO = "PHE-30" Then
      If CDbl(Me.RECORRIDO.Value) <= 3900 Then RecorridoDep = "HASTA 3900mm."
      If CDbl(Me.RECORRIDO.Value) > 3900 And CDbl(Me.RECORRIDO.Value) <= 6100 Then RecorridoDep = "DE 3901mm. A 6100mm."
      If CDbl(Me.RECORRIDO.Value) > 6100 And CDbl(Me.RECORRIDO.Value) <= 10000 Then RecorridoDep = "DE 6101mm. A 10000mm."
    
    'Para modelo PHE-50
    ElseIf Me.MODELO = "PHE-50" Then
      If CDbl(Me.RECORRIDO.Value) <= 2700 Then RecorridoDep = "HASTA 2700mm."
      If CDbl(Me.RECORRIDO.Value) > 2700 And CDbl(Me.RECORRIDO.Value) <= 4300 Then RecorridoDep = "DE 2701mm. A 4300mm."
      If CDbl(Me.RECORRIDO.Value) > 4300 And CDbl(Me.RECORRIDO.Value) <= 9500 Then RecorridoDep = "DE 4301mm. A 9500mm."
      If CDbl(Me.RECORRIDO.Value) > 9500 And CDbl(Me.RECORRIDO.Value) <= 10000 Then RecorridoDep = "DE 9501mm. A 10000mm."
      If CDbl(Me.RECORRIDO.Value) > 10000 And CDbl(Me.RECORRIDO.Value) <= 12000 Then RecorridoDep = "DE 10001mm. A 12000mm."
    
    'Para modelo PHE-70
    ElseIf Me.MODELO = "PHE-50" Then
      If CDbl(Me.RECORRIDO.Value) <= 1900 Then RecorridoDep = "HASTA 1900mm."
      If CDbl(Me.RECORRIDO.Value) > 1900 And CDbl(Me.RECORRIDO.Value) <= 3100 Then RecorridoDep = "DE 1901mm. A 3100mm."
      If CDbl(Me.RECORRIDO.Value) > 3100 And CDbl(Me.RECORRIDO.Value) <= 7100 Then RecorridoDep = "DE 3101mm. A 7100mm."
      If CDbl(Me.RECORRIDO.Value) > 7100 And CDbl(Me.RECORRIDO.Value) <= 7500 Then RecorridoDep = "DE 7101mm. A 7500mm."
      If CDbl(Me.RECORRIDO.Value) > 7500 And CDbl(Me.RECORRIDO.Value) <= 10000 Then RecorridoDep = "DE 7501mm. A 10000mm."
    
    End If
    Set C = tbl.ListColumns("MODELOS").Range.Find(Model, , , xlWhole)
    If Not C Is Nothing Then
        For i = C.Row - 1 To tbl.ListRows.Count + 1
            If C = tbl.DataBodyRange(i, tbl.ListColumns("MODELOS").Index) Then
                If tbl.DataBodyRange(i, tbl.ListColumns("PRESOSTATO").Index) = Presostato Then
                    If Trim(tbl.DataBodyRange(i, tbl.ListColumns("VELOCIDAD").Index)) = Velocidad Then
                        If tbl.DataBodyRange(i, tbl.ListColumns("RECORRIDOS").Index) = RecorridoDep Then
                            Deposito = tbl.DataBodyRange(i, tbl.ListColumns("DEPÓSITO").Index)
                            CodDeposito = tbl.DataBodyRange(i, tbl.ListColumns("COD. DEPÓSITO").Index)
                            Exit For
                        End If
                    End If
                End If
            End If
        Next i
    End If
    
    Application.Sheets("Valores").Range("D2").Value = Deposito
    Application.Sheets("Valores").Range("D3").Value = CodDeposito


   End Sub

 

publicado

Eres una maquina!!!!

Muchisimas gracias Jesús!!!

Soy nuevo en esto, me gustaria que me explicaras en que ha consistido la correccion para entender un poco lo que has hecho y cual era mi error.

Te lo agradeceria, ya que no quiero solo copiar y pegar, quiero entender lo que hago para seguir aprendiendo.

Muchas gracias de nuevo!!!!!

 

publicado

Bien, observa las modificaciones de tu macro investiga un poco sobre ellas y si no consigues entenderlas dímelo y te lo explico

  • 1 month later...
publicado

Hola Jesús,

Acabo de probarlo y si hago lo que me dices, ahora no me encuentra los valores a 0,20m/s.

No se como hacerlo para que funcione.

Gracias!!

1(1) (1).xlsm

publicado

Lo que no se exactamente si la macro funciona de la siguiente forma:

 

Busca primero el valor del "MODELO", una vez que encuentra el modelo, se va a la columna "PRESOSTATO", una vez que encuentra el si o no en la misma linea, se va a la columna "VELOCIDAD", cuando encuentra la velocidad en la misma linea que los otros dos valores, se va a la columna "RECORRIDOS" y cuando encuentra el valor del recorrido, me muestra el valor de la linea "DEPOSITO" y "COD. DEPOSITO".

Es asi como funciona?

publicado

Pero bueno no te lo encuentra porque en tu base de datos no tienes ninguno  con las características:

PHE-70   5000  0.20 m/s.

Prueba con PHE-70   10000  0.20 m/s.  veras como si te muestra el resultado

publicado

Pero si le digo que busque en <=10000, deberia encontrarlo, no? ya que le estoy diciendo menor o igual a 10000, no igual a 10000, pienso yo....estoy perdido con esto.😌

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.