2016-09-08 1 views
1

Das folgende ist das Ergebnis des Herunterladens von Information aus einem Buchhaltungssystem. Grundsätzlich hatte ich die Aufgabe, Ausgaben aus diesem Jahr von einem Online-System zu sortieren; Sobald die Information vom Online-System heruntergeladen wurde, wurde sie nicht als Tabellenkalkulation formatiert (daher konnte ich nicht einfach eine einfache Suche verwenden). Die Informationen wurden als Tabellenkalkulation heruntergeladen, enthielten jedoch keine Prüfziffern oder Namen. Excel formatierte diese aus irgendeinem Grund weg. Das einzige, was übrig blieb, war das lange, strängige Dokument, wo jedes Element in der heruntergeladenen PDF (das Prüfnummern und Namen enthielt) in Spalte 1 platziert wurde (siehe Bild 1), während es in etwas wie Bild 2 formatiert sein sollte Natürlich haben PDFs keine Formatierung.Suchen und Platzieren von Elementen in einer langen Zeichenfolge/Spalte von Text

So ein Weg, dass ich die PDF in eine Arbeitsmappe übertragen und eine Analyse ausführen kann (IE durch Kopieren einfügen oder speichern unter) Ich musste Informationen von diesem langen sehnigen Sache bekommen (es ist bei 9000 Zeilen im Moment, hinzugefügt in einem Auszug).

Zuerst setzt dieser Code die Arbeitsblatt pers als Arbeitsblatt wird die Länge der Daten in pers (Beispiel in Bild 2), und die Länge der Daten in expensesheet (Beispiel in Bild 1)

Dann tastet es pers für Artikel (vor dem Schreiben dieser Code-Elemente wurden manuell hinzugefügt - wie im Fall von Bild 2, 'Angebot 1' und entsprechende Informationen, die helfen können, Angebot 1, dh Rechnung #, Beschreibung, Datum Kürzung, und so weiter).

Für jeden dieser Artikel scannt es dann das "Kostenblatt". Es versucht, die Rechnungsnummer (die in diesem Fall einer eindeutigen ID am nächsten kommt) mit dem Wert in Zelle i, 1; Wenn es existiert, scannt es dann "aufwärts", bis es eine lange genug Schnur findet, damit es die 5 Einheitsschnur sein kann; der eine, der ein Datum, eine Schecknummer, einen Betrag und einen Namen sowie eine Chargennummer und ein Memo enthält.

Sobald diese Zeichenfolge gefunden wurde, teilt sie sie in ein Array auf und versucht dann, sie in den entsprechenden Zellen rechts von dieser Zeile im Arbeitsblatt pers zu platzieren.

Probleme: 1) Ich empfange weiterhin einen Fehler 400. Normalerweise, wenn ich einen Fehler erhalte, zeigt VBA welche Zeile. Was ist das? Wie kann ich einen fehlerfangenden Block einrichten, so dass der Editor mir mehr Details über den Fehler zur Verfügung stellen wird (zB Ort, Grund des Auftretens, etc.) 2) Ich nehme an, dass die lange Reihe (in diesem Fall die 12 von oben) kann nur durch seine Länge identifiziert werden. Gibt es einen besseren Weg, die lange Reihe zu identifizieren? Vielleicht, wenn es mehrere Bindestriche enthält? 3) Kennt jemand eine Möglichkeit, ein PDF eines Buchhaltungsausdrucks einfach zu übertragen, so dass es beim Speichern oder Kopieren in eine Tabelle seine Formatierung behält? 4) Gibt es eine Möglichkeit, dass diese Tabellenkalkulation einfach über Excel formatiert werden kann, damit sie besser in die richtige Form passt (mehr wie in Bild 2)?

Option Explicit 

Sub findDetailMemo() 

    Dim pers As Worksheet 
    Set pers = ThisWorkbook.Sheets("PERS") 

    Dim persLength As Long 
    persLength = pers.Range("a1").End(xlDown).Row 


    Dim expenseLength As Long 
    expenseLength = Range("a1").End(xlDown).Row 

    Dim currentDetail() As String 


    Dim i As Long 
    Dim j As Long 
    Dim k As Long 


    Dim tempInt As Long 


