reporte personalizado, por favor solicito ayuda

Samuel Cano

Board Regular
Joined
Jun 24, 2002
Messages
62
Hola. verán,

tengo un formulario para generar un reporte personalizado, de modo que quiero que se puedan hacer diversas selecciones y con base en ellas se genere el reporte. (El reporte consiste en copiar las filas que cumplen los criterios, a otra hoja).

En el formulario hay controles checkbox que seleccionados como ya dije, son condiciones para seleccionar las filas a mover (para ilustrar, solo útilicé dos).

Se me ocurrió que podría integrar la cadena de condiciones en una variable (fuera del ciclo For ... Next que evalúa cada fila) y luego utilizar esa variable en la estructura IF que evalúa celdas específicas de cada fila (dentro del For ... Next antes mencionado).

Con el siguiente código, he conseguido integrar la variable como la necesito:
Code:
strCondicion = ""

If chkPrograma.Value = True And strCondicion = "" Then
    strCondicion = "celdaPrograma = cboPrograma.Value"
Else
End If

If chkAño.Value = True And strCondicion = "" Then
    strCondicion = "celdaAño = cboAño.Value"
ElseIf chkAño.Value = True And strCondicion <> "" Then
    strCondicion = strCondicion & " And " & "celdaAño = cboAño.Value"
End If

' '! noten que el segundo If parte de las selecciones hechas en el primero (y así sucesivamente)

De modo que si consulto el contenido de la variable strCondicion será:

celdaPrograma = cboPrograma.Value And celdaAño = cboAño.Value
ó
celdaPrograma = cboPrograma.Value
ó
celdaAño = cboAño.Value

según las opciones seleccionadas... lo cual es correcto, peero...


al utilizarla en la estructura If ... Then, así:

Code:
If strCondicion Then

sencillamente es ignorada...

Bueno, ese es el caso... de antemano se agradecen aportaciones.

gracias de nuevo y seguimos en contacto...

- Samuel
 

Excel Facts

Remove leading & trailing spaces
Save as CSV to remove all leading and trailing spaces. It is faster than using TRIM().
Samuel,

Pruebe el siguiente. Note que cambié la asignación de la condición para que añada el valor del combobox en vez de ser siempre la misma cosa, creo que eso fue lo que querría hacer.:
Code:
strCondicion = ""

If chkPrograma Then strCondicion = "celdaPrograma = " & cboPrograma.Value

If chkAño Then
    If strCondicion = vbNullString Then
        strCondicion = "celdaAño = " & cboAño.Value
    Else
        strCondicion = strCondicion & " And " & "celdaAño = " & cboAño.Value
    End If
End If

Y gracias por usar la "Hungarian/Simonyi Convention".
 
Upvote 0
Hola Greg,

Gracias por la respuesta, veo que me extendí tanto en la exposición, que perdí de vista el punto...

A ver si con tu código lo puedo sintetizar:

En tu código la variable strCondicion se incrementa según se requiera y eso está bién

Es en el siguiente paso donde tengo el problema, porque quiero utilizar la variable en una estructura If ... Then, en lugar de la sentencia contenida en la variable y la razón es que la variable se ajusta en tiempo de ejecución y la sentencia es fija

Ejemplos:

Así funciona la estructura If ... Then (para evaluar):

Code:
If celdaPrograma = cboPrograma.Value And celdaAño = cboAño.Value Then

Escrita así, no me funciona:

Code:
If strCondicion Then

Por más que el contenido de strCondicion sea el mismo "celdaPrograma = cboPrograma.Value And celdaAño = cboAño.Value", ves?

La idea es utilizar ese If ... Then dentro de un ciclo que recorra (y evalúe) todas las filas de una hoja...

Bueno, gracias por tu tiempo y seguimos en contacto...

En cuanto a la "Hungarian/Simonyi Convention", la verdad es que fué sin proponérmelo, solo trato de hacer los mensajes como ustedes dan sus respuestas... pero gracias por notarlo y mencionarlo.
 
Upvote 0
Hola Samuel,

Disculpe la demora en responder, pero la respuesta a sus pregunta es un poco complicado y no tengo mucho tiempo horita.

