Python und Excel

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
SMB_Freak
User
Beiträge: 2
Registriert: Donnerstag 14. Dezember 2023, 21:17

Hallo,
ich bin der newbie, komme aus der VBA ecke und versuche mich mit python.
Aktuell öffne ich eine excel datei, lese Spalte A-B von Zeile 2 bis Zeile 20 aus.
Mit einer For schleife multiplizier ich die werte von Spalte A und B, anschließend wird das ergebnis in spalte C eingetragen und die Datei wieder abgespeichert.
Das funktioniert auch soweit :P
Nun möchte nach dem öffnen der Datei, die letzte beschriebene Zeile in Spalte A finden?
Könnt Ihr mir da eine Tip geben :?
Mei Code:

Code: Alles auswählen

from openpyxl import load_workbook, Workbook

wb: Workbook = load_workbook("Messung-1.xlsm")
ws = wb["Tabelle1"]

for row in range(2, 21):
    a = ws["A" + str(row)].value
    b = ws["B" + str(row)].value

    result = a * b
    print(result)
    ws["c" + str(row)].value = result

wb.save("Messung-1.xlsx")
print("ready")
LG

Könnt ihr ein Tutorial empfehlen?
SMB_Freak
User
Beiträge: 2
Registriert: Donnerstag 14. Dezember 2023, 21:17

Habe meine Code jetzt angepasst und bekomme die letzte Zeile.
Allerding habe ich jetzt einen Fehler

Mein Code:
from openpyxl import load_workbook, Workbook

wb: Workbook = load_workbook("Messung-1.xlsm")
ws = wb["Tabelle1"]
LZeile = len(ws['A'])

for row in range(2, LZeile + 1):
a = ws["A" + str(row)].value
b = ws["B" + str(row)].value
result = a * b

print(result)
ws["c" + str(row)].value = result

wb.save("Messung-1.xlsx")
print("ready")

Mein Fehler:
result = a * b
~~^~~
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

Könnt Ihr mir dabei helfen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen sollten sprechend sein und keine Abkürzungen. Warum nicht workbook statt wb, worksheet statt ws oder last_row statt LZeile.
Über einen Index zu iterieren versucht man zu vermeiden und Strings stückelt man nicht mit + zusammen. Wenn man eh nicht direkt die Zellennummer hat, dann benutzt man `cell`.
Hier willst Du aber alle Werte einer Spalte haben, und da nimmt man einfach den Indexzugriff auf die gesamte Spalte:

Code: Alles auswählen

from openpyxl import load_workbook

def main():
    workbook = load_workbook("Messung-1.xlsm")
    worksheet = workbook["Tabelle1"]

    for whatever_is_in_the_first_column, whatever_is_in_the_second_column, result in zip(worksheet['A'][1:], worksheet['B'][1:], worksheet['C'][1:]):
        result.value = whatever_is_in_the_first_column.value + whatever_is_in_the_second_column.value

    workbook.save("Messung-1.xlsx")

if __name__ == "__main__":
    main()
Zum Fehler: Du hast halt Zellen, die leer sind, wie man damit umgehen soll, kannst nur Du beantworten.
Antworten