Sugerencias para manejo de Excel en Visual Basic

Estoy desarrollando una aplicación que requiere muchos cálculos que los controles (grids) normales no lo soportan, pero no se como hacer para tener un libro de Excel con varias hojas y que los datos se puedan capturar en diferentes formas
1) Me confundo y no se si incrustar un OLE o si solo dar de alta un objeto( Set GL_EX_APPLICATION = New Excel.Application) y verlo en cualquier forma (además de que no se como "verlo" para que el usuario capture)
2) No se si puedo "controlar" el Excel como lo hago con los grids normales, es decir que no me aparezca el menú y que yo defina que celdas se capturan
¿Alguna sugerencia o comentario?

2 Respuestas

Respuesta
1
Como me pides una sugerencia te la doy con mucho gusto: ¡Olvídate del Excel!
Cualquier cosa que puedas hacer en Excel la puedes hacer en Visual Basic con mucho mayor control y con una aplicación mucho más independiente.
¿Te has puesto a pensar por ejemplo que pasa con tu aplicación cuando la lleves a un ordenador que no tiene Excel? ¿O qué tiene una versión antigua? ¿O demasiado moderna?
Otro problema es que una vez que abres Excel, no hay forma de impedir que el usuario empiece a hacer todo lo que se le ocurra, y esto hará muy difícil de controlar tu aplicación.
Te recomiendo que te hagas con el Control TDBGRID (True DBGrid) de Apex. Yo uso mucho este control, y de hecho es prácticamente el único que utilizo fuera del standard de Visual Basic.
Este control es una ampliación del DBGrid que viene con Visual Basic pero aporta una enorme cantidad de posibilidades, entre ellas la de trabajar contra datos almacenados en matrices en memoria y no en tablas. Supongo que con esto podrías hacer mucho mejor lo que necesitas.
Suerte :-)
Mil gracias por tu respuesta... Ya habíamos comprado el ComponentOne Studio, que trae el TrueDBGrid Pro7.0, de hecho empezamos a utilizar el VSFlexGrid, pero según yo no me permite introducir fórmulas como por ejemplo multiplicar celdas o sumar celdas de diferentes columnas, ni aplicar formato por celdas (o por lo menos renglones) entre otras cosas... mi aplicación requiere mucho de hacer cálculos además de que me sería más cómodo trabajar con diferentes "hojas" ya que una parte de mis cálculos hacen referencia a otras "hojas"... ¿tu crees que con el TrueDBGrid pueda atender este tipo de requerimientos?...
Saludos
Belinda
Desde luego que puedes simular perfectamente el tema de las diferentes hojas. Utiliza para ello un control SSTab y sitúa en cada "solapa" un Grid. El efecto, y casi el aspecto (puedes poner incluso las solapas en la parte inferior como las hojas del Excel) será muy semejante al de Excel.
Mira: yo creo que el punto importante para decidir lo que necesitas para tu proyecto es el siguiente: ¿Puede el usuario introducir fórmulas?
Si el usuario puede introducir una fórmula en una celda, tu programa necesitaría interpretar esa fórmula para operar con ella. El hacer un itérprete de fórmulas con toda generalidad (operadores paréntesis, funciones etc)es prácticamente inabordable. En este caso si que no dudo que la solución es conectar con Excel, porque sino, realmente acabarías por tener que hacerte prácticamente un Excel
Por el contrario, si el usuario introduce sólo datos y las fórmulas que ligan unos datos con otros están predeterminadas en la aplicación, ni necesitas el Excel ni deberías usarlo, ya que una de las características más importantes del excel es precisamente la posibilidad de que el usuario introduzca fórmulas, y en este caso habría que impedir que lo haga.
Por supuesto que en un grid no hay forma de introducir fórmulas. Todo el cálculo entre las celdas de un grid deberá estar programado en un procedimiento (Como ves estoy asumiendo que el cálculo es siempre el mismo, o sea que el usuario no introduce fórmulas) Cada vez que el usuario cambia el contenido de una celda (por ejemplo en el evento ColRowChange) se ejecuta ese procedimiento completo, de manera que los resultados de todas las celdas se actualicen.
Puede ser un poco duro que cada vez que se cabie de celda se recalcule todo. Dependiendo del tamaño del procedimiento de recalculo, puede ser conveniente utilizar algún truco, como por ejemplo asignar a cada celda una propiedad para indicar si se debe efectuar el recalculo o no, al variar su contenido, e incluso el punto del proceso de recalculo que hay que rehacer al cambiar una celda.
Como ves, al no conocer con más detalle tu aplicación, no puedo ser muy concreto, pero insisto: salvo que el usuario introduzca fórmulas, todo lo demás se puede hacer con el grid, con procedimientos como los que te he apuntado.
No dudes en preguntar más si sigues teniendo dudas
Suerte :-)
Muchas gracias por tu sugerencias, voy a ponderar que alternativa utilizar comparando el TrueDBGrid efectuando por código los cálculos y usar el Spread (de Farpoint) que trae un Engine de Cálculos, a lo mejor más adelante te pido más consejos para el uso del TrueDB Grid ya que no lo conozco muy bien, gracias...
Saludos
Belinda
Respuesta
1
El método "CreateObject" te permite manejar Excel desde afuera como si fuera una macro dentro del mismo. Aquí va el código:
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As Long) As Long
On Error Resume Next
Set excel = GetObject(, "Excel.application") 'toma Excel si está abierto
If Err Then Set excel = CreateObject("Excel.Application") 'crea una instancia de Excel
With excel
.Workbooks.Open "tu archivo" 'abre el archivo
.Application.Visible = True 'hace que Excel sea visible
ShowWindow FindWindow("XLMAIN", 0), 3 'maximiza Excel
SetForegroundWindow FindWindow("XLMAIN", 0) 'lo enfoca
.Cells(1,1).Select 'selecciona A1 por ejemplo
...
. ActiveWorkbook. Close (False) 'cierra el libro sin guardar cambios
. Application. Quit 'cierra Excel
End With
Set excel = Nothing 'desliga el objeto
Si quieres insertar tu libro de Excel como un objeto OLE y manejarlo de la misma forma, primero debes insertarlo, luego activarlo y por último tomarlo. El código sería:
OLE1.CreateEmbed "C:\tu_ruta\tu_libro.xls", "Excel.Application"
OLE1.DoVerb 0
Set excel = GetObject(, "Excel.Application")
Para cerrarlo, directamente haces
OLE1. Close
Lo que no podrás hacer es quitar la barra de menús de Excel.
Ante cualquier duda, consúltame o envíame tu proyecto.
Gustavo
[email protected]
Gracias por tu respuesta, pero tengo varias dudas, según tengo entendido puedo hacer que el usuario capture directamente en Excel, pero lo que no estoy segura es:
1) ¿Puedo controlar que celdas especificas puede capturar el usuario, es decir, suponiendo un rango de B5:C10 puedo decirle que la B9 no es capturable?
2) ¿Puedo capturar los eventos como click y validate como en visual basic o es más complejo?
3) ¿Dónde puedo encontrar una explicación más amplia sobre las funciones que me mencionaste(ej: SetForegroundWindow )?
Saludos..
Belinda
Amiga,
Aquí van las respuestas:
1)Suponiendo que el rango a seleccionar sea A1:C10 y que las celdas válidas para seleccionar sean A1, B3 y C5, para capturar la selección en Excel desde VB y verificar que sea válida puedes usar un código como el siguiente:
Option Base 1
Sub ...()
Dim celdas() As Boolean
ReDim celdas(10, 3)
celdas(1, 1) = True
celdas(3, 2) = True
celdas(5, 3) = True
With excel.Selection
celda_actual = .Address
capturar:
Do While celda_actual = .Address
DoEvents
Loop
If .Row > 10 or .Column > 3 Then Goto reelegir
If celdas(.Row, .Column) Then
'selección correcta:continúa tu código
Else
reelegir:
'selección incorrecta:mensaje de error
Goto capturar
End If
End With
End Sub
2)Para capturar los eventos desde Excel y luego transmitírselos a tu aplicación, puedes escribir las macros de VBA desde VB. Por ejemplo:
Excel. Application. VBE. CodePanes(1). CodeModule.AddFromString "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)" & vbNewLine & "'tu código" & vbNewLine & "End Sub"
3)Hay muchos sitios de Internet donde se detallan las funciones API. Uno de ellos es http://www.vbapi.com/ref/
Suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas