Respuesta: Ayuda por favor Bueno amigo Xyon, creo que lo mejor es que pruebes este código y después me cuentas:
Crea un Proyecto nuevo, debes añadirle los siguientes controles:
MsFlexGrid1, Combo1, Combo2, Command1 Copias el siguiente código en el Código del Formulario
Código:
Option Explicit
Private Sub Combo1_Click()
' Carga en Combo2 las posibles elementos de la columna
Dim Fila As Single, Columna As Single
' Buscamos el numero de Columna que contiene la cabecera seleccionada
For Columna = 0 To MSFlexGrid1.Cols - 1
' Si coincide Nombre de la columna con el Combo, salimos del bucle
If MSFlexGrid1.TextMatrix(0, Columna) = Combo1.Text Then Exit For
Next
' Borramos posibles valores del Combo2
Combo2.Clear
' Recorremos los elementos de la columna escogida en el Grid para 'cargar' sus valores
For Fila = 1 To MSFlexGrid1.Rows - 1
' Utilizamos la rutina ComboAdd que evita añadir datos duplicados al Combo
ComboAdd Combo2, MSFlexGrid1.TextMatrix(Fila, Columna)
Next
' Forzamos que no haya ningun elemento seleccionado con el -1
Combo2.ListIndex = -1
End Sub
Private Sub Combo2_Click()
' Recorre las Filas del Grid, ocultando las NO COINCIDENTES y mostrando las coincidentes
Dim Fila As Single, Columna As Single
' Buscamos el numero de Columna que contiene la cabecera seleccionada
For Columna = 0 To MSFlexGrid1.Cols - 1
' Si coincide Nombre de la columna con el Combo, salimos del bucle
If MSFlexGrid1.TextMatrix(0, Columna) = Combo1.Text Then Exit For
Next
' Evitamos el parpadeo del Grid
MSFlexGrid1.Redraw = False
' Recorremos el Grid
For Fila = 1 To MSFlexGrid.Rows - 1
If MSFlexGrid1.TextMatrix(Fila, Columna) = Combo2.Text Then
' Restaura el Alto de Fila a -1 (Alto por omision)
MSFlexGrid1.RowHeight(Fila) = -1
Else
' Asigna a Alto Fila 0 (Oculta la Fila)
MSFlexGrid1.RowHeight(Fila) = 0
End If
Next
' Restauramos redibujado del Grid
MSFlexGrid1.Redraw = True
End Sub
Private Sub Command1_Click()
Dim Numero As Integer, Fichero As String, Longitud As Integer, Registro As Single
Numero = FreeFile
Longitud = Len(RegistroHoras)
Fichero = "" ' Debe indicarse aquí el nombre y path completo del Fichero de Horas
If Fichero = "" Then Stop ' Este Stop es por si no se ha indicado el nombre del Fichero
Open Fichero For Random As Numero Len = Longitud
For Registro = 1 To LOF(Numero) / Longitud
Get #Numero, Registro, RegistroHoras
' Añadimos una Fila al Grid
MSFlexGrid1.Rows = Registro + 1
With RegistroHoras
GridPonerDato MSFlexGrid1, Registro, 0, .inicio1 ' Date
GridPonerDato MSFlexGrid1, Registro, 1, .fin1 ' Date
GridPonerDato MSFlexGrid1, Registro, 2, .inicio2 ' Date
GridPonerDato MSFlexGrid1, Registro, 3, .fin2 ' Date
GridPonerDato MSFlexGrid1, Registro, 4, .inicio3 ' Date
GridPonerDato MSFlexGrid1, Registro, 5, .fin3 ' Date
GridPonerDato MSFlexGrid1, Registro, 6, .tiempo ' Date
GridPonerDato MSFlexGrid1, Registro, 7, .dia ' String * 8 ' Lunes, Martes, ...
GridPonerDato MSFlexGrid1, Registro, 8, .fecha ' Integer
GridPonerDato MSFlexGrid1, Registro, 9, .semana ' Integer ' 1, 2, 3 ...
GridPonerDato MSFlexGrid1, Registro, 10, .mes ' String * 10 ' Enero, Febrero, ...
GridPonerDato MSFlexGrid1, Registro, 11, .año ' Integer
GridPonerDato MSFlexGrid1, Registro, 12, .npedido ' Long
GridPonerDato MSFlexGrid1, Registro, 13, .Totalhoras ' Integer
End With
Next
Close #Numero
End Sub
Private Sub Form_Load()
'
' Ajustamos Posiciones de los controles de modo provisional
MSFlexGrid1.Move 0, 0, 12000, 6000
Combo1.Move 0, 6120, 1800
Combo2.Move 2000, 6120, 1800
Command1.Move MSFlexGrid1.Width - 1800, 6120, 1800
Command1.Caption = "Cargar"
Me.Width = MSFlexGrid1.Width + 120
Me.Height = 7000
' Los datos anteriores deberan borrarse cuando se Ajusten los controles en el diseño
'
' Dimensionamos el Grid adecuadamente
' No tendrá Columnas Fijas
MSFlexGrid1.FixedCols = 0
' Le ponemos titulos a las cabeceras
GridCabecera MSFlexGrid1, 0, 1200, "Inicio1", "C"
GridCabecera MSFlexGrid1, 1, 1200, "Fin1", "C"
GridCabecera MSFlexGrid1, 2, 1200, "Inicio2", "C"
GridCabecera MSFlexGrid1, 3, 1200, "Fin2", "C"
GridCabecera MSFlexGrid1, 4, 1200, "Inicio3", "C"
GridCabecera MSFlexGrid1, 5, 1200, "Fin3", "C"
GridCabecera MSFlexGrid1, 6, 1200, "Tiempo", "C"
GridCabecera MSFlexGrid1, 7, 1200, "Dia", "C"
GridCabecera MSFlexGrid1, 8, 1200, "Fecha", "C"
GridCabecera MSFlexGrid1, 9, 1200, "Semana", "C"
GridCabecera MSFlexGrid1, 10, 1200, "Mes", "C"
GridCabecera MSFlexGrid1, 11, 1200, "Año", "C"
GridCabecera MSFlexGrid1, 12, 1200, "Pedido", "C"
GridCabecera MSFlexGrid1, 13, 1200, "Horas", "C"
' Añadimos a Combo1 las posibles columnas por las que podremos seleccionar
' Las columnas deben tener el mismo nombre que la columna del Grid (ver arriba)
' Seleccionar la propiedad Style del Combo1 y Combo2 a modo 2 Lista desplegable
Combo1.AddItem "Dia"
Combo1.AddItem "Semana"
Combo1.AddItem "Mes"
Combo1.AddItem "Año"
Combo1.AddItem "Pedido"
' Forzamos que no haya ningun elemento seleccionado con el -1
Combo1.ListIndex = -1
End Sub
Este otro código lo copias en un Modulo
Código:
Option Explicit
Public Type Horas_T
inicio1 As Date
fin1 As Date
inicio2 As Date
fin2 As Date
inicio3 As Date
fin3 As Date
tiempo As Date
dia As String * 8 ' Lunes, Martes, ...
fecha As Integer
semana As Integer ' 1, 2, 3 ...
mes As String * 10 ' Enero, Febrero, ...
año As Integer
npedido As Long
Totalhoras As Integer
End Type
Public RegistroHoras As Horas_T
Public Sub GridCabecera(Grid As MSFlexGrid, Columna As Single, AnchoTwips As Single, Titulo As String, Ajuste As String)
' Si la Columna no existe, la añadimos ya que de lo contrario se produciría un error
If Grid.Cols - 1 < Columna Then Grid.Cols = Columna + 1
Grid.ColWidth(Columna) = AnchoTwips
Select Case UCase(Ajuste)
Case "I": Grid.ColAlignment(Columna) = 1 ' Izquierda
Case "D": Grid.ColAlignment(Columna) = 7 ' Derecha
Case "C": Grid.ColAlignment(Columna) = 4 ' Centro
End Select
Grid.Row = 0
Grid.Col = Columna
Grid.CellAlignment = 4 ' Título siempre Centrado
Grid.Text = Titulo
End Sub
Public Sub GridPonerDato(Grid As MSFlexGrid, Fila As Single, Columna As Single, Dato As Variant)
* ' Si la fila no existe, la añadimos. La columna es de suponer que ya le hemos puesto cabecera
If Grid.Rows - 1 < Fila Then Grid.Rows = Fila + 1
* Grid.TextMatrix(Fila, Columna) = Dato
End Sub
Public Sub ComboAdd(Combo As ComboBox, Item As String)
' Añade Item al combo indicado si no está en el
Dim Indice As Single
For Indice = 0 To Combo.ListCount - 1
' Si lo encuentra simplemente salimos
If Combo.List(Indice) = Item Then Exit Sub
Next
' Si no hemos salido, debemos añadirlo
Combo.AddItem Item
End Sub
Lo pruebas, lo analizas (está bastante comentado) y hablamos (es una primera idea)
__________________ Agradecer a quien te enseñó, es enseñar lo que de él aprendiste. Recuerda: Decir gracias, poco cuesta y mucho vale ... |