Страницы: 1
RSS
Собрать макросом данные в Excel из Word
 
Дорогие форумчане,
прошу помощи в нетепичной задаче.

Дано: несколько десятков файлов - выгрузок из клиент-банка, это вордовские файлы и внутри каждого несколько сотен платежных поручений.
Можно ли макросом собрать номера и даты платежных поручений?

Например (сорри что картинкой, в качестве примера нечего выкладывать):
Вот из этой страницы поручения мне нужно в эксель построчно выгрузить:
1. Номер платежного поручения - 915
2. Дату ПП - 07.05.2019
3. Страницу на которой это ПП размещено - 79

Возможно ли такое?  
чтоб дело мастера боялось, он знает много страшных слов.
 
Макросами можно вас в шахматы обыграть. :)
Без файлов примеров (один исходник Word с 5-10 поручениями внутри, второй - итоговый Excel - в каком виде отчетная таблица нужна - на каком листе, с какой строки и прочее занудство) - вряд ли. Очень неудобно не видя исходных данных чего-нить придумывать по картинке. Мало ли чего у вас там... интересного с т.з. структуры, может там поля именованные, или закладки там... поди знай. :)
Кому решение нужно - тот пример и рисует.
 
Цитата
Ri Yu
Сообщений:  169
и без файла-примера
Изменено: Mershik - 26.08.2021 16:20:24
Не бойтесь совершенства. Вам его не достичь.
 
ок, щя будет
Изменено: Ri Yu - 26.08.2021 16:28:02
чтоб дело мастера боялось, он знает много страшных слов.
 
Ri Yu, а что ПП нет в екселе ?
Не бойтесь совершенства. Вам его не достичь.
 
К сожалению нет, вопрос бы не стоял.
Банк-клиент допотопный.
чтоб дело мастера боялось, он знает много страшных слов.
 
Ri Yu, если ручками просто скопировать из Word данные на лист в ексель-то можно типа так можно попробовать (вроде в приведенном варанте все одинаково друг от друга расположено если ПП отличаются то стоит приложить несколько раных вариантов
Код
Sub mrshkei()
Dim PP As String, i As Long, k As Long, lr As Long, sh As Worksheet
Set sh = Worksheets("Лист1")
PP = "ПЛАТЕЖНОЕ ПОРУЧЕНИЕ №"
k = 3
With Worksheets("Лист2")
    lr = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To lr
        If .Cells(i, 1) = PP Then
            sh.Cells(k, 1) = .Cells(i, 9)
            sh.Cells(k, 2) = .Cells(i, 10)
            sh.Cells(k, 3) = k - 2
            sh.Cells(k, 4) = .Cells(i + 33, 1)
            sh.Cells(k, 5) = .Cells(i + 4, 21)
            sh.Cells(k, 6) = .Cells(i + 23, 1)
            k = k + 1
        End If
    Next i
End With
End Sub

)
Изменено: Mershik - 26.08.2021 22:04:18
Не бойтесь совершенства. Вам его не достичь.
 
Как один из вариантов, можно файл RTF сохранить как ТХТ и потом через PQ его распарсить
Примерно так:
Код
let
    Источник = Csv.Document(File.Contents("C:\откуда\откуда3.txt"),[Delimiter=":", Columns=2, Encoding=1251, QuoteStyle=QuoteStyle.None]),

    Тип = Table.TransformColumnTypes(Источник,{{"Column1", type text}, {"Column2", type text}}),
    Индекс = Table.AddIndexColumn(Тип, "Индекс", 0, 1),
    Столбец = Table.AddColumn(Индекс, "Данные", each 
                if [Column1] = "ПЛАТЕЖНОЕ ПОРУЧЕНИЕ №" then Индекс{[Индекс]+1}[Column1] 
                else if [Column1] = "Сумма" then Индекс{[Индекс]+1}[Column1] 
                else if [Column1] = "Дата" then Индекс{[Индекс]-9}[Column1] 
                else if [Column1] = "Получатель" then Индекс{[Индекс]+40}[Column1] 
                else if [Column1] = "Назначение платежа" then Индекс{[Индекс]-1}[Column1] 
                else  null),
    Фильтр1 = Table.SelectRows(Столбец, each ([Данные] <> null)),
    Дел1 = Table.SelectColumns(Фильтр1,{"Column1", "Данные"}),
    Индекс1 = Table.AddIndexColumn(Дел1, "Страница", 0, 1),
    Номерация = Table.TransformColumns(Индекс1, {{"Страница", each Number.IntegerDivide(_, 5)+1, Int64.Type}}),
    Свод = Table.Pivot(Номерация, List.Distinct(Номерация[Column1]), "Column1", "Данные")
in
    Свод
Изменено: msi2102 - 27.08.2021 13:04:52
 
Вот так попробуйте.
Код:
Код
Sub getAndParseData()
Path = ThisWorkbook.Path & Application.PathSeparator & "откуда.rtf"
Set wd = CreateObject("Word.Application")
wd.documents.Open Path
wd.Visible = True
n = 6
For i = 1 To wd.activedocument.Paragraphs.Count
DoEvents
If InStr(1, wd.activedocument.Paragraphs(i).Range.Text, "ПЛАТЕЖНОЕ ПОРУЧЕНИЕ") > 0 Then
n = n + 1
Cells(n, 1).Value = Application.Clean(wd.activedocument.Paragraphs(i + 1).Range.Text)
Cells(n, 2).Value = Application.Clean(wd.activedocument.Paragraphs(i + 2).Range.Text)
Cells(n, 3).Value = Application.Clean(Application.WorksheetFunction.Round(i / 187, 0) + 1)
Cells(n, 5).Value = Application.Clean(wd.activedocument.Paragraphs(i + 30).Range.Text)
Cells(n, 6).Value = Application.Clean(wd.activedocument.Paragraphs(i + 120).Range.Text)
Cells(n, 4).Value = Application.Clean(wd.activedocument.Paragraphs(i + 155).Range.Text)
End If
Next i
wd.documents.Close
wd.Quit
Set wd = Nothing
End Sub
 
Ребята вы восхитительные!!! Это просто огонь!
Огромное спасибо!!!!
чтоб дело мастера боялось, он знает много страшных слов.
Страницы: 1
Наверх