Lo que usted pretende hacer sí es posible. Pero hay que ir por medio de EVALUATE. Jugar con EVALUATE toma un poco de practica para encontrar el sintásis "mágico".

Basicamente hay que construir una hilera que EVALUATE puede interpretar correctamente. Siempre tengo que chocar la cabeza un par de veces antes de topar con suerte. Vea el código siguiente para ideas.
Code:
Sub foo()
    
    MsgBox Evaluate(ActiveCell & " > 5")
    
End Sub


Sub oof()
    Dim s$(2), r(2) As Range, i%, m$
    
    For i = 0 To 2: Set r(i) = ActiveCell.Offset(, i): Next i
    
    If r(0) Then
        s(0) = " > 5"
        s(1) = ""
    Else
        s(0) = " <= 5"
        s(1) = " > 5"
    End If
    
    m = "nada"
    s(2) = "(" & r(1) & s(0) & ")"
    
    '// no funciona
    'If s(1) <> vbNullString Then s(2) = s(2) & " AND (" & r(2) & s(1) & ")"
    '// sí, funciona
    If s(1) <> vbNullString Then s(2) = s(2) & " * (" & r(2) & s(1) & ")"
    
    If Evaluate(s(2)) Then
        m = "Sí, es cierto"
    Else
        m = "¡Mentiras!"
    End If
    
    MsgBox m
    
End Sub
Realmente, creo que sería mejor revisar su lógica para ver si no hay mejor estructura, por ejemplo una función custom o algo así.

Saludos,
 
Upvote 0
Gracias Greg,

nada que disculpar, al contrario, soy yo quen agradece tu tiempo y ayuda. :biggrin:

respecto al código, de momento estoy trabajando otra parte del proyecto porque de pronto me quedé sin ideas para continuar...

lo que has puesto me ha dado material para retomarlo, principalmente tu comentario de replantear la lógica de lo que quiero hacer...

Seguimos en contacto!...

:LOL:
 
Upvote 0
Pregunto ya que llego tarde al planteo:
¿No evaluas la posibilidad de manejar Filtros avanzados, alimentando los criterios con las opciones de los controles del formulario?
 
Upvote 0
Saludos galileogali, gracias por tu interés...

interesante la aproximación que sugieres...

Cuando planteé mi problema y Greg me ayudó, sólo incluí para ejemplificar, dos elementos... que por ahora quedaron en diez (eran más pero los discriminé porque aumentaban exponencialmente la complejidad)

Ahora el formulario está así:

diez ComboBox (cada uno con sus opciones)

lo que pretendo es generar un reporte cuya seleccion de FILAS, esté determinado por las opciones seleccionada o no en los ComboBoxes ...

Es decir que al generar el reporte, se evalúe primero el estado de cada control y después, contenido de cada ComboBox (si tiene o no selección) y así discriminen las filas que van al reporte...

Te vas a reir, pero en otro de mis "actos de desesperación" lo que hice fué, manualmente, elaborar una matriz con cada posible combinación única de controles "encendidos" / "apagados" .... resultaron 175 y aún tengo mis dudas de si está correcto / completo...

Mi esperanza es que de momento sirva, pero desafortunadamente es una solución estática... ante cualquier cambio me implicaría rehacer la matriz y toooda la codificación...

En alguna parte leí que se pueden establecer criterios múltipes para aplicar un filtro por eso creo que entiendo tu comentario...

En el formulario, cada control corresponde a una columna; por eso lo de evaluar los 10 siempre, para mantener constantes las columnas... distinguiendo solo: si un control tiene selección entonces aplicar esa selección como criterio de filtro...mmm.... me vendría bien algún ejemplo...

Lo voy a retomar y te comento.

Gracias otra vez y seguimos en contacto.
 
Upvote 0
Ok amigos parece que...

con un filtro avanzado se consigue hacer el trabajo...

hice algunas pruebas (no exhaustivas aclaro) directamente en la hoja de cálculo y quedé conforme...

veremos si puedo implementarlo desde vba...

gracias y seguimos en contacto...
 
Upvote 0
Este tipo de psoturas diametralmente tan diversas titnen un eje:
hay quienes, como en mi caso, venimos de Excel y desde alli saltamos a programar en VBA, mientras que hay quienes viniendo del Visual y otros programas, desembarcan en Excel....
(unos y oros ordenamos las heramientas disponibles para solucionar problemas de forma muy diferente....
Por suerte unos y otros nos complementamos....
 
Upvote 0
Gracias amigos, Greg Truby, galileogali...

Gracias a sus aportaciones pude explorar varias posiblididades para resolver una situación de código.

Finalmente llegué a éste y lo incluyo con la esperanza de que sea de utilidad para alguien.

Resumiendo, mi problema fué obtener un subconjunto de datos a partir de las opciones seleccionadas en controles en un formulario.

La solución como podrán ver hasta el momento de este código, es funcional inclusive si la cantidad de filas en el conjunto de datos varía.

Ahora que lo pienso, debo revisar cómo se comporta, si no hay datos para prcesar...

Gracias mil y seguimos en contacto....

Code:
    ''!
        Worksheets("CAPTURA").Activate
        With ActiveSheet
            .Cells(10, "B").Value = "B"
            .Cells(10, "C").Value = "C"
            .Cells(10, "D").Value = "D"
            .Cells(10, "E").Value = "E"
            .Cells(10, "F").Value = "F"
        
            .Cells(10, "G").Value = "G"
            .Cells(10, "H").Value = "H"
            .Cells(10, "I").Value = "I"
            .Cells(10, "J").Value = "J"
            .Cells(10, "K").Value = "K"
        
            .Cells(10, "L").Value = "L"
            .Cells(10, "M").Value = "M"
            .Cells(10, "N").Value = "N"
            .Cells(10, "O").Value = "O"
            .Cells(10, "P").Value = "P"
        
            .Cells(10, "Q").Value = "Q"
            .Cells(10, "R").Value = "R"
            .Cells(10, "S").Value = "S"
            .Cells(10, "T").Value = "T"
            .Cells(10, "U").Value = "U"
        
            .Cells(10, "V").Value = "V"
            .Cells(10, "W").Value = "W"
            .Cells(10, "X").Value = "X"
            .Cells(10, "Y").Value = "Y"
            .Cells(10, "Z").Value = "Z"
        
            .Cells(10, "AA").Value = "AA"
            .Cells(10, "AB").Value = "AB"
            .Cells(10, "AC").Value = "AC"
            .Cells(10, "AD").Value = "AD"
            .Cells(10, "AE").Value = "AE"
            
            .Cells(10, "AF").Value = "AF"
            .Cells(10, "AG").Value = "AG"
            .Cells(10, "AH").Value = "AH"
            .Cells(10, "AI").Value = "AI"
            .Cells(10, "AJ").Value = "AJ"
            .Cells(10, "AK").Value = "AK"
        
            .Cells(10, "AL").Value = "AL"
            .Cells(10, "AM").Value = "AM"
            .Cells(10, "AN").Value = "AN"
            .Cells(10, "AO").Value = "AO"
            .Cells(10, "AP").Value = "AP"
        
            .Cells(10, "AQ").Value = "AQ"
            .Cells(10, "AR").Value = "AR"
            .Cells(10, "AS").Value = "AS"
            .Cells(10, "AT").Value = "AT"
            .Cells(10, "AU").Value = "AU"
        
            .Cells(10, "AV").Value = "AV"
            .Cells(10, "AW").Value = "AW"
            .Cells(10, "AX").Value = "AX"
            .Cells(10, "AY").Value = "AY"
            .Cells(10, "AZ").Value = "AZ"
        
            .Cells(10, "BA").Value = "BA"
            .Cells(10, "BB").Value = "BB"
            .Cells(10, "BC").Value = "BC"
            .Cells(10, "BD").Value = "BD"
            .Cells(10, "BE").Value = "BE"
            .Cells(10, "BF").Value = "BF"
        
            .Cells(10, "BG").Value = "BG"
            .Cells(10, "BH").Value = "BH"
            .Cells(10, "BI").Value = "BI"
            .Cells(10, "BJ").Value = "BJ"
            .Cells(10, "BK").Value = "BK"
        
            .Cells(10, "BL").Value = "BL"
            .Cells(10, "BM").Value = "BM"
            .Cells(10, "BN").Value = "BN"
            .Cells(10, "BO").Value = "BO"
        
        ''!
            ''! Determina FILAS PARA CRITERIOS
            lngUFO = .[B65536].End(xlUp).Row
            
            lngEncabezadoCriterio = lngUFO + 2
            lngCriterio = lngEncabezadoCriterio + 1
        
        ''!
            ''! Limpia FILAS PARA CRITERIOS

            Rows(lngEncabezadoCriterio).ClearContents
            Rows(lngCriterio).ClearContents
        
        ''!
            ''! Copia fila ENCABEZADO DE CRITERIOS
            
            .Cells(10, "B").Select
            Range(Selection, Selection.End(xlToRight)).Select
            
            Selection.Copy
            
            Cells(lngUFO + 2, "B").Select
            
            .Paste
            
            Application.CutCopyMode = False
            
            .Cells(10, "B").Select
            
        ''!
            ''! Almacena en celdas los VALORES DE CRITERIOS segun las opciones selecionadas en formulario
            
            If chkContrato Then
                .Cells(lngUFO + 3, "C").Value = cboContrato.Value
            Else
                .Cells(lngUFO + 3, "C").ClearContents
            End If
            
            
            If chkEmpresa Then
                .Cells(lngUFO + 3, "BO").Value = cboEmpresaContrato.Value
            Else
                .Cells(lngUFO + 3, "BO").ClearContents
            End If
            
            
            If chkPrograma Then
                .Cells(lngUFO + 3, "BB").Value = cboPrograma.Value
            Else
                .Cells(lngUFO + 3, "BB").ClearContents
            End If
            
            
            If chkAño Then
                .Cells(lngUFO + 3, "BN").Value = cboAño.Value
            Else
                .Cells(lngUFO + 3, "BN").ClearContents
            End If
            
            
            If chkMesFacturacion Then
                .Cells(lngUFO + 3, "BC").Value = cboMesFacturacion.Value
            Else
                .Cells(lngUFO + 3, "BC").ClearContents
            End If
            
            If chkQuincena Then
                .Cells(lngUFO + 3, "BD").Value = cboQuincena.Value
            Else
                .Cells(lngUFO + 3, "BD").ClearContents
            End If
            
    
            If chkDotacionRecepcion Then
                .Cells(lngUFO + 3, "BE").Value = cboDotacionRecepcion.Value
            Else
                .Cells(lngUFO + 3, "BE").ClearContents
            End If
            
            
            If chkOficina Then
                .Cells(lngUFO + 3, "K").Value = cboOficina.Value
            Else
                .Cells(lngUFO + 3, "K").ClearContents
            End If
            
            
            If chkTrasladoOperacion Then
                If optTraslado Then
                    .Cells(lngUFO + 3, "BF").Value = ">0"
                    .Cells(lngUFO + 3, "BG").ClearContents
                
                ElseIf optOperacion Then
                    .Cells(lngUFO + 3, "BF").ClearContents
                    .Cells(lngUFO + 3, "BG").Value = ">0"
                
                Else
                    .Cells(lngUFO + 3, "BF").ClearContents
                    .Cells(lngUFO + 3, "BG").ClearContents
                End If
            
            Else
                .Cells(lngUFO + 3, "BF").ClearContents
                .Cells(lngUFO + 3, "BG").ClearContents
            End If
            
            
            If chkPenalizacion Then
                If optPenalizado Then
                    .Cells(lngUFO + 3, "BM").Value = ">0"
                
                ElseIf optNoPenalizado Then
                    .Cells(lngUFO + 3, "BM").Value = "<0"
                
                End If
            End If
        
        
        ''! aplica FILTRO y copia resultado
             Range(Cells(10, "B"), Cells(lngUFO, "BO")).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
             Range(Cells(lngEncabezadoCriterio, "B"), Cells(lngCriterio, "BO")), CopyToRange:=Range("BS10"), _
             Unique:=False

:biggrin:
 
Upvote 0

Forum statistics

Threads
1,216,788
Messages
6,132,703
Members
449,753
Latest member
swastikExcel

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top