 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Lun 01 Ago, 2005 5:45 pm Asunto: Ayuda con Automatización Excel |
|
|
Hola. Tengo los siguientes fragmentos de código que no me acaban de funcionar: | Código: | //*************** CREAR UNA HOJA NUEVA ***************
unsigned int OJPOExcel::CrearHoja(int i){
try{
//************* Obtengo el libro activo **************
vBook=vExcel.Exec(PropertyGet("ActiveWorkbook"));
//*********** Abro un Book de TCollection ************
vSheets=vBook.OlePropertyGet("Worksheets");
//************ Añado una hoja sin nombre *************
Variant vBefore=Unassigned,vAfter=Unassigned;
if(i==0) //* Por defecto (delante de hoja activa)
vSheet=vSheets.Exec(Procedure("Add"));
else if(i==1) //* Al principio (primera hoja)
vSheet=vSheets.Exec(Procedure("Add")<<vSheets.Exec(PropertyGet("Item")<<1));
else if(i==-1) //* Al final (última hoja)
vSheet=vSheets.Exec(Procedure("Add")<<Unassigned
<<vSheets.Exec(PropertyGet("Item")
<<vSheets.Exec(PropertyGet("Count"))));
else //* Después de la hoja "i"
vSheet=vSheets.Exec(Procedure("Add")<<Unassigned<<vSheets.Exec(PropertyGet("Item")<<i));
return 1;
}
catch(...){
return 0;
}
}
unsigned int OJPOExcel::CrearHoja(char *Nombre,int i){
int res=CrearHoja(i);
if(res){
vSheet.Exec(PropertySet("Name")<<Nombre);
return 1;
}
else
return 0;
} | En la primera función trato de crear una hoja nueva. Existen cuatro posibilidades: crearla en el lugar por defecto (delante de la hoja activa), crearla al principio, crearla al final y crearla delante de una hoja en concreto. Pero me da error. Yo creo que es por los "Unassigned", pero no estoy seguro. También probé VT_EMPTY, como ponía _Leo en algún pedazo de código, pero ná de ná.
En la segunda función llamo a la primera y renombro la hoja, pero también me da error. También he probado haciendo un casting al tipo WideString y sigue sin funcionar.
Necesito una ayudita.
Gracias a todos.
P.D.: ¿_Leo, where are you? _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 03 Ago, 2005 7:57 am Asunto: |
|
|
Hola, en vez de "Unassigned" usa "Variant::NoParam()".
Y otro detalle es que usas "Procedure" cuando esperas que devuelva un valor, y esto solo se usa cuando no se espera que devuelva nada, aun con esto funcionaria hasta el momento de renombrar la hoja, que daría un error. En vez de "Procedure" usa "Function". |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mie 03 Ago, 2005 4:48 pm Asunto: |
|
|
Hola _Leo.
Supongo que como siempre tendrás razón. Con las pruebas que he hecho, sin dar nombre a la hoja (definición: unsigned int OJPOExcel::CrearHoja(int i); ) funcionan las opciones i=0 e i=1. Cuando le asigno un nombre (definición: unsigned int OJPOExcel::CrearHoja(char *,int i); ) da un error y seguro que es por lo que dices.
Los casos i=-1 e i=i no funcionan, y seguro que es por el tipo de dato. Lo de "Unassigned" lo vi en una página en francés (http://lfe.developpez.com/Excel/) que es bastante buena (toda ella en general). Y lo raro es que no funcione tampoco VT_EMPTY. Bueno lo probaré y ya te contaré. Por cierto, no sé si te acuerdas pero ya conseguí aquello de las funciones "inline" en Word. Gracias por todo .
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 03 Ago, 2005 7:22 pm Asunto: |
|
|
Hola Cerúleo:
Lo de VT_EMPTY realmente es como pasarle 0 o NULL, algunos programas entienden esto como usar el valor por defecto.
Y la función NoParam() lo que devuelve es lo siguiente (quizás así se ve mas claro):
Variant noparam = VariantError(DISP_E_PARAMNOTFOUND);
Saludos. |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mie 10 Ago, 2005 10:23 am Asunto: |
|
|
Hola _Leo. Todo funcionó perfecto (como no podía ser de otra manera).
Ahora estoy con otras funciones (alineación de texto, bordes, colores de celdas, etc).
Tengo un pequeño problema y es que en algún sitio he visto unos valores de las constantes que usa Excel para definir alineaciones horizontales y verticales y no coinciden con los que ha visto en otros sitios (quizá haya demasiada información). Me explico mejor. Por ejemplo, el valor de la alineación horizontal "centrado" (XLHorizontalAlignment) en un artículo he visto que es "4" y en otro (no me acuerdo bien) "-4106", por ejemplo. Quisiera saber dónde puedo (dentro de la ayuda de Excel) encontrar los valores de esas constantes. Lo que quiero es definir un tipo enumerado y usar estos valores para mis funciones, algo así: | Código: | enum exlAlinHor{hIzquierda=0,hDerecha=15,hCentrado=189,hCentradoSeleccion=4156,...}; | Espero haberme hecho entender.
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 12 Ago, 2005 5:09 pm Asunto: |
|
|
Como digo siempre, todo lo necesario esta en la propia ayuda del Office. Aquí van unos pequeños videos sobre como encontrar los valores de las constantes en el propio Excel:
excel_constantes1.wmv
excel_constantes2.wmv
O bien si usas la versión 6 del Builder, mirando en las propias cabeceras también las tienes. En mi caso en:
\Borland\CBuilder6\Include\VCL\excel_2k.h |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mar 16 Ago, 2005 9:52 am Asunto: |
|
|
Hola _Leo. Gracias por todo. Respecto a la obtención de los valores de las constantes con los vídeos y los dos enlaces que encontré creo que podré ir tirando.
Ahora voy a lanzarte (tipo ametralladora) más problemas/dudas que me están surgiendo.
Problema 1:
Tengo un problema al introducir fórmulas en celdas. He probado las siguientes funciones:
| Código: | Excel->CeldaAsignarValor("K14","=E14*$I14"); -> O.K.
Excel->CeldaAsignarValor("L14","=SUMA(D14:I14)"); -> #¿NOMBRE?
Excel->CeldaAsignarFormula("L14","=SUMA(D14:I14)"); -> #¿NOMBRE?
| La primera me funciona perfectamente, y le asigno la fórmula a la propiedad "Value" de la celda.
La segunda y tercera no funcionan. En una asigno la fórmula a "Value" y en otra a "Formula". En ambos casos aparece "#¿NOMBRE?" en la celda. Y es curioso porque si en Excel pulso F2 estando en la celda (para ver la relación entre celdas de la fórmula) y luego pulso "Enter" la fórmula se ejecuta y da el valor correcto. Es como si faltara actualizar o calcular (Excel lo tengo configurado con "cálculo automático", luego esto creo que no es).
Pongo a continuación el código de ambas funciones:
| Código: | unsigned int OJPOExcel::CeldaAsignarValor(char *Nombre,char *chValor){
try{
//************* Obtengo la celda activa **************
vCell=vSheet.Exec(PropertyGet("Range")<<Nombre);
//******** Asigno el valor a la celda activa *********
vCell.Exec(PropertySet("Value")<<chValor);
return 1;
}
catch(...){
return 0;
}
}
unsigned int OJPOExcel::CeldaAsignarFormula(char *Nombre,char *Formula){
try{
//************* Obtengo la celda activa **************
vCell=vSheet.Exec(PropertyGet("Range")<<Nombre);
//******** Asigno el valor a la celda activa *********
vCell.Exec(PropertySet("Formula")<<Formula);
return 1;
}
catch(...){
return 0;
}
} |
Problema 2:
Bueno, esto más que un problema es una consulta. Se trata de un código que he encontrado (ya lo tengo adaptado) que funciona bien, pero que no entiendo mucho. Sé que tiene que ver con el manejo de bits y el desplazamiento de bits más y menos significativos, pero me gustaría alguna explicación básica (si lo entiendo bien podré usarlo para otros problemas). Pongo el código:
| Código: | unsigned int OJPOExcel::CeldaBordes(char *Rango,int bCodigo,int lCodigo,int iColor,int iGrosor){
int i;
try{
switch(lCodigo){
···
case tlNegrita:
for(i=0;i<4;i++)
if(bCodigo&(2<<i)){
vCell=vSheet.Exec(PropertyGet("Range")<<Rango);
vCell.Exec(PropertyGet("Borders")<<i+1).
Exec(PropertySet("LineStyle")<<tlSencilla);
vCell.Exec(PropertyGet("Borders")<<i+1).
Exec(PropertySet("LineStyle")<<tlNegrita);
}
break;
···
}
return 1;
}
catch(...){
return 0;
}
} | En particular es la instrucción:
| Código: | if(bCodigo&(2<<i)) | la que no entiendo bien.
Problema 3:
Otra cosa que estoy tratando de hacer en Excel es la configuración de los encabezados y pies de página. Cuando estás en excel y los configuras directamente pones cosas de este estilo: "&[Página] de &[Páginas]" o bien "&[Etiqueta]" o bien "&[Archivo]". Lo he probado así, tal cual, y no funciona. Luego he visto que hay una serie de caracteres constantes que sustituyen a estas claves. Son los siguientes: | Código: | //* Los códigos de formato especiales que se indican *
//* a continuación pueden incluirse como parte de *
//* las propiedades de encabezado y pie de página: *
//* LeftHeader,CenterHeader,RightHeader,LeftFooter, *
//* CenterFooter,RightFooter *
//* Código *** Descripción ***************************
//* &L Alinea a la izquierda los caracteres que le siguen
//* &C Centra los caracteres que le siguen
//* &R Alinea a la derecha los caracteres que le siguen
//* &E Activa o desactiva la impresión del doble subrayado
//* &X Activa o desactiva la impresión de superíndices (*)
//* &Y Activa o desactiva la impresión de subíndices (*)
//* &B Activa o desactiva la impresión de negritas (*)
//* &I Activa o desactiva la impresión de cursiva (*)
//* &U Activa o desactiva la impresión del subrayado (*)
//* &S Activa o desactiva la impresión del tachado
//* &O Activa o desactiva la impresión de contornos (sólo Macintosh)
//* &H Activa o desactiva la impresión de sombreados (sólo Macintosh)
//* &D Imprime la fecha actual
//* &T Imprime la hora actual
//* &F Imprime el nombre del documento
//* &A Imprime el nombre de la ficha del libro
//* &P Imprime el número de página (*)
//* &P+número Imprime el número de página más el número especificado
//* &P-número Imprime el número de página menos el número especificado
//* && Imprime un solo símbolo de “y” comercial
//* & "fuente" Imprime los caracteres que siguen en la fuente especificada. Asegúrese de incluir comillas dobles
//* &nn Imprime los caracteres que siguen en el tamaño de fuente especificado. Use un número de dos cifras para especificar un tamaño en puntos
//* &N Imprime el número total de páginas del documento | Pues bien, los he probado y no se corresponden. Por ejemplo, "&F" (supongo que viene de "File") no incluye el nombre del archivo, si no la Fecha ("F"echa). La "&T" (de "Time") no funciona y hay que poner "&H" ("H"ora). Y después de mucho probar he sacado los que me interesan, excepto el de Número total de páginas de la hoja (en teoría "&N"). ¿Puedo encontrar esto en el examinador de objetos, del mismo modo que las constantes intrínsecas? Tengo el Excel v8 en español. ¿Hacen referencia estos caracteres-constantes a la versión en inglés?
Por si es de interés, las funciones para configurar los encabezados y pies de página que uso son las siguientes: | Código: | //********** CONFIGURAR ENCABEZADO DE HOJA ***********
unsigned int OJPOExcel::ConfigurarEncabezado(char *EncIzq,char *EncCen,char *EncDer){
try{
//************** Obtengo la hoja activa **************
vSheet=vBook.Exec(PropertyGet("ActiveSheet"));
//****** Obtengo la configuración de la página *******
vPageSetup=vSheet.Exec(PropertyGet("PageSetup"));
//*************** Ajusto el encabezado ***************
vPageSetup.Exec(PropertySet("LeftHeader")<<EncIzq); //* ""
vPageSetup.Exec(PropertySet("CenterHeader")<<EncCen); //* "&F - &A"
vPageSetup.Exec(PropertySet("RightHeader")<<EncDer); //* ""
return 1;
}
catch(...){
return 0;
}
}
//************** CONFIGURAR PIE DE HOJA **************
unsigned int OJPOExcel::ConfigurarPie(char *PieIzq,char *PieCen,char *PieDer){
try{
//************** Obtengo la hoja activa **************
vSheet=vBook.Exec(PropertyGet("ActiveSheet"));
//****** Obtengo la configuración de la página *******
vPageSetup=vSheet.Exec(PropertyGet("PageSetup"));
//*************** Ajusto el encabezado ***************
vPageSetup.Exec(PropertySet("LeftFooter")<<PieIzq); //* ""
vPageSetup.Exec(PropertySet("CenterFooter")<<PieCen); //* "&P - &N"
vPageSetup.Exec(PropertySet("RightFooter")<<PieDer); //* "&D - &T"
return 1;
}
catch(...){
return 0;
}
} | Espero que alguien me eche una mano. Muchas gracias de antemano.
Un saludo y cuídense. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mar 16 Ago, 2005 6:13 pm Asunto: |
|
|
Hola otra vez.
¡Se me olvidaba! El otro problema (de momento):
Problema 4:
El autorelleno de celdas con fórmulas ya existentes (el efecto es similar al de arrastrar una celda en un rango: fila, columna o tabla). No me hace nada. El rango de partida debe estar incluido en el rango de relleno, y lo está. El código de la función que empleo es el siguiente:
| Código: | unsigned int OJPOExcel::CeldaAutoRellenar(char *Nombre1,char *Nombre2,eAutoRelleno AutoRelleno){
try{
//************* Obtengo el rango activo **************
vRange=vSheet.Exec(PropertyGet("Range")<<Nombre1);
//************ Selecciono el rango activo ************
// Variant vSelection=vRange.Exec(Procedure("Select")); //Pruebas
// vRange.Exec(Procedure("Select")); //Pruebas
// vRange=vRange.Exec(Procedure("Select")); //Pruebas
//*********** Autorelleno el rango destino ***********
vRange.Exec(Procedure("AutoFill")<<Nombre2<<AutoRelleno);
return 1;
}
catch(...){
return 0;
}
} | Y un ejemplo de uso sería: | Código: | Excel->CeldaAutoRellenar("E14","E14:L14"); | Sin embargo, no hace nada, las celdas se quedan en blanco, sin valores, sin fórmulas, ni nada...
El parámetro "AutoRelleno" indica a Excel cómo debe rellenar las celdas. Si no se especifica ninguno, Excel selecciona el más apropiado.
¿Alguna ayuda?
Por cierto, respecto al problema 1 del post anterior, la siguiente instrucción la opera bien: | Código: | Excel->CeldaAsignarFormula("D14","='1. Control de mediciones'!H14"); | donde "'1. Control de mediciones'!" es el nombre de otra página creada. No sé por qué las otras no. ¿Otra ayudita?
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 16 Ago, 2005 10:32 pm Asunto: |
|
|
- Problema 1: La razón por la que ocurre no lo se, pero si en vez de usar “Exec” usas “OlePropertySet” funciona correctamente, o sea modificando la función del siguiente modo:
| Código: | unsigned int CeldaAsignarFormula(char* Nombre, char* Formula)
{
try {
//************* Obtengo la celda activa **************
vCell = vSheet.OlePropertyGet("Range", Nombre);
//******** Asigno el valor a la celda activa *********
vCell.OlePropertySet("Formula", Formula);
return 1;
}
catch(...) {
return 0;
}
} |
- Problema 2: Es simplemente desplazar una cantidad de bits hacia la izquierda (cada desplazamiento hacia la izquierda equivale a multiplicar por dos). Quizás con los números en binario se vea mas claro:
00111100 << 1 = 01111000 (60 << 1 = 120)
- Problema 3: En la ayuda de Excel viene exactamente la tabla que has puesto, ciertamente la han traducido, pero no así las letras. En la versión en español quedaría así:
| Código: | &Z Alinea a la izquierda los caracteres que le siguen.
&C Centra los caracteres que le siguen.
&D Alinea a la derecha los caracteres que le siguen.
&B Activa o desactiva la impresión del doble subrayado.
&X Activa o desactiva la impresión de superíndices.
&Y Activa o desactiva la impresión de subíndices.
&E Activa o desactiva la impresión de negritas.
&I Activa o desactiva la impresión de cursiva.
&U Activa o desactiva la impresión del subrayado.
&T Activa o desactiva la impresión del tachado.
&F Imprime la fecha actual.
&H Imprime la hora actual.
&N Imprime el nombre del documento.
&A Imprime el nombre de la ficha del libro.
&P Imprime el número de página.
&P+número Imprime el número de página más el número especificado.
&P-número Imprime el número de página menos el número especificado.
&& Imprime un solo símbolo de "y" comercial.
&"fontname" Imprime los caracteres que siguen en la fuente especificada.
Asegúrese de incluir comillas dobles.
&nn Imprime los caracteres que siguen en el tamaño de fuente especificado.
Use un número de dos cifras para especificar un tamaño en puntos.
&# Imprime el número total de páginas del documento.
&G Imagen
&R Ruta de acceso del documento |
- Problema 4: Fíjate en el segundo parámetro, le estas pasando una cadena y se espera un objeto de tipo "Range". Siguiendo al pie de la letra el ejemplo que viene en la ayuda de Excel, quedaría algo así:
| Código: | enum XlAutoFillType {xlFillDefault = 0, xlFillCopy, xlFillSeries,
xlFillFormats, xlFillValues, xlFillDays, xlFillWeekdays,
xlFillMonths, xlFillYears, xlLinearTrend, xlGrowthTrend };
unsigned int CeldaAutoRellenar(char* Nombre1, char* Nombre2,
XlAutoFillType AutoRelleno = xlFillDefault)
{
try {
Variant sourceRange = vSheet.Exec(PropertyGet("Range") << Nombre1);
Variant destRange = vSheet.Exec(PropertyGet("Range") << Nombre2);
sourceRange.Exec(Procedure("AutoFill") << destRange << AutoRelleno);
return 1;
}
catch(...) {
return 0;
}
} |
|
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mie 17 Ago, 2005 6:06 pm Asunto: |
|
|
Hola _Leo.
Muchísimas gracias. Todo funcionó perfecto. Clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap, clap,...
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|