2017-07-05 6 views
0

Ich habe ein Programm, das openpyxl verwendet, das zwei vorhandene Excel-Dateien öffnet. Eines ist ein einfaches Arbeitsblatt mit Daten, die in die andere Datei kopiert werden müssen, eine Arbeitsmappe mit vielen Arbeitsblättern und mit VBA-Makros, die diese kopierten Daten verwenden. Wenn der VBA-Code ausgeführt wird, erhalte ich jedoch einen Runtime Error 6-Überlauf. Die seltsame Sache ist, dass, wenn ich manuell alle erforderlichen Zellen in die Arbeitsmappe kopieren, die Makros ohne eine Störung laufen. Aber wenn dieser Prozess automatisiert ist, wird dieser Fehler angezeigt, obwohl die Werte in den Zellen identisch sind. Unten ist der Code, der die Daten von einem Arbeitsblatt auf das andere überträgt.OpenpyXL: Laufzeitfehler 6 Überlauf

def transcribe_client_data_to_workbooks(): 
    _active_sheet_index = 5 
    for client in set(cdict.values()): 
     report_path = r'C:\Program Files\Notepad++\reports' + '\\' + 
     string.replace(client,'/','-') + '_report.csv' 
     wb = openpyxl.load_workbook('Bucket-Asset Allocation Model.xlsm', 
      read_only = False, keep_vba = True) 
     ws = wb.active 
     with open(report_path, 'rU') as f: 
      reader = csv.reader(f) 
      for row_index, row in enumerate(reader): 
       for column_index, cell in enumerate(row): 
        column_letter = get_column_letter((column_index+1)) 
        ws[column_letter+str(row_index+1)] = cell 
      f.close() 
     wb.save('C:\\Program Files\\Notepad++\\workbooks\\' + 
     string.replace(client,'/','-') + '_workbook.xlsm') 

Ich verstehe nicht, warum ich diese Fehlermeldung erhalten würde, wenn diese Daten automatisch kopiert in ist, aber nicht, wenn ich manuell kopieren/einfügen. Ich öffne die gleiche Arbeitsmappenvorlage für jede Iteration und speichere sie dann als neue Arbeitsmappe, nachdem die entsprechenden Daten kopiert wurden. Als Referenz finden Sie hier den Abschnitt des VBA-Codes, in dem der Fehler auftritt.

Do Until Sheets("Raw Data").Cells(crow, 1).Value = Empty 
       aNumber = Sheets("Raw Data").Cells(crow, 1).Value 
       ticker = Sheets("Raw Data").Cells(crow, 9).Value 
       security = Sheets("Raw Data").Cells(crow, 8).Value 
       mValue = Sheets("Raw Data").Cells(crow, 12).Value 
       bAmt = Sheets("Raw Data").Cells(crow, 18).Value 
       uGain = Sheets("Raw Data").Cells(crow, 20).Value 
        Do Until Sheets("Accounts").Cells(acrow, 1).Value = aNumber 
        acrow = acrow + 1 
        Loop 

Insbesondere kommt es auf der Linie, die Acrow inkrementiert: Acrow = Acrow + 1 I versuchte Acrow aus einer ganzen Zahl zu einem langen ändern, aber das bewirkt, dass das Programm nur auf unbestimmte Zeit zu laufen, bis ich es oder Abbrechen klicken An diesem Punkt erhalte ich den Laufzeitfehler '1004', anwendungsdefinierter oder objektdefinierter Fehler in der Zeile, die dem Inkrement von acrow direkt vorausgeht.

Jede Hilfe wäre willkommen, danke!

+1

So gibt es keine Ausnahme, wenn der Python-Code ausgeführt wird? –

+0

Überhaupt nicht. Er generiert die neuen, ausgefüllten Arbeitsmappen im Zielordner, ohne dass Fehler auftreten. Die Arbeitsmappen, die es erstellt, sind identisch mit der Vorlage, die ich geladen habe, außer mit zusätzlichen Daten. Ich habe keep_vba auf true gesetzt, aber ist es möglich, dass ein Teil des Arbeitsbuchs nicht erhalten bleibt? Lassen Sie es mich wissen, wenn Sie mehr VBA-Code benötigen. –

+0

zusätzlich habe ich gerade bemerkt, dass die Arbeitsmappe Vorlage 488 KB selbst ist, während die ausgefüllten Kopien ~ 180 KB sind. Alle Makros scheinen erhalten zu bleiben. Bedeutet dies jedoch, dass ich beim Laden und erneuten Speichern der Vorlage wichtige Funktionen verliere? –

Antwort

0

John Coleman hatte die Lage des Überlaufs korrekt. Das Problem war, dass ich aNumber als Strings geschrieben habe und aNumber in der VBA als Variant type deklariert wurde, was laut den Docs alles andere als eine feste Länge darstellen kann. Ich änderte einfach meine Strategie und schrieb Kontonummern als Ganzzahlen, die das Problem lösten.