'first scan all of the items in the pers unit 
     For k = 2 To 10 
     'next scan all of the expenses 
       For i = 2 To expenseLength 
        'if the invoice # is found 
        If InStr(Cells(i, 1), pers.Range("a1").Offset(k, 3)) <> 0 Then 
         'scan upwards; make sure you don't scan beyond the range of the spreadsheet 
         For j = i To 1 Step -1 
          'if the scan upwards finds a string that is 80 characters or more 
          If Len(Cells(i - j, 1)) >= 80 Then 
           'split it at the - 
           currentDetail = Split(Cells(i - j, 1), "-", -1, vbTextCompare) 
           'add it to the pers sheet 
           pers.Range("a1").Offset(k, 11) = currentDetail(0) 
           pers.Range("a1").Offset(k, 12) = currentDetail(1) 
           pers.Range("a1").Offset(k, 13) = currentDetail(2) 
           pers.Range("a1").Offset(k, 14) = currentDetail(3) 
           Exit For 
          End If 
         Next j 
        Exit For 
        Else 
        End If 
       Next i 
     Next k 
End Sub 

ExpensePrintout

PERS

Antwort

1

EDIT: Nach einer Diskussion über den Chat-Lobby, bdpolinsky und ich fand, was den ursprünglichen Fehler warf 400 (die eigentlich Fehler 1004 war).

Das erste Problem, das wir behoben haben, war die InStr() und Split() Funktionen verwiesen Zelle Objekte anstelle der Zeichenfolge in ihnen. Dies wurde behoben, indem einfach Cells().Text hinzugefügt wurde, wo Strings benötigt wurden.

In der Zeile If Len(Cells(i - j, 1).Text) >= 80 haben wir festgestellt, dass Cells() nicht auf das richtige Arbeitsblatt verwiesen hat. Die Lösung dafür war, Cells() als pers.Cells() zu definieren. Dies ist das Arbeitsblatt, in das die Informationen importiert wurden. Freut mich zu berichten, dass das Problem, das bdpolinsky hatte, gelöst wurde (soweit die Fehler gehen).

Das Folgende ist aus der ursprünglichen Antwort:

1) Zu Beginn des Codes (ersten ausführbaren Zeile) Sie F8 drücken können, zu einer Zeit durch den Code 1 Zeile zu dem Schritt, bis der Fehler angezeigt wird .

Sie können auch Fehlerbehandlungsroutinen verwenden, um einen Fehler zu finden und eine Excel-Operation durchführen zu lassen. Error Handling

Sub SomeCode() 
    Dim i As Integer 

    On Error GoTo ErrHandler 
    i = 1/0 

ErrHandler: 
    MsgBox "Error Description: " & Err.Description 
End Sub 

Sie können auch neben einem Codezeile klicken, um eine Pause hinzuzufügen. Pausen sehen wie rote Kreise aus und färben diese Codezeile rot. Ihr Code wird beendet, wenn er diese Zeile erreicht.

enter image description here

2) If Len(cellThatYoureChecking) > 20 Then Code

Oder

If InStr(cellThatYoureChecking, "symbolYouWantToFind") <> 0 Then Code

Oder besuchen this post über die Definition, wie oft ein Zeichen mit einer Funktion in einem String ist. Sie könnten dann Ihre If-Anweisung basierend auf der Häufigkeit des Auftretens erstellen.

3) Dieser Teil ist eine schlechte Form für StackOverflow, aber was Sie fragen, ist ein wenig beteiligt, also sehen Sie, ob dieses Tutorial für Sie von Nutzen ist. Import table from PDF to Excel.

4) Die kurze Antwort darauf lautet ja. Es gibt viele Möglichkeiten, Daten in Excel zu reorganisieren. Diese Frage ist jedoch ein wenig zu weit gefasst, und es wäre effizienter, die Fragen 1-3 zuerst zu beantworten, bevor wir zu weit voraus sind.

+0

Hallo danke.Warum würde dieser Code einen Fehler 400 zurückgeben? – bdpolinsky

+1

Wenn Sie könnten, mit Ihrem Code vor der For-Anweisung, geben Sie On Error GoTo ErrHandler ein. Am Ende des Codes, direkt über 'End Sub', geben Sie 'ErrHandler:', in der Zeile unter diesem Typ 'MsgBox Err.Description'. Was steht da? – Tyeler

+0

es sagt mit einem Highlight "Label nicht definiert" auf 'On Error GoTo ErrHandler:' ... end sub ErrHandler: MsgBox (Err.Description) – bdpolinsky

Verwandte Themen