Wobei die Exelianer nicht so gerne auf diese Art arbeiten, sprich immer wieder Workbooks, selecten und aktivieren und zwischen denen hin und her springen oder kopieren (zumindes was ich so an VBA Code kenne).
Besser ist es da Objektvariablen anzulegen und dann direkt Werte aus Zellen auszulesen oder zuzuweisen,..
Ist schon recht. Aber das war von mir ja auch nur ad hoc und auf die schnelle (nachts) als sehr vereinfachter Vorschlag gemeint.
Wenn man es aber schon komfortabel, flexibel und mit allen Feinheiten haben will, sollte man ohnehin alles in eine eigene Klasse kapseln. So jedenfalls mache ich das für MSWord und MSExcel in eigenen Klassen tMSExcel und tMSWord mit einer Vielzahl an Methoden zum Handling der Documents bzw. Datenblätter (deren komplexe interne Anweisungen in den Details man sich sowieso nicht dauernd merken kann).
Damit sieht dann z.B. die Belegung einer Excel-Zelle ganz einfach so aus:
Code:
MSExcelApp.SetCellContent(2,1,4,3,s); // MSExcelApp ist die Instanz der Klasse
wobei als Parameter übergeben werden: WorkBookIndex, WorksheetIndex, Spalte, Reihe und Eintrag.
Diese Methode z.B. ist in meiner Klasse so implementiert:
Code:
function tMSExcel.SetCellContent(aBook, aSheet: Word; aCol, aRow: Word; content: string): Boolean;
begin
result := false;
if (aCol=0) or (aRow=0) then exit;
if (aBook > high(ExcelSheets)) or (aSheet > high(ExcelSheets[aBook])) then exit;
if not VarIsEmpty(fExcel) then
begin
if (aBook=0) or (aSheet=0) then // das gegenwärtig aktive Worksheet benutzen
fExcel.ActiveSheet.Cells[aRow, aCol].Value := content
else // auf explizit genanntes Worksheet zugreifen
ExcelSheets[aBook, aSheet].Cells[aRow, aCol].Value := content;
result := true;
end;
end;
wobei fExcel das in der Klasse deklarierte OleObject 'Excel.Application' ist, das im Constructor generiert wird,
und ExcelSheets ein Array of Array of Olevariant ist mit der 1.Dimension für die WorkBooks und mit der 2.Dimension für die den Workbooks jeweils zugehörigen WorkSheets.
Größe sowie Belegung des offenen Arrays werden bei Öffnung oder Neuanlage eines Workbooks sowie der entsprechenden WorkSheets
gemäß derem jeweiligen Index automatisch zugewiesen buw. modifiziert in der Art:
Code:
Setlength(ExcelSheets,AnzahlWorksBooks+1,AnzahlWorkSheetsImBook+1);
und
Code:
ExcelSheets[i,j]:=fExcel.WorkBooks[i].Worksheets[j];
Den jeweiligen Index = 0 lasse ich frei (also unassigned). so dass der Indexverlauf des Arrays 1:1 synchron mit dem der Zählung bei Excel verläuft.
Das Ergebnis dieser automatischen Verwaltung ist der sehr komfortable Zugriff auf die verschiedenen Operationen mit Excel wie oben als Beispiel mit SetCellContent() gezeigt.