Una mano con visual
Amigo tengo unas dudillas a ver si me hechas una mano y me iluminas...
Este es el caso un Dpto me entrega unos archivos en excel que contienen datos estadísticos en bruto... ¿y yo a partir de ellos debo sacar el comportamiento que ha venido teniendo para generar las estadísticas antes mencionadas el caso es que quiero automatixar todo esto con una aplicación en visual basic pero tengo una duda debo hacerlo trabajando directamente con el archivo excel o utilixar accesses o sql? ¿Y de hacerlo trabajar con flexgrid? Puedo generar el gráfico a partir de este flexgrid cuando cargue los datos en el, ¿o puedo aplicar a este flexgrid fórmulas como lo hago en excel y que solo me muestre el resultado en el? Quisiera que me ayudaras a tomar una buena decisión no soy muy experto en vb pero me he tomado este reto...
Este es el caso un Dpto me entrega unos archivos en excel que contienen datos estadísticos en bruto... ¿y yo a partir de ellos debo sacar el comportamiento que ha venido teniendo para generar las estadísticas antes mencionadas el caso es que quiero automatixar todo esto con una aplicación en visual basic pero tengo una duda debo hacerlo trabajando directamente con el archivo excel o utilixar accesses o sql? ¿Y de hacerlo trabajar con flexgrid? Puedo generar el gráfico a partir de este flexgrid cuando cargue los datos en el, ¿o puedo aplicar a este flexgrid fórmulas como lo hago en excel y que solo me muestre el resultado en el? Quisiera que me ayudaras a tomar una buena decisión no soy muy experto en vb pero me he tomado este reto...
1 respuesta
Respuesta de mrtool
1
1

mrtool, Con mas de 15 años de experiencia en consultoria informatica en...
Si son varios datos y son consistentes ( es decir siempre te va a llegar la misma estructura) yo los derivaría a Access que va a permirir más juego para las extracciones.
Luego en Acces prepararia las 'n' querys para utilizar como base para los primeros analisis
Y luego probablemente lo más sencillo sea explotar esos datos ( ya masticaditos un poco) en Excel o en algún sistema de reporting de terceros.
Tienes alguna idea sobre el nº de gráficos o análisis que tienes que hacer y su complejidad lo digo por poder afinar más.
Luego en Acces prepararia las 'n' querys para utilizar como base para los primeros analisis
Y luego probablemente lo más sencillo sea explotar esos datos ( ya masticaditos un poco) en Excel o en algún sistema de reporting de terceros.
Tienes alguna idea sobre el nº de gráficos o análisis que tienes que hacer y su complejidad lo digo por poder afinar más.

Bueno te dejo el cod en si ya como lo tengo de avanxado...
La cosa es que hay una columna del MSFLEXGRID que me debería arrojar porcentajes y me los muestra en bruto es decir si es 82% me muestra 0.82567 y así otra cosa puedo generar el gráfico a partir de el mismo MSFLEXGRID y mm no he querido usar access quiero algo que pueda ser algo así como portable sin necesidad de hacer maniobras ya ksi lo tengo hecho.. falta que me genere el gráfico a partir del grid... y he creado un botón para generar el reporte funciona de maravilla pero se como iimportar el flex grid a una tabla pero SOLO con el reporte este que cree usando marcadoles mm ni idea echame una mano amigo a ver dime lo que necesites aquí t dejo el código fuente... ah otra cosa cuando aplico el mismo código a donde los datos y la tabla para el flex son dif me sale sub indice fuera del rango la otra tabla es más pequeña 3 columnas 6 filas...
###########################################################
Option Explicit
' \\ Declaraciones ( Apis )
' ------------------------------------------------------------------------------------------
Private Declare Function SetErrorMode Lib "kernel32" (ByVal wMode As Long) As Long
Private Declare Sub InitCommonControls Lib "Comctl32" ()
' -- Variables para acceder a la hoja excel
Private obj_Excel As Object
Private obj_Workbook As Object
Private obj_Worksheet As Object
Private Sub Form_Initialize()
Call SetErrorMode(2)
Call InitCommonControls
End Sub
'***************************************************************************'
'* Inicio *'
'***************************************************************************'
Private Sub Form_Load()
Call SetErrorMode(2)
Call InitCommonControls
If Excel_FlexGrid(App.Path & "\data\Libro.xls", MSFlexGrid1, 20, 5, "Sheet1") Then
Call HighLight_Cells(MSFlexGrid1, CDbl("20"), 1)
End If
' -- Configurar el Grid
With MSFlexGrid1
.Cols = 3
.FixedCols = 0
.FormatString = "Administrativa|Total| Procentaje % "
.ColWidth(0) = 2000
.ColWidth(1) = 1500
.ColWidth(2) = 2000
End With
End Sub
'***************************************************************************'
'* Fin *'
'***************************************************************************'
Private Sub Form_Unload(Cancel As Integer)
Call Descargar
End Sub
'***************************************************************************'
'* Función para leer los datos del Excel y cargarlos en el Flex *'
'***************************************************************************'
Private Function Excel_FlexGrid(sPath As String, FlexGrid As Object, Filas As Integer, Columnas As Integer, Optional sSheetName As String = vbNullString) As Boolean
Dim i As Long
Dim n As Long
On Error GoTo error_sub
' -- Comproba si existe l archivo
If Len(Dir(sPath)) = 0 Then
MsgBox "No se ha encontrado el archivo: " & sPath, vbCritical
Exit Function
End If
FlexGrid.Redraw = False
Me.MousePointer = vbHourglass
' -- crea rnueva instancia de Excel
Set obj_Excel = CreateObject("Excel.Application")
'obj_Excel.Visible = True
' -- Abrir el libro
Set obj_Workbook = obj_Excel.Workbooks.Open(sPath)
' -- referencia la Hoja, por defecto la hoja activa
If sSheetName = vbNullString Then
Set obj_Worksheet = obj_Workbook.ActiveSheet
Else
Set obj_Worksheet = obj_Workbook.Sheets(sSheetName)
End If
' -- Setear Grid
With MSFlexGrid1
' -- Especificar la cantidad de filas y columnas
'.Cols = Columnas
.Rows = Filas
' -- Recorrer las filas del FlexGrid para agregar los datos
For i = 1 To .Rows - 1
' -- Establecer la fila activa
.Row = i
' -- Recorrer las columnas del FlexGrid
For n = 0 To .Cols - 1
' -- Establecer columna activa
.Col = n
' -- Asignar a la celda del Flex el contenido de la celda del excel
.Text = obj_Worksheet.Cells(i + 1, n + 1).Value
Next
Next
End With
' -- Cerrar libro
obj_Workbook.Close
' -- Cerrar Excel
obj_Excel.quite
' -- Descargar objetos para liberar recursos
Call Descargar
Excel_FlexGrid = True
FlexGrid.Redraw = True
' -- Errores
Exit Function
error_sub:
MsgBox Err.Description
Call Descargar
Me.MousePointer = vbDefault
FlexGrid.Redraw = True
End Function
Private Sub HighLight_Cells(Grid As Object, cdblMinValue As Double, iCurrentCol As Integer)
Dim iRow As Integer
With Grid
.Redraw = False
For iRow = 1 To Grid.Rows - 1
' -- Establecer Columna y fila activa
.Col = iCurrentCol
.Row = iRow
Next
.Redraw = True
End With
End Sub
'***************************************************************************'
'* Función para descargar los objetos *'
'***************************************************************************'
Private Sub Descargar()
On Local Error Resume Next
Set obj_Workbook = Nothing
Set obj_Excel = Nothing
Set obj_Worksheet = Nothing
End Sub
Private Sub Command1_Click()
'***************************************************************************'
'* Generando Reporte en Word *'
'***************************************************************************'
Dim Documento As New Word.Application
Dim cOrigen As String, cDestino As String
' Se copia la plantilla a un nuevo documento...
cOrigen = App.Path & "\Plantilla.doc"
cDestino = App.Path & "\Reporte.doc"
If Dir(cDestino) <> "" Then Kill cDestino
FileCopy cOrigen, cDestino
With Documento
' Abre un documento que puede tener extensión .doc, .dot o .rtf
.Application.Documents.Open cDestino
' Relleno los marcadores que contenga la plantilla
' Hereda las propiedades definidas en el Marcador
' Negrita, Itálica, tipo y tamaño de la letra...
.Documents.Item(1).Bookmarks.Item("NomDir").Range.Text = Text3.Text 'Nombre de quien lo creo
.Documents.Item(1).Bookmarks.Item("Marcador1").Range.Text = Text2.Text 'Titulo
.Documents.Item(1).Bookmarks.Item("Marcador2").Range.Text = Text1.Text 'Contenido
' Final del documento
.Application.Selection.EndKey wdStory
' salto de línea
.Application.Selection.TypeParagraph
' introducción de texto
.Application.Selection.TypeText "Ejemplo de prueba"
' varios saltos de línea
' ______________________
.Application.Selection.TypeParagraph
.Application.Selection.TypeParagraph
.Application.Selection.TypeParagraph
' crear una tabla
.Documents.Item(1).Tables.Add Documento.Application.Selection.Range, 3, 5
' relleno de las celdas de la tabla
.Documents.Item(1).Tables(1).Cell(1, 1).Range.Text = "Celda 1"
' finalmente mostramos el documento
.Application.Visible = True
End With
Set Documento = Nothing
End Sub
'***************************************************************************'
'* Fin *'
'***************************************************************************'
'Volver al menu inicial
Private Sub Command2_Click()
Unload Me
portada.Show
End Sub
' Se resablecen los Texbox a su estado original...
Private Sub Command3_Click()
Text1.Text = ""
Text2.Text = "Titulo Principal..."
End Sub
La cosa es que hay una columna del MSFLEXGRID que me debería arrojar porcentajes y me los muestra en bruto es decir si es 82% me muestra 0.82567 y así otra cosa puedo generar el gráfico a partir de el mismo MSFLEXGRID y mm no he querido usar access quiero algo que pueda ser algo así como portable sin necesidad de hacer maniobras ya ksi lo tengo hecho.. falta que me genere el gráfico a partir del grid... y he creado un botón para generar el reporte funciona de maravilla pero se como iimportar el flex grid a una tabla pero SOLO con el reporte este que cree usando marcadoles mm ni idea echame una mano amigo a ver dime lo que necesites aquí t dejo el código fuente... ah otra cosa cuando aplico el mismo código a donde los datos y la tabla para el flex son dif me sale sub indice fuera del rango la otra tabla es más pequeña 3 columnas 6 filas...
###########################################################
Option Explicit
' \\ Declaraciones ( Apis )
' ------------------------------------------------------------------------------------------
Private Declare Function SetErrorMode Lib "kernel32" (ByVal wMode As Long) As Long
Private Declare Sub InitCommonControls Lib "Comctl32" ()
' -- Variables para acceder a la hoja excel
Private obj_Excel As Object
Private obj_Workbook As Object
Private obj_Worksheet As Object
Private Sub Form_Initialize()
Call SetErrorMode(2)
Call InitCommonControls
End Sub
'***************************************************************************'
'* Inicio *'
'***************************************************************************'
Private Sub Form_Load()
Call SetErrorMode(2)
Call InitCommonControls
If Excel_FlexGrid(App.Path & "\data\Libro.xls", MSFlexGrid1, 20, 5, "Sheet1") Then
Call HighLight_Cells(MSFlexGrid1, CDbl("20"), 1)
End If
' -- Configurar el Grid
With MSFlexGrid1
.Cols = 3
.FixedCols = 0
.FormatString = "Administrativa|Total| Procentaje % "
.ColWidth(0) = 2000
.ColWidth(1) = 1500
.ColWidth(2) = 2000
End With
End Sub
'***************************************************************************'
'* Fin *'
'***************************************************************************'
Private Sub Form_Unload(Cancel As Integer)
Call Descargar
End Sub
'***************************************************************************'
'* Función para leer los datos del Excel y cargarlos en el Flex *'
'***************************************************************************'
Private Function Excel_FlexGrid(sPath As String, FlexGrid As Object, Filas As Integer, Columnas As Integer, Optional sSheetName As String = vbNullString) As Boolean
Dim i As Long
Dim n As Long
On Error GoTo error_sub
' -- Comproba si existe l archivo
If Len(Dir(sPath)) = 0 Then
MsgBox "No se ha encontrado el archivo: " & sPath, vbCritical
Exit Function
End If
FlexGrid.Redraw = False
Me.MousePointer = vbHourglass
' -- crea rnueva instancia de Excel
Set obj_Excel = CreateObject("Excel.Application")
'obj_Excel.Visible = True
' -- Abrir el libro
Set obj_Workbook = obj_Excel.Workbooks.Open(sPath)
' -- referencia la Hoja, por defecto la hoja activa
If sSheetName = vbNullString Then
Set obj_Worksheet = obj_Workbook.ActiveSheet
Else
Set obj_Worksheet = obj_Workbook.Sheets(sSheetName)
End If
' -- Setear Grid
With MSFlexGrid1
' -- Especificar la cantidad de filas y columnas
'.Cols = Columnas
.Rows = Filas
' -- Recorrer las filas del FlexGrid para agregar los datos
For i = 1 To .Rows - 1
' -- Establecer la fila activa
.Row = i
' -- Recorrer las columnas del FlexGrid
For n = 0 To .Cols - 1
' -- Establecer columna activa
.Col = n
' -- Asignar a la celda del Flex el contenido de la celda del excel
.Text = obj_Worksheet.Cells(i + 1, n + 1).Value
Next
Next
End With
' -- Cerrar libro
obj_Workbook.Close
' -- Cerrar Excel
obj_Excel.quite
' -- Descargar objetos para liberar recursos
Call Descargar
Excel_FlexGrid = True
FlexGrid.Redraw = True
' -- Errores
Exit Function
error_sub:
MsgBox Err.Description
Call Descargar
Me.MousePointer = vbDefault
FlexGrid.Redraw = True
End Function
Private Sub HighLight_Cells(Grid As Object, cdblMinValue As Double, iCurrentCol As Integer)
Dim iRow As Integer
With Grid
.Redraw = False
For iRow = 1 To Grid.Rows - 1
' -- Establecer Columna y fila activa
.Col = iCurrentCol
.Row = iRow
Next
.Redraw = True
End With
End Sub
'***************************************************************************'
'* Función para descargar los objetos *'
'***************************************************************************'
Private Sub Descargar()
On Local Error Resume Next
Set obj_Workbook = Nothing
Set obj_Excel = Nothing
Set obj_Worksheet = Nothing
End Sub
Private Sub Command1_Click()
'***************************************************************************'
'* Generando Reporte en Word *'
'***************************************************************************'
Dim Documento As New Word.Application
Dim cOrigen As String, cDestino As String
' Se copia la plantilla a un nuevo documento...
cOrigen = App.Path & "\Plantilla.doc"
cDestino = App.Path & "\Reporte.doc"
If Dir(cDestino) <> "" Then Kill cDestino
FileCopy cOrigen, cDestino
With Documento
' Abre un documento que puede tener extensión .doc, .dot o .rtf
.Application.Documents.Open cDestino
' Relleno los marcadores que contenga la plantilla
' Hereda las propiedades definidas en el Marcador
' Negrita, Itálica, tipo y tamaño de la letra...
.Documents.Item(1).Bookmarks.Item("NomDir").Range.Text = Text3.Text 'Nombre de quien lo creo
.Documents.Item(1).Bookmarks.Item("Marcador1").Range.Text = Text2.Text 'Titulo
.Documents.Item(1).Bookmarks.Item("Marcador2").Range.Text = Text1.Text 'Contenido
' Final del documento
.Application.Selection.EndKey wdStory
' salto de línea
.Application.Selection.TypeParagraph
' introducción de texto
.Application.Selection.TypeText "Ejemplo de prueba"
' varios saltos de línea
' ______________________
.Application.Selection.TypeParagraph
.Application.Selection.TypeParagraph
.Application.Selection.TypeParagraph
' crear una tabla
.Documents.Item(1).Tables.Add Documento.Application.Selection.Range, 3, 5
' relleno de las celdas de la tabla
.Documents.Item(1).Tables(1).Cell(1, 1).Range.Text = "Celda 1"
' finalmente mostramos el documento
.Application.Visible = True
End With
Set Documento = Nothing
End Sub
'***************************************************************************'
'* Fin *'
'***************************************************************************'
'Volver al menu inicial
Private Sub Command2_Click()
Unload Me
portada.Show
End Sub
' Se resablecen los Texbox a su estado original...
Private Sub Command3_Click()
Text1.Text = ""
Text2.Text = "Titulo Principal..."
End Sub

Perdona, pero ¿por qué haces todo eso?
Si tienes los datos en excel, ¿por qué los pasas a VB para analizarlos si es mucho más fácil hacerlo en Excel?
Es que no comprendo la ventaja ni el motivo de usar vb.
VB es cómodo para lo que es: Mantenimientos, pantallas de datos, sistemas de gestión, etc...
Pero para numeros, estadisticas y demas. Excel es el rey ( quitando claro los sistemas DW profesionales).
Por otro lado y por mucho que quieras un informe de análisis estadístico nunca es 100% automatizable, siempre hay que revisarlo, añadir comentarios, etc..
Si tienes los datos en excel, ¿por qué los pasas a VB para analizarlos si es mucho más fácil hacerlo en Excel?
Es que no comprendo la ventaja ni el motivo de usar vb.
VB es cómodo para lo que es: Mantenimientos, pantallas de datos, sistemas de gestión, etc...
Pero para numeros, estadisticas y demas. Excel es el rey ( quitando claro los sistemas DW profesionales).
Por otro lado y por mucho que quieras un informe de análisis estadístico nunca es 100% automatizable, siempre hay que revisarlo, añadir comentarios, etc..
- Compartir respuesta
- Anónimo
ahora mismo
