Python und VBA (Excel)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JeanCantos
User
Beiträge: 25
Registriert: Sonntag 26. November 2006, 17:08

Hallo,

ich versuche gerade verzweifelt unter Python ein bissel in Exceldateien herumzuspielen, stoße aber auf die Fehlermeldung, dass "xlUp" nicht bekannt sei:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*- 
import win32com.client
import os

try: ## Excel Anwendung öffnen
    # NOTE - these 2 lines are copied verbatim from the output
    # of makepy.py when run with the -i parameter.
    from win32com.client import gencache
    gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 2)
    appExcel = win32com.client.Dispatch("Excel.Application")
    appExcel.Visible = True
    try: ## Arbeitsmappe auswählen oder neue erstellen
        Arbeitsmappe = "D:\Test.xls"
        wbExcel = appExcel.Workbooks.Open(Arbeitsmappe)
        try: ##Tabellenblatt öauswählen
            Tabellenblatt = "Tabelle1"
            wsExcel = wbExcel.Worksheets(Tabellenblatt)
        except:
            print "Fehler beim Versuch, das Tabellenblatt ",Tabellenblatt," zu öffnen."
            del wsExcel
    except:
        print "Fehler beim Versuch, die  Arbeitsmappe ", Arbeitsmappe, " zu öffnen."
        wb.Close()
        break
except:
    print "Fehler beim Versuch, die erforderliche Excel-Anwendung zu starten"
    appExcel.Quit()
    del appExcel

Zeilenanzahl = wsExcel.Cells(wsExcel.Rows.Count, 1).End(xlUp).Row

##Speicherfreigabe
del wsExcel
del wbExcel
del appExcel
Naja, der Code

Code: Alles auswählen

Zeilenanzahl = wsExcel.Cells(wsExcel.Rows.Count, 1).End(xlUp).Row
funktioniert unter VBA aber einwandfrei. Woran stört sich Python?

Odeer liegt es daran, dass ich hier krampfhaft versuche VBA-Methoden unter Python einzusetzen und stattdessen obige Problemstellung lieber mit "Pythoncode" lösen sollte?

Gruß,

Jean
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

xlUp ist eine Excel-Konstante. Du musst aus win32com.client constants importieren. Dann kannst Du das über constants.xlUp zur Verfügung stellen.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
JeanCantos
User
Beiträge: 25
Registriert: Sonntag 26. November 2006, 17:08

Hallo N317V,

vielen Dank für deine Hilfe, jedoch weiß ich nicht genau, wo ich was einfügen muss. Hab meinen Code folgendermaßen modifiziert:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*- 
import win32com.client
import os

Fehler = False
try: ## Excel Anwendung öffnen
    # NOTE - these 2 lines are copied verbatim from the output
    # of makepy.py when run with the -i parameter.
    from win32com.client import gencache
    gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 2)
    appExcel = win32com.client.Dispatch("Excel.Application")
    appExcel.Visible = True
except:
    print "Fehler beim Versuch, die erforderliche Excel-Anwendung zu starten"
    Fehler = True

if Fehler is False:
    try: ## Arbeitsmappe auswählen oder neue erstellen
        Arbeitsmappe = "D:\Test.xls"
        wbExcel = appExcel.Workbooks.Open(Arbeitsmappe)
    except:
        print "Fehler beim Versuch, die  Arbeitsmappe ", Arbeitsmappe, " zu öffnen."
        appExcel.Quit()
        del appExcel
        Fehler = True
    
if Fehler is False:
    try: ##Tabellenblatt auswählen
        Tabellenblatt = "Tabelle1"
        wsExcel = wbExcel.Worksheets(Tabellenblatt)
    except:
        print "Fehler beim Versuch, das Tabellenblatt ",Tabellenblatt," zu öffnen."
        wsExcel.Close()
        del wsExcel

Zeilenanzahl = wsExcel.Cells(wsExcel.Rows.Count, 1).End(constants.xlUp).Row

##Speicherfreigabe
del wsExcel
del wbExcel
del appExcel
Ich imporiere doch das komplette Modul "win32com.client", warum muss ich dann noch explizit "constants" aus diesem Modul importieren??

Meinst Du mit importieren folgenden Code:

Code: Alles auswählen

import constants from win32com.client
Gruß,

Jean
JeanCantos
User
Beiträge: 25
Registriert: Sonntag 26. November 2006, 17:08

Uppppsss....da war ich wohl mit meiner Frage etwas zu schnell. Meine es nun begriffen zu haben und folgender Code funzt einwandfrei:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*- 
import win32com.client
import os

Fehler = False
try: ## Excel Anwendung öffnen
    # NOTE - these 2 lines are copied verbatim from the output
    # of makepy.py when run with the -i parameter.
    from win32com.client import gencache
    gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 2)
    appExcel = win32com.client.Dispatch("Excel.Application")
    appExcel.Visible = True
except:
    print "Fehler beim Versuch, die erforderliche Excel-Anwendung zu starten"
    Fehler = True

if Fehler is False:
    try: ## Arbeitsmappe auswählen oder neue erstellen
        Arbeitsmappe = "D:\Test.xls"
        wbExcel = appExcel.Workbooks.Open(Arbeitsmappe)
    except:
        print "Fehler beim Versuch, die  Arbeitsmappe ", Arbeitsmappe, " zu öffnen."
        appExcel.Quit()
        del appExcel
        Fehler = True
    
if Fehler is False:
    try: ##Tabellenblatt auswählen
        Tabellenblatt = "Tabelle1"
        wsExcel = wbExcel.Worksheets(Tabellenblatt)
    except:
        print "Fehler beim Versuch, das Tabellenblatt ",Tabellenblatt," zu öffnen."
        wsExcel.Close()
        del wsExcel

Zeilenanzahl = wsExcel.Cells(wsExcel.Rows.Count, 1).End(win32com.client.constants.xlUp).Row

##Speicherfreigabe
del wsExcel
del wbExcel
del appExcel
Gruß,

Jean
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Stimmt, Du importierst win32com.client komplett in Zeile 2. Das hatte ich übersehen, denn Du importierst dann gencache auch nochmal extra in Zeile 9
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Antworten