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
Hallo danke.Warum würde dieser Code einen Fehler 400 zurückgeben? – bdpolinsky
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
es sagt mit einem Highlight "Label nicht definiert" auf 'On Error GoTo ErrHandler:' ... end sub ErrHandler: MsgBox (Err.Description) – bdpolinsky