Ver Mensaje Individual
  #28 (permalink)  
Antiguo 29/04/2010, 16:16
Avatar de erbuson
erbuson
 
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
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 ...