
Hallo Liste, kennt jemand von Euch eine Möglichkeit, Macros für Excel & Word in Python zu schreiben? Also sprich, statt Visual Basic Python-Scripte schreiben, die dann von Excel aus als Macro ausgeführt werden können? Für Openoffice ist sowas ja grad in Arbeit, da kann man in jeder X-beliebigen Programmiersprache Macros verfassen (allerdings ist das ganze erst sehr beta und funktioniert außerdem nur mit der englischen Version). Ich will es unbedingt vermeiden, mich mit VBA anfreunden zu müssen :-/.. Danke für jeden Tipp, Link oder änliches, Ecky ;) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

kennt jemand von Euch eine Möglichkeit, Macros für Excel & Word in Python zu schreiben? Also sprich, statt Visual Basic Python-Scripte schreiben, die dann von Excel aus als Macro ausgeführt werden können? Für Openoffice ist sowas ja grad in Arbeit, da kann man in jeder X-beliebigen Programmiersprache Macros verfassen (allerdings ist das ganze erst sehr beta und funktioniert außerdem nur mit der englischen Version).
Ich bin kein Office Experte, von daher einfach mal ein paar Denkanstöße: COM Programmierung ist in Python kein Problem, d.h. du kannst Word und Excel ohne weiteres 'von außen' automatisieren. Das passende Packet heißt win32com.client. ActiveState Python registriert Python als gültige Sprache für den Scriptinghost, wobei Office meines Wissens nicht den WSH benutzt sondern nur VBA. Somit kannst du in Python nicht direkt Macros schreiben. Du kannst aber COM Objekte in Python schreiben, die du dann aus deinen VBA Macros verwendest. Du solltest dich in jedem Fall mit COM auskennen. Office verwendet so ziemlich alle Tricks, die man mit IDispatch so anstellen kann. VB verbirgt das vor dir, aber in Python ist das nicht immer der Fall. Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Achim Domma (ProCoders) schrieb:
Ich bin kein Office Experte, von daher einfach mal ein paar Denkanstöße: COM Programmierung ist in Python kein Problem, d.h. du kannst Word und Excel ohne weiteres 'von außen' automatisieren. Das passende Packet heißt win32com.client. ActiveState Python registriert Python als gültige Sprache
Ja, hab ich auch schon gemacht...
für den Scriptinghost, wobei Office meines Wissens nicht den WSH benutzt sondern nur VBA. Somit kannst du in Python nicht direkt Macros schreiben. Du kannst aber COM Objekte in Python schreiben, die du dann aus deinen VBA Macros verwendest.
Das nützt mir nicht wirklich was. COM Objekte muss ich schon schreiben, aber in einer ganz anderen Sprache ;). Client-seitig sollen die dann von Excel aus angesteuert werden. Und wenn ich das in Python realisieren könnte, wär schon gut... Hab gerade das Buch "Python Programming on Win32" per Google gefunden (http://www.oreilly.de/catalog/pythonwin32/index.html). Laut Inhaltsverzeichnis soll da wohl was über Python & Excel drinstehen... Ob man Excel Macros in Python schreiben kann, steht natürlich nicht da... Hat jemand zufällig dieses Buch und kann da mal kurz drin nachsehen? Grüße u. schönes Wochenende noch, Ecky ;) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

für den Scriptinghost, wobei Office meines Wissens nicht den WSH benutzt sondern nur VBA. Somit kannst du in Python nicht direkt Macros schreiben. Du kannst aber COM Objekte in Python schreiben, die du dann aus deinen VBA Macros verwendest.
Das nützt mir nicht wirklich was. COM Objekte muss ich schon schreiben, aber in einer ganz anderen Sprache ;). Client-seitig sollen die dann von Excel aus angesteuert werden. Und wenn ich das in Python realisieren könnte, wär schon gut...
Einfach so ohne Umweg geht das meiner Meinung nach nicht. Bei VBA kannst du die Sprache nicht wechseln. Allerdings sehe ich nicht das Problem, wenn du die Macros auf zwei Zeilen Code reduzierst!? Du kannst doch (zumindest bei In-Process Servern) die notwendigen Objekte an dein COM Objekt übergeben und so die ganze Logik in Python implementieren.
Hab gerade das Buch "Python Programming on Win32" per Google gefunden (http://www.oreilly.de/catalog/pythonwin32/index.html). Laut Inhaltsverzeichnis soll da wohl was über Python & Excel drinstehen... Ob man Excel Macros in Python schreiben kann, steht natürlich nicht da...
Hat jemand zufällig dieses Buch und kann da mal kurz drin nachsehen?
Ja, da steht drin, wie man Excel von außen mit Python automatisiert. Nix von wegen Macros. Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Achim Domma (ProCoders) schrieb:
Einfach so ohne Umweg geht das meiner Meinung nach nicht. Bei VBA kannst du die Sprache nicht wechseln. Allerdings sehe ich nicht das Problem, wenn du die Macros auf zwei Zeilen Code reduzierst!? Du kannst doch (zumindest bei In-Process Servern) die notwendigen Objekte an dein COM Objekt übergeben und so die ganze Logik in Python implementieren.
Die Logik wird in den COM Objekten in einer anderen Sprache (der funktionalen Programmiersprache, die bei dem Statistik-Programm "R" dabei ist) implementiert. Es geht wirklich nur darum, diese Objekte dann aus Excel raus aufzurufen. Und da nochmal über VBA _und_ Python zu gehen kommt mir etwas umständlich vor. Wenn ich soviel VBA kann, dass ich Python-COM Objekte ansteuern kann, dann kann ich für meine Zwecke auch gleich VBA nehmen. Ich dachte nur, ich kann mir VBA komplett sparen und die Macros direkt in Python schreiben. Das würde den Lern-Overhead vermindern, weil Python kann ich ja (relativ gut ;-)).
Hat jemand zufällig dieses Buch und kann da mal kurz drin nachsehen?
Ja, da steht drin, wie man Excel von außen mit Python automatisiert. Nix von wegen Macros.
Danke. Dann komm ich um VBA wohl nicht drumrum... Grüße, Ecky ;) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Ich habe heute mal versucht, eine Klasse, die bisher so aussah: class bisher: def __init__(self): self.wert = 123 ... (+ n Methoden, die self.wert verändern) ... durch eine Klasse class neu(int): zu ersetzen. Das ganze habe ich ziemlich schnell aufgegeben, mit ein bisserl Enttäuschung. Schluchz. Sieh her: class neu(int): def __init__(self, value): int.__init__(self, 2) a = neu(1) Preisfrage: Was macht "print a" ? Es gibt 1 aus! (Die "Dokumentation" ("Whats New in Python 2.2.txt") ist ein bisserl arg mager, IMHO)) Des weiteren: Ich kann den Wert meines ints nicht ändern! Nun ist mir ja bekannt, daß int immutable ist, aber sieh dir mal folgendes an: class bisher: def __init__(self): self.wert = 123 print "ID im Konstruktor:", id(self.wert) def assign(self, value): self.value = value print "ID nach assign:", id(self.wert) a = bisher() a.assign(60) ... ID im Konstruktor: 7627404 ID nach assign: 7627404 Meine laienhafte Vermutung: die Runtime nimmt automatisch das gleiche Objekt wieder her, oder es gibt so einen Objectcache (dunkel wabert derartiges in den zugegebenermaßen leeren Hallen meines Erinnerungsvermögens). Das ganze kann ich aber mit meiner "neu"-Klasse nicht machen. Selbst todesmutige Versuche wie class neu(int): def __init__(self, value): int.__init__(self, 2) def assign(self, value): self = neu(value) a = neu(1) a.assign(3) scheitern. Schade aber toll, oder? _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Mon, 26 May 2003 18:52:19 +0200 Schrieb Gerson.Kurz@t-online.de (Gerson Kurz):
... class bisher: def __init__(self): self.wert = 123 print "ID im Konstruktor:", id(self.wert)
def assign(self, value): self.value = value print "ID nach assign:", id(self.wert)
a = bisher() a.assign(60)
... ID im Konstruktor: 7627404 ID nach assign: 7627404
Meine laienhafte Vermutung: die Runtime nimmt automatisch das gleiche Objekt wieder her, oder es gibt so einen Objectcache (dunkel wabert derartiges in den zugegebenermaßen leeren Hallen meines Erinnerungsvermögens).
Hi Gerson, naja, da is der fehler wohl eher im code ;)
class bisher: ... def __init__(self): ... self.wert = 123 ... print "ID im Konstruktor:", id(self.wert) ... def assign(self, value): ... self.wert = value ... print "ID nach assign:", id(self.wert) ... a = bisher() ID im Konstruktor: 135431136 a.assign(60) ID nach assign: 135421788
also nichts mit Objectcache. Zu den anderen Sachen - hmm - keine Ahnung *ggg* Gruß Fritz _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Gerson Kurz wrote:
class neu(int): def __init__(self, value): int.__init__(self, 2)
a = neu(1)
class neu(int): def __new__(cls,value): return int.__new__(cls,2) siehe: http://www.python.org/2.2.3/descrintro.html#__new__ zum anderen Punkt: immutable ist immutable Gruss Uwe _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Gerson Kurz wrote:
Ich habe heute mal versucht, eine Klasse, die bisher so aussah:
class bisher: def __init__(self): self.wert = 123
... (+ n Methoden, die self.wert verändern) ...
durch eine Klasse
class neu(int):
zu ersetzen. Das ganze habe ich ziemlich schnell aufgegeben, mit ein bisserl Enttäuschung. Schluchz. Sieh her:
class neu(int): def __init__(self, value): int.__init__(self, 2)
a = neu(1)
Preisfrage: Was macht "print a" ? Es gibt 1 aus! (Die "Dokumentation" ("Whats New in Python 2.2.txt") ist ein bisserl arg mager, IMHO))
Ich kenn nur http://python.org/2.2.3/descrintro.html
Des weiteren: Ich kann den Wert meines ints nicht ändern! Nun ist mir ja bekannt, daß int immutable ist, aber sieh dir mal folgendes an:
class bisher: def __init__(self): self.wert = 123 print "ID im Konstruktor:", id(self.wert)
def assign(self, value): self.value = value print "ID nach assign:", id(self.wert)
a = bisher() a.assign(60)
... ID im Konstruktor: 7627404 ID nach assign: 7627404
Meine laienhafte Vermutung: die Runtime nimmt automatisch das gleiche Objekt wieder her,
Warum sollte sich id() ändern? Dass es sich *nicht* ändert, ist ja genau die Definition von Objektidentität: [http://python.org/doc/current/ref/objects.html] """ [...] Every object has an identity, a type and a value. An object's identity never changes once it has been created; you may think of it as the object's address in memory. [...] """
oder es gibt so einen Objectcache (dunkel wabert derartiges in den zugegebenermaßen leeren Hallen meines Erinnerungsvermögens).
Es gibt einen "Cache" für ints. Das ist aber auch schon alles: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Objects/intobject.c?rev=HEAD&content-type=text/vnd.viewcvs-markup #v+ #ifndef NSMALLPOSINTS #define NSMALLPOSINTS 100 #endif #ifndef NSMALLNEGINTS #define NSMALLNEGINTS 5 #endif #if NSMALLNEGINTS + NSMALLPOSINTS > 0 /* References to small integers are saved in this array so that they can be shared. The integers that are saved are those in the range -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */ static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; #endif #v-
Das ganze kann ich aber mit meiner "neu"-Klasse nicht machen. Selbst todesmutige Versuche wie
class neu(int): def __init__(self, value): int.__init__(self, 2)
def assign(self, value): self = neu(value)
a = neu(1) a.assign(3)
scheitern. Schade aber toll, oder?
Zwei Fehler. Erstens musst du in dem Fall __new__ überladen, nicht __init__. Zweitens ist "self = neu(value)" ein NOP (oder wie auch immer das in 68k-Assembler statt x86- heisst ;-). Der Istgleich-Operator bindet nur Objekte an Namen, ändert aber *niemals* bestehende Objekte. Somit kann man in Python zwar fast alle Schweinereien wie in C++ machen, aber eben nicht ganz alle :-P lambda-ly yours, -- Gerhard _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Ich Depp. Streiche bitte ab hier
sieh dir mal folgendes an:
bis hier:
den zugegebenermaßen leeren Hallen meines Erinnerungsvermögens).
wegen Unfähigkeit. Danke. Der Rest der ursprünglichen Mehl kann erhalten bleiben. _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
Achim Domma (ProCoders)
-
Eckhard Lehmann
-
Fritz Cizmarov
-
Gerhard Häring
-
Gerson.Kurz@t-online.de
-
Uwe Hoffmann