[BCB + excel] waarde in cel schrijven

Pagina: 1
Acties:
  • 230 views sinds 30-01-2008
  • Reageer

  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
Edit: Het probleem is iets meer gelocaliseert zie enkele post naar beneden


Ik heb het volgende probleem, ik heb via de borland communities een heel mooi voorbeeld gevonden om in excel 97 te werken vanuit borland builder. Nu heb ik het ietwat moeten ombouwen voor Excel 2000. Alles werkt nu alleen zou het programma iets in cel b2 moeten schrijven. Dit doet hij niet, wat is er mis met deze code?
code:
1
2
3
4
5
6
7
8
9
10
11
12
//Activate the 2nd Worksheet
        numSheet=2;
        ws=sheets->get_Item(numSheet);
        ws->Activate(TDefLCID());
        Cell1="B2";
        cells=ws->get_Range(Cell1,TNoParam());
        cells->Activate();                  //note : get_Range + Activate to activate a cell
    //Put an int in the activated cell
        intValue=1234;
//regel10 
        cells.Value=1234;
        cells->set_Value(intValue);

Hij activeert wel de juiste cel, want als je een toets indrukt komt die gelijk in de cel te staan, alleen hij zet de meegegeven waarde er niet in.

De compiler geeft bij regel 11 de foutmelding
[C++ Error] Excel97.cpp(130): E2316 'Value' is not a member of 'RangePtr'
Deze member staat wel in de file "Excel_2K_SRVR" welke gebruikt wordt door borland voor excelfuncties.

[ Voor 0% gewijzigd door Paulstartrek op 25-09-2002 14:25 . Reden: toevoeging info ]


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 17-08 22:31

Belgar

Archmaster ranzige code..

cells->Value=1234;

?

...Als het maar werkt


  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
Helaas werkt dat ook niet, al is het dit keer een andere foutmelding
[C++ Error] Excel97.cpp(131): E2316 'Value' is not a member of 'Range'

nog vreemder is dat deze regel niet werkt (het schrijven)
cells->set_Value(intValue);

Maar deze regel wel (het lezen)
cells->get_Value();

[ Voor 0% gewijzigd door Paulstartrek op 06-09-2002 13:16 . Reden: extra info ]


  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
cells.Value=1234; of cells->Value=1234;
Deze regels werken allebei niet niet. maar ik kan geen vervangende regels vinden.
Wie weet waar ik moet zoeken of wat ik fout doe?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik kan op het moment effe niks opzoeken voor je, maar "cells" klinkt alsof het om meerdere cellen gaat. Dat blijkt ook wel uit de foutmelding, want daar heeft ie het over een range.
Je moet dus op een of andere manier nog die ene cell bepalen.

Never underestimate the power of


  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
cell kent ie niet, en de juiste cel word geactiveert en als er iets in die cel stond dan word het ook keurig weggehaald er wordt alleen niets geschreven. Volgens mij heeft hij dan wel de juiste cel geselecteerd ondanks de aanroep met cells.

  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
