Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   ayuda urgente con funcion y excel (https://www.clubdelphi.com/foros/showthread.php?t=69332)

DarkBlue 11-08-2010 08:48:19

ayuda urgente con funcion y excel
 
hola que tal estaba usando excel y delphi y necesitaba validar los datos... de alguna manera traer el resultado a delphi compararlo y modificar el valor de la hoja de excel bueno aqui les dejo mi codigo pero no me funciona al 100% el problema es que me sigue trayendo el mismo valor... siempre es true y aunque deba de dar false no cambia el resultado de la funcion


Código Delphi [-]
for X:=0 to npiezas-1 do //recorro el numero de items que tiene la hoja de excel
begin


    c:=X+fila;//comienzo siempre desde la fila 2
    A:='A'+inttostr(c);
    B:='B'+inttostr(c);
    F:='=ISBLANK(R[-4]'+'C[-'+inttostr(x+1)+'])';//creo una formula
    F2:='=ISTEXT(R[-4]'+'C[-'+inttostr(x+1)+'])';//otra formula

    formulaString2:=F2;//le asigo el valor de la formula
    XLS.Range['F1','F1'].select;//selecciono ese rango
    XLS.Selection.ClearContents;//borro lo que pueda haber

    XLS.Range['F1','F1'].formula:=formulastring2;//le pongo la formula


    v:=tostring(XLS.Range['F1','F1'].select);//llamo a una funcion para copiar el valor
    if  v= 'True' then XLS.Range[B,B].value:='0';     //si es texto verdadero
    
    showmessage(tostring(XLS.Range[B,B])); mostramos lo que trae la funcion
    listainserta.Items.Add(tostring(XLS.Range[B,B])); //insertamos el valor en una lista de delphi
    XLS.Range[A,A].copy;
    nombrepieza.Items.Add(tostring(XLS.Range[A,A]));//insertamos el nombre del item


end;


aqui esta la funcion que me permite copiar valores desde excel ...


Código Delphi [-]
function ToString(V: Variant): String;
begin
  Result := V;
end;

si saben por que me sigue dando siempre true... aunque en realidad el resultado de la funcion que aplico en excel da false ... ayuda urgente me queda poco tiempo y no se que hacer... :S muchas gracias y espero que este codigo le sirva a alguien =)

Neftali [Germán.Estévez] 11-08-2010 11:36:47

Lo que no me queda claro es si los datos son incorrectos en Excel o al traerlos a Delphi.

Cuando añadas código, intenta colocar las etiquetas para que se lea correctamente.

Un saludo.

cloayza 11-08-2010 16:24:01

Amigo me tome la libertad de hacer algunos cambios a tu codigo, yo personalmente prefiero trabajar con las coordenadas de las hojas...

Es decir hago referencia a Filas y columnas de una hoja excel y utilizo una funcion para transformar los numeros de filas y columnas a formato letranumero.

Ejemplo : Fila=1, Columna=1 hace referencia A1.

Bueno aqui esta el codigo te agrege dos funciones...

Código Delphi [-]
  {Combierte el indice de la columna a su respectiva letra de columna
  Index=1-> A,  Index=6->F, Index=27->AA}
  Function ExcelColToChar(Index : Integer) : String;
  Begin
       If Index < 1 then
          Result:='A'
       Else
       Begin
            If Index > 702 Then
               Result:='ZZ'
            Else
            Begin
                 If Index > 26 Then
                 Begin
                      If (Index Mod 26)=0 Then
                         Result:=Chr(64 + (Index Div 26)-1)
                      Else
                         Result:=Chr(64 + (Index Div 26));

                      If (Index Mod 26)=0 Then
                         Result:=Result+Chr(64+26)
                      Else
                          Result:=Result+Chr(64 + (Index Mod 26));
                 End
                 Else
                     Result:=Chr(64 + Index);
            End;
       End;
  End;

  {Convierte Filas y columnas a formato Excel
  Ejm:
     Row1=1, Col1=1, Row2=1, Col2=1 -> A1:A1

     A(1)    B(2)    C(3)   ExcelSetRange(Row1, Col1, Row2, Col2)
   1  1,1   1,2      1,3    ExelSetRange(1,1,1,1) ->A1:A1
   2  2,1   2,2      2,3    ExelSetRange(1,2,3,2) ->B1:B3
   3  3,1   3,2      3,3    ExelSetRange(3,3,3,3) ->C3:C3
  }

  Function ExcelSetRange(Row1, Col1, Row2, Col2:Integer):String;
  Begin
       Result:=Format('%s%d:%s%d',[ExcelColToChar(Col1),Row1,ExcelColToChar(Col2),Row2 ]);
  End;


