У меня была такая же проблема при импорте табличных частей PDF в Excel. Я сделал следующее:
- открыть PDF вручную, выбрать все и скопировать
- вручную изменить на Excel
- запустить VBA, которая читает буфер обмена, анализирует данные и записывает на лист
Проблема здесь заключалась в том, что данные в буфере расположены не горизонтально - как вы ожидаете - но вертикально. Поэтому мне пришлось разработать некоторый код вокруг этого. Я использовал модуль класса для реализации таких функций, как «следующее слово», «следующая строка», «поиск слова» и т. Д.
Я рад поделиться этим кодом, если он поможет.
EDIT:
Я использую MSForms.DataObject
для чтения буфера обмена. После создания ссылки на библиотеку объектов Microsoft Forms 2.0 (... \ system32 \ FM20.DLL) создайте новый модуль класса с именем ClipClass
и введите следующий код:
Public P As Integer ' line pointer
Public T As String ' total text buffer
Public L As String ' current line
Public Property Get FirstLine() As String
P = 1
FirstLine = NextLine()
End Property
Public Property Get NextLine() As String
L = ""
Do Until Mid(T, P, 2) = vbCrLf
L = L & Mid(T, P, 1)
P = P + 1
Loop
NextLine = L
P = P + 2
End Property
Public Property Get FindLine(Arg As String) As String
Dim Tmp As String
Tmp = FirstLine()
Do Until Tmp = Arg
Tmp = NextLine()
Loop
FindLine = Tmp
End Property
Private Sub Class_Initialize()
Dim Buf As MSForms.DataObject
Set Buf = New MSForms.DataObject ' this object interfaces with the clipboard
Buf.GetFromClipboard ' copy Clipboard to Object
T = Buf.GetText ' copy text from Object to string var
L = ""
P = 1
Set Buf = Nothing ' clean up
End Sub
Это дает вам все функции, необходимые для поиска строки и считывания строк. Теперь самое интересное ... в моем случае у меня есть постоянная строка в PDF, которая всегда расположена на 3 строки выше первой ячейки таблицы; и все ячейки таблицы располагаются столбец за столбцом в текстовом буфере. Это парсер, который вызывается кнопкой на листе Excel
Sub Parse()
Dim C As ClipClass, Tmp As String, WS As Range
Dim WSRow As Integer, WSCol As Integer
' initialize
Set WS = Worksheets("Table").[A1]
Set C = New ClipClass ' this creates the class instance and implicitely
' fires its Initialize() code which grabs the Clipboard
' get to head of table
Tmp = C.FindLine("identifying string before table starts")
' advance to one line before first table field - each field is terminated by CRLF
Tmp = C.NextLine
Tmp = C.NextLine
' PDF table is 3 col's x 7 rows organized col by col
For WSCol = 1 To 3
For WSRow = 1 To 7
WS(WSRow, WSCol) = C.NextLine
Next WSRow
Next WSCol
End Sub