Ik wil dit topic toch weer even terughalen, Ik vergelijk 2 documenten met elkaar, een excel document en een txt-file beide worden geopend in excel. Op het moment dat de waarde van cel A3 in beide documenten ongelijk is aan elkaar moet de regel uit de txt-file worden toegevoegd aan het excel document. Het meest logische zou zijn copy-paste. Alleen copy werkt niet en paste kent hij niet, inserten doet ook niets en de functie set_Value haalt alleen de huidige waarde weg.
Omdat Value een TVariant is moet het gewoon werken met een (Ansi)string.
Wie kan ervoor zorgen dat ik kan schrijven in het excel document? Ik weet het echt ff niet meer 8)7 :?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//Opening a Workbook in Excel
strcpy(s,"c:\\mijn documenten\\paul\\lijst.xls");
strcpy(t,"c:\\mijn documenten\\paul\\lijst.txt");
wbName=t;
wbName2=s;
try {
  wb=books->Open(wbName2); //gewoon xls sheet openen
  wb2=books->Open(wbName,TNoParam(),false,4);  // txt document met ; gescheiden velden

int a=15; //doen even alsof document 15 regels heeft
i=2;  //tellertje huidige regel txt document
int t=2; // tellertje huidige regel excel document
 while (i<a && i!=0 && t<a){
   sheets=wb2->get_Sheets();
   numSheet=1;
   ws=sheets->get_Item(numSheet);
   AnsiString s="A"; // selecteer colom A en regel i
   s+=i;
   Cell1=(s);
   ShowMessage(Cell1); //checken welke regel we zitten
   cells=ws->get_Range(Cell1,TNoParam()); //pointer naar huidige cell in txt document
//Nu het tweede document de pointer setten(excelfile)
   sheets2=wb->get_Sheets();
   ws2=sheets2->get_Item(numSheet);
   AnsiString u="A"; //colom A en regel t
   u+=t;
   Cell2=(u);
   cells2=ws2->get_Range(Cell2,TNoParam());
   AnsiString wbName2=cells->get_Value();
   AnsiString wbName3=cells2->get_Value();
   if (wbName2!=wbName3){      // nu beide cellen vergelijken, niet gelijk dan
     ShowMessage("Staat nog niet in Excel sheet");
     ShowMessage("voegt toe");
     cells->Copy();                 //deze doen niets
     cells2->Insert();             
     cells2->Insert("hallo");   
     cells2->Paste();              //onbekende functie
     cells2->Activate();     
         
     ShowMessage(cells2->get_Value());   //roept op de huidige waarde
     cells2->set_Value("hallo");         //zou hallo moeten schrijven
     ShowMessage(cells2->get_Value());   //controleer wat hij gedaan heeft 
     i++;                //alleen i ophogen want de t-pointer
                                                                staat (nog steeds) goed.
   }
   else{
//   ShowMessage("Staat eral");

     i++;
     t++;
   }
 }
}
catch (Exception &exception) {
Application->MessageBox(
"Sure, there remains a problem anywhere !",
"Sorry...",
MB_ICONSTOP);
abort;
}

[ Voor 0% gewijzigd door Paulstartrek op 23-09-2002 13:55 . Reden: layout aanpassen ]


  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
code:
1
2
3
4
     ShowMessage(cells->get_Value());
     ShowMessage(cells2->get_Value());
     cells2->set_Value(cells->get_Value());
     ShowMessage(cells2->get_Value());

De eerste messagebox geeft keurig aan Piet(excel document)
De tweede messagebox zegt Hans (txt document)
inderdaad ze zijn ongelijk en in plaats van Hans moet er nu Piet komen te staan.
De derde messagebox zou moeten weegeven Piet in plaats daarvan staat er niets, een lege messagebox.
cells heeft de functie: set_Value: void (TVariantInParam) en als parameter kan ik dus een variabele, een int, een string, of een functie meegeven. Geen van allen werkt. Ik wordt er zeer depressief van |:(

  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
ook variaties zoals copy en pastespecial, insert en Add willen geen row of cell of meerdere cells uit het ene document in het andere zetten. Ik heb volgens mij alle mogelijke variaties wel geprobeerd. Wie weet hoe dit moet? Wie kan mij helpen?

  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
*kick*
Kom op er is toch wel iemand die er wat verstand van heeft? Als je bereid ben om er even naar te kijken van het weekend ofzo meld dat dan ook even anders ben ik verplicht om vrijdag een nieuw plan van aanpak in te dienen en hetgene wat nu wel werkt weg te gooien. Please _/-\o_ help me.

  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
*kick* (laatste keer)

Verwijderd

Ik heb in het verleden veel met koppelingen tussen BCB en Word / Excel gedaan.

Wat ik al snel merkte is dat het gebruik van die "Excel_2K_SRVR" bestanden erg lastig is en niet tot het juiste resultaat leidt.

Wat ik je aanraad is gebruik te maken van de 'standaard' OLE koppelingen d.m.v. Variants.
Voorbeeld voor MS-Word :

Variant app=CreateOleObject("Word.Application");
//Ophalen van de docs ....
docs=app.OlePropertyGet("Documents");

Met bovenstaande methode open je een connectie met Word en kun je nu d.m.v. de standaard methodes en eigenschappen aangeboden door het Application Object van Word de nodige zaakjes afhandelen.

Ik raad je dus de nu bewandelde weg af.

Daar komt nog bij dat het gebruik van de 'Variant methode' altijd is blijven werken (source met HELE kleine wijzigingen al vanaf BCB versie 3)

Hoe je nu bijvoorbeeld een word document moet opnenen in Word kun je opzoeken in de vb script help van Word. Je roept namelijk de VB aan in Word.

Voorbeeld :

Variant app=CreateOleObject("Word.Application");
//Ophalen van de docs ....
//Docs is namelijk een property van het Application Object van Word
docs=app.OlePropertyGet("Documents");
ChangeFileOpenDirectory is weer een methode van Application Object
app.OleFunction("ChangeFileOpenDirectory",WideString(tempdir));
//Wacht even omdat anders Word het niet kan bijhouden
Sleep(1000);
//Open is weer een Methode van de Docs verzameling
docs.OleFunction("Open",WideString(bestandsnaam));
//Zet de laatste actief
doc = app.OlePropertyGet("ActiveDocument");
select = app.OlePropertyGet("Selection");
enz .....

Dezelfde methode kun je ook voor Excel gebruiken

Verwijderd

Hier nog even een aanvulling.

Ik heb nog wat coding voor je hoe je bijvoorbeeld excel cellen kunt benaderen / lezen en vullen

Variant Cell,Cells,wExcell,wWorkbooks,wWorkbook,wCells,wSheet,wSheets;

wExcell = CreateOleObject("Excel.Application");

//Bij aanmaken van een nieuw workbook 1 sheet
wExcell.OlePropertySet("SheetsInNewWorkbook",1);

//De verzameling Workbooks geeft de mogelijkheid om workbooks aan te maken
//Eerst even een verwijzing naar de verzameling ophalen
wWorkbooks=wExcell.OlePropertyGet("Workbooks");

//Nu een nieuw workbookje aanmaken
wWorkbooks.OleFunction("Add");

//Haal weer de verwijzing naar het zojuist toegevoegde nieuwe workbookje op
wWorkbook=wWorkbooks.OlePropertyGet("Item",1);

//En ophalen eerste sheetje ... want deze is nu actief (1 sheet per nieuwe workbook)
wSheet=wWorkbook.OlePropertyGet("ActiveSheet");

//Nu naar de cellen ....

//Onderstaand voorbeeld is ter illustratie
//hSchip en hReis zijn een string
//hDatumReis en hDatumInslag zijn een TDate

//Ik gebruik hier niet
//Cell.OlePropertySet("Text",TVariant(hSchip)); maar dat werkt natuurlijk ook .... alleen
//voor text uiteraard

//Zet schip, reisdatum, inslagdatum, reisnaam op rij 1 kolom 1,2,3,4
Cell=wSheet.OlePropertyGet("Cells",1,1);
Cell.OlePropertySet("Formula",TVariant(hSchip));

Cell=wSheet.OlePropertyGet("Cells",1,2);
Cell.OlePropertySet("Formula",TVariant(hDatumReis.FormatString("dd/mm/yyyy")));

Cell=wSheet.OlePropertyGet("Cells",1,3);
Cell.OlePropertySet("Formula",TVariant(hDatumInslag.FormatString("dd/mm/yyyy")));

Cell=wSheet.OlePropertyGet("Cells",1,4);
Cell.OlePropertySet("Formula",TVariant(hReis));

//Tekst ophalen doe je zo ....
celinhoud=Cell.OlePropertyGet("Text");

//Met datums en formules moet je oppassen... die haal je zo op :
celinhoud=Cell.OlePropertyGet("FormulaR1C1");
datumveld=StrToInt(celinhoud);

Zo zie je ... het is erg eenvoudig op deze manier ... maar je moet het net ff weten ....

:*)

  • Paulstartrek
  • Registratie: September 2002
  • Laatst online: 08-11-2005
Ik vraag me nu alleen iets af zit er ergens een typefout in je code? want ik heb het uiteraard direct geprobeerd, alleen ik krijg de volgende foutmelding:
Project testmail raised exception class EAccessViolation with message 'Access violation at adress 0040CC53 in module 'TESTMAIL.EXE'. Read of adress FFFFFFFF'. Process stopped.

bij de volgende regel
wExcell.OlePropertySet("SheetsInNewWorkbook",1);

Ik heb op het form waar ik de code in gezet heb al de excel applicatie server verwijdert, ik heb het ook met een excelOLE object geprobeert. Wat moet er nou precies op het form staan? Want hij loopt vast elke keer na de eerste regel (CreateOleObject)
Pagina: 1