...
Var
    Value:Variant;
begin
     c:=X+fila;

          A:=ExcelSetRange(C,1,C,1);
          B:=ExcelSetRange(C,2,C,2);

          strFormula:=Format('=ISTEXT(%s)',[ExcelSetRange(c,1,c,1)]) ;

          {ExcelSetRange(1,6,1,6)->F1}
          F1:=ExcelSetRange(1,6,1,6);

          oXLS.Range[F1].Select;
          oXLS.Selection.ClearContents;
          oXLS.Range[F1].Formula:=strFormula;

          Value:=oXLS.Range[F1].select;
          {Pregunta por el tipo del Value que como es de tipo Variant}
          if ((VarType(Value)=varBoolean) And (Value))Then
             oXLS.Range[b].Value:='0';

          Showmessage(ToString(oXLS.Range[b]));
          ListaInserta.Items.Add(ToString(oXLS.Range[b]));
          oXLS.Range[A].copy;
          NombrePieza.Items.Add(ToString(oXLS.Range[A]));

En negrita los cambios que me tome la libertad de modificar...

Nota: Eso de urgente en los titulos de los post, aqui no corre lee la guia de estilo...

Saludos cordiales

DarkBlue 05-05-2012 20:52:07

hola, tiempo despues solucione esto pero creo que perdi el codigo asi que tu implementacion de esto no me funciono

Código Delphi [-]


                      WS := XLApplication.ActiveSheet ;

                      F2:='=IsText(E'+inttostr(xx)+')';
                      WS.Range['e5', 'e5'].Formula := f2 ;
                      WS.Range['E6','E6'].select;

                    v1:= XLApplication.Range['E5','E5'].select;
                   showmessage(tostring( XLApplication.Range['E5','E5'].select));

                 if ((VarType(v1)=varBoolean) And (v1))Then     ws.cells[xx,5].value:='0';

no se que hice mal

Casimiro Notevi 05-05-2012 21:11:47

Por favor, DarkBlue, procura poner títulos descriptivos a tus preguntas. Si echas un vistazo a nuestra guía de estilo verás que una de los apartados habla sobre ese tema, eso de "ayuda urgente..." no está "bien visto" ;)
Por supuesto, esto ya para el siguiente mensaje, este es de hace tiempo :D

roman 07-05-2012 17:34:30

Pues sí, no sé yo si lo de urgente tenga relevancia dos años después :D En todo caso, lo que queda claro es que el compañero no se tomó la molestia de dar las gracias en su momento y sólo retorna al hilo ahora que tiene problemas. Eso es feo.

// Saludos

DarkBlue 02-06-2012 19:23:30

mil perdones, no quise hacer eso creo que busque en otro lado encontrando la solucion mi prisa me hizo olvidarme de esto mil anos despues disculpas!!! muchas gracias a todos los que me han ayudado bueno la sintesis de esto es que excel retorna valores -1 y 1 para los boleanos aver

Código Delphi [-]
 F2:='=IsText(E'+inttostr(xx)+')';
                      WS.Range['e5', 'e5'].Formula := f2 ;
                      WS.Range['E5','E5'].select;

                       v1:= XLApplication.Sheets[1].Cells[5,5]; //XLApplication.Range['E5','E5'].select;

                       b:=tostring(v1);

                       if (b='-1')Then   ws.cells[xx,5].value:='0';
                       XLApplication.Range['E5','E5'].select;
                       XLApplication.Selection.ClearContents;

                       F2:='=IsBlank(E'+inttostr(xx)+')';
                       WS.Range['e5', 'e5'].Formula := f2 ;
                       WS.Range['E5','E5'].select;

                       v1:= XLApplication.Sheets[1].Cells[5,5]; //XLApplication.Range['E5','E5'].select;

                       b:=tostring(v1);

ademas de que tienes que poner en ingles las formulas :S

Casimiro Notevi 02-06-2012 19:32:32

Cita:

Empezado por DarkBlue (Mensaje 434150)
ademas de que tienes que poner en ingles las formulas :S

Eso es de lo "bien" que está hecho, una auténtica chapuza.


La franja horaria es GMT +2. Ahora son las 09:40:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi