Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Catrex am 15.06.04 - 14:26:38
-
Hallo,
ich habe mal eine Frage. Und zwar habe ich hier mal wieder einen Excel-Export. Nur das dieser diesmal auch soweit noch formatiert werden soll, das hinterher ein druckbaren "Einheitsformular" rauskommt.
Also Sachen wie: Spaltenbreite, Summen bilden, Textausrichtung usw.
Nun habe ich mir schon ein paar Gedanken gemacht wie ich das denn wohl realisieren könnte. Zum einen gäbe es ja die Möglichkeit das per Excel-Makro zu machen, aber dann bräuchte jede Person die mit dem Export arbeitet ja auch eine "Muster-Excel-Datei" damt Makro. Die andere Möglichkeit ist dieses komplett per Lotus-Script zu regeln. Und genau da ist der Haken. Ich finde im Internet keine Auflistung der möglichen Befehle für Excel. Deshalb wollte ich wissen ob ihr vielleicht wisst wo ich sowas finden kann.
Noch eine andere Frage, ich sprach oben von einer "Muster-Excel-Datei". Kann ich im Script denn auch sagen das "er" genau diese Datei lokal auf dem Rechner des jeweiligen öffnen soll ? Weil sonst müsste man ja mit Strg+C und Strg+V arbeiten, oder ?
Wäre euch sehr dankbar wenn einer einen Tipp hätte !
-
...Ich finde im Internet keine Auflistung der möglichen Befehle für Excel. Deshalb wollte ich wissen ob ihr vielleicht wisst wo ich sowas finden kann.
Hi,
du kannst dir die entsprechenden Anweisungen aus der VBA-Hilfe holen und nach LotusScript portieren. Oder du zeichnest dir in Excel das Makro für die Formatierung auf und übernimmst es nach Notes. Geht aber leider nicht 1zu1.
Hier mal ein Beispiel, die gesamte Tabelle wird mit Arial 10 formatiert:
...
Set objExcel = CreateObject("Excel.Application")
Call objExcel.Workbooks.Add 'Neue Arbeitsmappe anlegen
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)
objSheet.Cells.Select 'Gesamtes Arbeitsblatt markieren
objExcel.Selection.Font.Name = "Arial" 'Schriftart
objExcel.Selection.Font.Size = 10 'Zeichengrösse setzen
objSheet.Range("A1").Select
...
Axel
-
mmh, ja den "Trick" habe ich auch ausprobiert. Also das mit dem Makro aufzeichen und dann in VBA Editor die Sachen rauskopieren. Eigentlich ganz nett aber interessant wird es ja bei den Befehlen die ich nicht eins zu ein übernehmen kann. z.B Textausrichtung oben oder so. Was mach ich denn dann mit den Kammeraden ?
-
Ich glaube, Du hast Axel missverstanden. In der Hilfe des VBA-Editors findest Du alle Klassen und Methoden von Excel-VBA, und diese kannst Du in LS einfach weiter verwenden. Axel hat dazu ja bereits ein Beispiel aufgemalt: Hast Du einmal ein Excel-Object in LS instantiiert, kannst Du wie in VBA weiterarbeiten.
Bernhard
-
Eigentlich ganz nett aber interessant wird es ja bei den Befehlen die ich nicht eins zu ein übernehmen kann. z.B Textausrichtung oben oder so. Was mach ich denn dann mit den Kammeraden ?
Schau dir das Beispiel an und vergleiche es mit der VBA-Hilfe oder dem Code in einem Makro. Wenn du erstmal das Prinzip verstanden hast, dann klappt auch mit den anderen Kameraden. ;)
Hier noch ein Beispiel:
...
'Konstanten für die vertikale Ausrichtung innerhalb der Zellen
Const xlVAlignTop = -4160
Const xlVAlignBottom = -4107
Const xlVAlignCenter = -4108
'Formatiert ein Arbeitsblatt mit den Attributen vertikale Textausrichtung oben und
'optimale Spaltenbreite
objSheet.Cells.Select 'Gesamtes Arbeitsblatt markieren
objExcel.Selection.VerticalAlignment = xlVAlignTop 'Vertikale Ausrichtung nach oben
objExcel.Selection.Columns.AutoFit 'Optimale Spaltenbreite
objExcel.Selection.Rows.AutoFit 'Optimale Zeilenhöhe
objSheet.Range("A1").Select
...
In der Regel ist es so, dass alles was mit Formatierung zu tun hat, sich auf Selection beziehen.
Axel
-
Was hier immer wieder gefragt wird: Wo finde ich die Excel-Konstanten?
Antwort siehe:
http://www.atnotes.de/index.php?board=7;action=display;threadid=8479
Kannst Dir auch mal eine Demo-Datenbank downloaden, hier werden View-Dokumente nach Excel exportiert:
http://www.atnotes.de/index.php?board=9;action=display;threadid=15203
-
Alternativ kannst Du auch eine Tabelle vorformatieren und dann in ein Setup-Dokument in die DB anhängen. Vor dem Export löst Du die Datei dann und schreibst die Werte in die formatierte Tabelle.
Das ganze hat den Charme, dass Du dann auch ein Makro in die Tabelle einfügen kannst, dass Du dann nach dem Export aufrufst und anschließend löschst.
Ich habe mit dem Vorgehen sehr gute Erfahrungen gemacht.
Markus
-
Ja zunächst einmal danke für die Antworten. Ich werde mal sehen was ich noch so machen kann und werde mich bei Bedarf dann hier wieder zu Wort melden.
@Makrus:
Ja das wäre auch die "Notlösung" zu der ich dann ausweichen würde !
Also nochmal danke !
-
Notlösung? Ich finde das eigentlich die schönste Lösung, weil man sich durch die Formatierung und das Makro nicht damit rumschlagen muss, wie man das ganze sauber hinbekommt. Aber ich glaube da hat jeder seine eigenen Vorstellungen. ;)
-
Das ganze hat den Charme, dass Du dann auch ein Makro in die Tabelle einfügen kannst, dass Du dann nach dem Export aufrufst und anschließend löschst.
Kannst du das ein wenig genauer beschreiben?
Makro in der Vorlage ist einleuchtend, aber wie löschst du das dann?
-
Ja das wäre auch die "Notlösung" zu der ich dann ausweichen würde !
Ich empfinde das auch nicht unbedingt als Notlösung. Diese Vorgehensweise hat sogar in einigen Anwendungsfällen Vorteile.
Kleine Formatierungen kann man ohne weiteres mit Lotusscript durchführen. Umfangreicheres würde ich auf jeden Fall auch in Excel selbst mit einem Makro machen.
Axel
-
Ok ok. Ich ziehe das mit der Notlösung zurück. Dann würde ich mich aber freuen wenn einer das ein wenig ausschmücken könnte wie man da genau vorgeht.
Sorry wenn ich einem auf die Füsse getreten bin :P
-
Also Makros löschen geht so (Codeschnipsel aus meiner Excel-Klasse):
'Zuerst die Codezeilen löschen
For i = Me.xlApp.ActiveWorkbook.VBProject.VBComponents.Count To 1 Step -1
l = 1
l = Me.xlApp.ActiveWorkbook.VBProject.VBComponents(i).CodeModule.CountOfLines
Me.xlApp.ActiveWorkbook.VBProject.VBComponents(i).CodeModule.DeleteLines 1, l
Next
'dann die Module löschen
For i = Me.xlApp.ActiveWorkbook.VBProject.VBComponents.Count To 1 Step -1
Me.xlApp.ActiveWorkbook.VBProject.VBComponents.Remove(Me.xlApp.ActiveWorkbook.VBProject.VBComponents(i))
Next
Wie gesagt, es ist ein Schnispel aus meiner Excel-Klasse. Ich wollte hier auch nur zeigen welche Befehle genommen werden müssen und wie das Vorgehen aussieht.
Markus
-
Sorry wenn ich einem auf die Füsse getreten bin :P
Du bist hier niemanden auf die Füsse getreten. Das ist eine ganz normale Diskussion und Vor- und Nachteile von Lösungen.
Axel
-
(Codeschnipsel aus meiner Excel-Klasse):
Wo gibt's diese Excel-Klasse?
-
Die gibts in meinen Datenbanken. ;-)
Aber such mal im Sandkasten oder bei OpenNTF.ofg, da findest Du bestimmt was ähnliches.
Markus
-
Hi,
da Markus seinen Code nicht mit uns teilen möchte (warum auch immer), kann ich dir mit meiner Klasse vielleicht auch helfen. Sie ist allerdings bei weitem noch nicht vollständig und wahrscheinlich noch nicht 100% fehlerfrei bzw. optimiert. Ich bitte daher um Nachsicht.
Anwendungsbeispiel (Agent):
(Options)
Use "libExcel"
Sub Initialize
...
Dim oExcel As cExcel
...
Set oExcel = New cExcel 'Erstellen eines OLE-Objects
Call oExcel.NewWorkbook
Call oExcel.SetCellValue("A1", "RB")
Call oExcel.SetCellValue("B1", "Land")
...
Call oExcel.FormatBereichAsText("A", "B" )
...
row = 2
Set doc = collection.GetFirstDocument
While Not (doc Is Nothing)
Call oExcel.SetCellValue("A" & Trim$(Str$(row)), doc.RegBereich(0))
Call oExcel.SetCellValue("B" & Trim$(Str$(row)), doc.Land(0))
...
Set doc = collection.GetNextDocument(doc)
row = row + 1
Wend 'While Not (doc Is Nothing)
'Abschließende Formatierungen
Call oExcel.SortTable
Call oExcel.FormatBereichAsWaehrung("F","G")
Call oExcel.FormatBereichAsDateShort("I", "I" )
Call oExcel.FormatRangeFont("Arial", 9)
Call oExcel.FormatRowCenterBold(1)
Call oExcel.FormatRangeAlignment
Call oExcel.FormatRangeWidth("K:K")
'Aktivieren und Anzeigen von Excel
Call oExcel.SetVisible
Call oExcel.ActivateExcel
...
Ich hoffe du kannst was damit anfangen.
Axel
-
@Axel: Es hat einen einfachen Grund, warum ich den Code nicht teilen kann. Es ist nicht meiner. Im Gegensatz zu einigen hier im Forum bin ich nicht selbstständig, also gehört der Code den ich schreibe dem Unternehmen für das ich arbeite. Außerdem benutze ich hier keinen Nickname, sondern meinen echten Namen und ich hab keinen Bock Ärger zubekommen, weil ich Firmeneigentum weitergebe. Wenn andere Forumsmitglieder das anders halten ist das ihre Sache. :-)
Gruß
Markus
-
Hi,
eine kleiner Hinweis, warum du den Code nicht weitergeben kannst, hätte keine Mißverständnisse ausgelöst. In der Regel lassen alle Forumsmitglieder die anderen an ihrem Code teilhaben.
Wenn du das aus rechtlicher Sicht nicht kannst, wofür sicherlich jeder Verständnis hat, hätte ein kurzer Hinweis genügt. So kam es rüber, als das du nicht willst.
Axel
-
@Axel: Danke für deinen Code. (Den hatte ich übrigens schon gefunden)
@Markus: Klar, dass du den Code nicht rausgibst, wenn er der Firma gehört!
Weil es gerade so schön passt: Ich exportiere mehrere Dokumente (bzw. Daten aus diesen Dokumenten) nach Excel, um diese dann (schön formatiert) in Tabellenform auszudrucken. Gibt es eine Möglichkeit, diesen Druck "aus der Exportfunktion" zu starten, ohne Excel überhaupt sichtbar zu machen?
Also: Man wählt die zu exportierenden Doks, klickt auf den Buhtong, welcher den Export anstößt und danach wird die Excel-Tabelle sofort an den Drucker weitergeleitet.
Mir fällt da im Moment nichts ein und SuFu half mir auch nicht.
-
Hi,
da müsste mit der Methode PrintOut funktionieren.
Bsp.:
ActiveWorkbook.PrintOut oder ActiveSheet.PrintOut
Angaben zu den Parametern findest du in der VBA-Hilfe.
Axel
-
@Axel: Sorry, dass ich mich nicht ordentlich ausgedrückt habe. :-)
@g202e: Axels Tipp sollte Dir da helfen. Wobei ich davon fast abraten würde das ganze direkt zu drucken. Ich habe es so gemacht, dass erst exportiert wird und der User kann dann, wenn er es will das ganze manuell drucken. Das ganze hat den Vorteil, dass der Benutzer den Drucker wechseln kann. Wenn Du das ganze exportierst und dann druckst, ohne das Excel sichtbar ist, wird vielleicht der falsche Drucker benutzt. Aber das ist wieder abhängig von den Vorlieben des Programmierers.
Markus
-
Aber das ist wieder abhängig von den Vorlieben des Programmierers.
Ja, wenn es man so wäre!
Ich würde es aus den von dir genannten Gründen auch so machen, aber: Der auftraggebende Chef ist der Meinung, dass dies für die Vorzimmer-Damen des GANZ GROSSEN CHEFS zu kompliziert ist. Er möchte gern eine Lösung, wo man bloß einen Knopf drückt und dann kommt die Liste aus dem Drucker.
Danke trotzdem. Printout funzt.
(Mit der VBA-Hilfe bin ich noch nicht so richtig warm geworden, aber das ist wohl Übungssache... Ich habe mit ActiveSheet.Print oder ActiveWorkbook.Print probiert, aber immer Essig! Mal sehen, ob ich den Befehl finde, mit dem ich im Background das per LotusScript erzeugte Excel.Object wieder zu zerstöre, das ich nach dem Druck nicht mehr braucher??) ???
-
Hi,
ich mach' damit:
Set objExcel = CreateObject("Excel.Application") 'Excel "unsichtbar" starten
...
objExcel.DisplayAlerts = False 'Warnmeldungen abschalten
Call objExcel.Quit 'Excel beenden
Axel
-
OK, ich habs so gelöst:
objExcel.Saved = True 'Warnmeldungen abschalten
Call objExcel.Quit 'Excel beenden
Aber die Sache hat einen Haken: Ich habe das Ganze in einem Aktions-Buhtong. Alles Quit und auch "Set objExel = Nothing" (oder auch beides zusammen) nützt nichts. Im Taskmanager bleibt immer noch eine Excel-Instanz zu sehen. Diese verschwindet erst, wenn man die Ansicht schließt/wechselt.
Fragen Sie Bill Gates!
-
Bei mir schiesst
excelWorkbook.Save
excelWorkbook.Close
Set excelApp = Nothing
Excel zuverlässig ab (dieser Teil gehört nach einem Test auf
excelApp = Nothing
in den ErrorHandler !).
Bei Dir wird das Objekt offensichtlich erst zerstört, wenn das LS-Modul aus dem Speicher genommen wird.
HTH,
Bernhard
-
So, nun habe ich auch noch etwas "Zündstoff" ;)
Also mein Export und das Formatieren haben wunderbar geklappt. Ist zwar sicherlich nicht so elegant wie es hätte sein können aber das Resultat stimmt mich zufrieden. Nur zwei Sachen habe ich noch auf dem Herzen.
1.) Ich würde ganz gerne noch "automatisch" Summen bilden lassen
Also es werden x Dokumente exporiert und ich möchte in der Zelle x+1 gerne eine Spaltensumme er x exportierten Doks haben. Wie bekomme ich das hin ? Habe das Makro mir mal angesehen aber das möchte er so leider nicht übernehmen ???
2.) Ich würde gerne noch die Zahlen an sich formatieren, also einheitlich 2 Nachkommastellen und wenn möglich negative Zahlen rot darstellen. Nur leider bin ich auch hier nicht weitergekommen
Wäre super wenn mir das noch einer "nahebringen" könnte dann kann ich das Thema hier auch guten Gewissens schliessen ;)
mfg
Sebastian !
-
Hi,
zu 2.
Set objExcel = CreateObject("Excel.Application")
Call objExcel.Workbooks.Add 'Neue Arbeitsmappe anlegen
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)
...
objSheet.Columns("A:A").Select 'Spalte A markieren
objExcel.Selection.NumberFormat = "#,##0.00_ ;-#,##0.00 " 'Zellen formatieren
...
zu 1.
Wie sieht denn das Makro aus und warum willst du es so nicht machen?
Axel
-
mmh, wenn ich das so machen bekomme ich in Notes folgende Fehlermeldung: MS Excel: Die NumberFormat-Eigenschaft des Range-Objektes kann nicht festgelegt werden. Was hat das zubedeuten.
zu 1.) Ich würde das gerne so machen wie er mir das im Makro vorgibt aber leider geht es nicht
Das Makro sah wie folgt aus:
Range("F21").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
-
Hi,
das liegt an der Einstellung "Z1S1-Bezugsart" in Excel. Nimm diese Einstellung raus (unter Extras - Optionen, Reiter Allgemein).
Verwende dann diese Formel
ActiveCell.Formula = "=SUM(A1:A12)"
Natürlich nach Sript umgesetzt.
Axel
-
ok das scheint zu klappen mit den Summen aber kann ich das auch flexibelmachen ? also weil die Zeilenzahl ja unterschiedlich ist ?
Muss ich das mit dem Z1S1-Bezug noch im Script einstellen wenn das Problem auf anderen Rechner auch auftritt ?
Ist das auch der Grund für den Fehler bei dem Zahlenformat ?
-
aber kann ich das auch flexibelmachen ? also weil die Zeilenzahl ja unterschiedlich ist ?
Klar geht das auch "dynamisch". Du brauchst nur eine Variable in der du die Anzahl der Docs hast. Dann baust du dir die Formel zusammen.
row = 10
ActiveCell.Formula = "=Summe(F1:F" & Trim$(Str$(row)) & ")"
Muss ich das mit dem Z1S1-Bezug noch im Script einstellen wenn das Problem auf anderen Rechner auch auftritt ?
Das ist eine Einstellung in Excel. Ob man diese Einstellung auch über die COM-Schnittstelle ändern kann, weiß ich nicht. Auf die Schnelle hab ich in der VBA-Hilfe nichts gefunden.
Ist das auch der Grund für den Fehler bei dem Zahlenformat ?
Wenn es sich um die Fehlermeldung "Die NumberFormat-Eigenschaft des Range-Objektes ..." handelt, vermute mal ja.
Axel
-
Es gibt eine Eigenschaft, die Dir die letzte benutzte Zeile zurückgibt.
Hier ist ein Beispiel dazu:
Dim xlApp As Variant
Dim xlSheet As Variant
Function OpenExcel() As String
'Errorroutine
On Error Goto Errorhandler
'Excel Applikation öffnen
Set xlApp = CreateObject("Excel.application")
'neues Arbeitsblatt
xlApp.Workbooks.Add
Set xlSheet = xlApp.Workbooks(1).Worksheets(1)
OpenExcel = "OK"
Exit Function
Errorhandler:
OpenExcel = "ERROR"
End Function
Sub Click(Source As Button)
'Excel öffnen und Rückgabe überprüfen
Rückgabe = OpenExcel()
If Rückgabe <> "OK" Then
'abbrechen
Exit Sub
End If
'Werte schreiben
'Cells benötigt Zahlen, Range benötigt z.B. "A5"
For i = 1 To 50
xlSheet.Cells(i,1).Value = "TEST"
Next i
'letzte Zeile finden und ausgeben (4 entspricht xlUp)
Msgbox xlApp.Columns("1,1").End(4).Row
'Excel sichtbar machen
xlApp.Visible = True
'Variablen freigeben
Set xlSheet = Nothing
Set xlApp = Nothing
End Sub
Packs in einen Button und probiers mal aus.
Markus
-
Hi,
ich zur Umstellung der Bezugsart noch was gefunden. Sie lässt sich mit
Application.ReferenceStyle = xlA1 umstellen, wobei xlA1 den Wert 1 hat.
Mit Application.ReferenceStyle = xlR1C1 stellt du das Ganze wieder zurück.
xlR1C1 hat den Wert -4150
Axel
-
Also nochmal besten Dank für die Infos & Hilfen.
Ich denke hier gibt es nun nichts mehr zu klären !