Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Diferentes versiones de Excel

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Diferentes versiones de Excel Responder citando

Buenas, me ha surgido un problemilla, a ver, importo datos desde Excel a una tabla Access, lo hago mediante automatización OLE y con Excel 2003 y Access 2003 no tengo ningún problema, pero ¿hay algo que pueda hacer para que funcione correctamente con versiones anteriores de Excel y Access?, es que cuando intento importar los datos sale un error "Clase no Registrada". ¿Se puede saber por código que versión está instalada en el ordenador donde se ejecutará la aplicación?.

Necesito esta información, o algún lugar de donde poder sacarla. Muchas gracias por vuestra ayuda.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola.
Intentaré mirarte el fin de semana lo de obtener la versión de excel, ya que ahora no tengo el C++Builder a mano.
Por otra parte, me gustaría que me dijeras cómo cargas datos a una base de datos Acces. Me vendría bien algún ejemplo, o algunas líneas de código.
Gracias de antemano y un saludo.
_________________
Nunca digas "Es imposible" sin intentarlo antes.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Variant app = CreateOleObject("Excel.Application");
// Variant app = CreateOleObject("Access.Application");
String version = app.OlePropertyGet("Version");
app.OleProcedure("Quit");
ShowMessage(version);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo, de dónde sacas esa información??, si es que no debo buscar bien las cosas... nunca encuentro cuáles son todos los parámetros que se le pueden pasar a OlePropertyGet y OlePropertySet.

Por cierto, mi programa funciona perfectamente con Excel 2003, utilizo automatización OLE para accceder a Excel y poder exportar datos a la BD, pero cuando intento ejecutarlo con Excel 97 el programa devuelve un error "Clase no registrada", ¿puedo solucionar eso?

Cerúleo, para exportar datos desde Excel puse el otro día un mensaje en el foro Tips & Tricks que exporta los datos desde una hoja de excel a una tabla Access (que creo anteriormente dándole a los campos los mismos nombres que a las columnas de la hoja Excel). Míralo y comprueba a ver si a ti te funciona, eso es lo que a mi me da errores con Excel 97. Si no entiendes algo, dímelo.

Gracias a los dos.

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Cita:
de dónde sacas esa información??

Como siempre digo, toda la información necesaria la saco del propio Office, tienes varias maneras como ya he dicho otras veces, usando el editor de macros, el examinador de objetos dentro del editor de macros, o en los archivos de ayuda. Por ejemplo en mi caso con el Office2003 la referencia de los objetos de Excel la encuentro en:

C:\Archivos de programa\Microsoft Office\OFFICE11\3082\VBAXL10.CHM

En cada versión tiene nombres distintos y esta en lugares distintos, a veces integrada en el archivo de ayuda principal, pero al menos que yo sepa desde el Office97 viene todo en la ayuda.

Cita:
pero cuando intento ejecutarlo con Excel 97 el programa devuelve un error "Clase no registrada", ¿puedo solucionar eso?

He hecho una prueba usando el VirtualPC, he instalado Windows 98 (primera edición), luego he instalado el Office97 y por ultimo ADO 2.5 SP3. Y me ha funcionado correctamente, así que el problema debe estar en otro detalle. (Uso BCB6+Update4)

Cita:
para exportar datos desde Excel puse el otro día un mensaje en el foro Tips & Tricks que exporta los datos desde una hoja de excel a una tabla Access

He hecho unas pequeñas modificaciones en tu código para que funcione un poco mas rápido, al menos en las pruebas que he hecho hay bastante diferencia de velocidad. Una de las cosas es leer los datos de Excel de una vez y no celda por celda, y luego otra, que por si sola ya mejora bastante la velocidad es usar "DisableControls" para que no se actualicen los controles visuales mientras esta añadiendo datos, en mi opinión creo que es mejor así y mostrar el progreso usando una TProgressBar:
Código:
String OrigenPath = ExtractFilePath(Application->ExeName) + "libro.xls";
Variant xlApp, xlLibro, xlHoja, xlCelda, xlRango, UltimaCelda, datos;

xlApp = CreateOleObject("Excel.Application");
xlApp.OlePropertySet("Visible", false);
xlLibro = xlApp.OlePropertyGet("Workbooks");
xlLibro.OleProcedure("Open", OrigenPath.c_str(), 0, true);
xlHoja = xlApp.OlePropertyGet("ActiveSheet");

if (xlHoja.IsEmpty())
    throw Exception("No hay ninguna hoja activa");

//Busca la última fila y columna que tienen datos:
xlCelda = xlHoja.OlePropertyGet("Cells");
const xlCellTypeLastCell = 11;
UltimaCelda = xlCelda.OleFunction("SpecialCells", xlCellTypeLastCell);
int UltimaFila = UltimaCelda.OlePropertyGet("Row");
int UltimaCol = UltimaCelda.OlePropertyGet("Column");
int Fila = 2; //es la primera fila en la que hay datos
int Columna = 1;

// Seleccionamos el princio del rango
xlRango = xlHoja.OlePropertyGet("Cells", Fila, Columna);
// Adaptamos el tamaño del rango
xlRango = xlRango.OlePropertyGet("Resize", UltimaFila, UltimaCol);
// Recibimos el array de datos
datos = xlRango.OlePropertyGet("Value");
// Cerramos Excel
xlApp.OleProcedure("Quit");

// Insertamos el array con los datos en la tabla Access
ProgressBar1->Max = UltimaFila;
ADOTable1->DisableControls();
for (int f = Fila - 1; f < UltimaFila; f++)
{
    const char* campos[] = { "Funcion", "Unidad", "Subclasificacion",
        "Pais", "CA", "Periodo", "Año", "Cantidad", "Fuente", 0 };
    ADOTable1->Append();
    for (int i = 0; campos[i]; i++)
        ADOTable1->FieldValues[campos[i]] = datos.GetElement(f, i + 1);
    ADOTable1->Post();
    ProgressBar1->Position = f;
}
ADOTable1->EnableControls();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Uff!!, _Leo mil gracias, y gracias también por revisar mi código y mejorarlo.

Seguiré buscando porqué me sale el error de "clase no registrada" y ya os comentaré algo, por si acaso en un futuro alguien tiene el mismo problema.

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

El error no tiene nada que ver con Excel, fue un malentendido con el usuario final del programa. Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Que includes faltan? Responder citando

He visto el codigo y no atino a utilizarlo, que includes he de poner?

Mil Gracias.
Volver arriba
Mensaje    Asunto: Responder citando

Yo he puesto este include y así funciona:

#include "Comobj.hpp"

Ciao
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Me da error en la siguiente línea:
Código:

ABSTable1->FieldValues[campos[i]] = datos.GetElement(f, i + 1);

el error dice Variant index out of bounds.
y mis campos son estos:
Código:

const char* campos[] = { "numero", "nombre", "apellidos","telefonofijo", "telefonomovil", "email", "fechanacimiento", "fechaalta", "observaciones", "cuota","localidad","dni","pagado","fecharenovacion","pag","fechacaducidad","iban","domicili"};

_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.