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...
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.
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
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..