Podział i zapisywanie dokumentów na podstawie wyszukiwanej frazy

Podział i zapisywanie dokumentów na podstawie wyszukiwanej frazy

Wątek przeniesiony 2024-09-09 10:02 z Inne języki programowania przez Riddle.

AM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Witam wszystkich. Jestem autorką poniższego macro VBA. Od kilku dni próbuję zlokalizować i naprawić swój błąd, niestety bezskutecznie, dlatego zwracam się do Was.

Mam następujące zarzuty w kwestii poniższego kodu:

  • w trakcie wyodrębniania i zapisywania kolejnych dokumentów dodawana jest na końcu każdego z nich pusta strona,
  • część związana z wyodrębnianiem numeru klienta, który jest potrzebny do nazwy zapisywanych plików nie działa poprawnie, każdy wyodrębniony dokument zostaje zapisany z numerem klienta "000000".

W dokumencie zbiorczym WHITGL0T1.docx fraza "Ntra Ref" znajduje się zawsze na pierwszej stronie każdego z dokumentów do wyodrębnienia natomiast numer klienta pojawia się zawsze w tej samej linijce w której występuje fraza, zaraz za nią i zawsze jest ciągiem 6 cyfr. Niestety w dokumencie WHITGL0T1.docx wygląda to tak: "Ntra Ref : 987654", dlatego podejrzewam, że te spacje i dwukropek mogą stanowić problem, dlatego próbowałam je ominąć. Dodam jeszcze, że ilość spacji, a więc jedna przed dwukropkiem i jedno po dwukropku nie zawsze jest regularna:

Kopiuj
Sub SplitDocument()
    Dim SourcePath As String
    Dim DestinationPath As String
    Dim SourceDoc As Document
    Dim i As Integer
    Dim isDocumentStart As Boolean
    Dim docNumber As Integer
    Dim startPage As Integer
    Dim endPage As Integer
    Dim r As Range
    Dim startRange As Range
    Dim endRange As Range
    Dim pageNumbers() As Integer
    Dim pageCount As Integer
    Dim foundRef As String
    Dim clientNumber As String
    Dim match As Object
    Dim regex As Object
    Dim matches As Object
    
    SourcePath = "C:\...\"
    DestinationPath = "C:\...\"
    docNumber = 0
    isDocumentStart = False

    Set SourceDoc = Documents.Open(SourcePath & "WHITGL0T1.docx")
    Set r = SourceDoc.Range
    docNumber = 0

    ' Inicjalizuj wyrażenie regularne
    Set regex = CreateObject("VBScript.RegExp")
    regex.IgnoreCase = True
    regex.Global = False
    regex.Pattern = "Ntra Ref[\s:]*\d{6}" ' Wyrażenie regularne do znalezienia numeru klienta

    ' Znajdź wszystkie wystąpienia frazy 'Ntra Ref' i zapisz numery stron w tablicy
    pageCount = 0
    Do While r.Find.Execute(FindText:="Ntra Ref", MatchWholeWord:=True)
        pageCount = pageCount + 1
        ReDim Preserve pageNumbers(1 To pageCount)
        pageNumbers(pageCount) = r.Information(wdActiveEndPageNumber)
    Loop

    ' Dziel dokument na podstawie przechowywanych numerów stron
    For i = 1 To pageCount
        If Not isDocumentStart Then
            Set startRange = SourceDoc.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=pageNumbers(i))
            isDocumentStart = True
        End If

        If i = pageCount Then
            Set endRange = SourceDoc.Content
        Else
            Set endRange = SourceDoc.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=pageNumbers(i + 1))
        End If

        docNumber = docNumber + 1
        endRange.Start = endRange.Start - 1 ' Wykluczenie podziału strony na początku następnej strony

        ' Zapisz plik z numerem klienta w nazwie
        foundRef = SourceDoc.Range(startRange.Start, endRange.End).Text
        
        ' Szukaj numeru klienta w tej samej linii
        If regex.Test(foundRef) Then
            Set matches = regex.Execute(foundRef)
            If matches.Count > 0 Then
                clientNumber = Trim(Mid(matches(0).Value, InStr(matches(0).Value, " ") + 1, 6))
            End If
        Else
            clientNumber = "000000" ' Zabezpieczenie w przypadku braku numeru
        End If

        ' Zapisz PDF
        SourceDoc.Range(startRange.Start, endRange.End).ExportAsFixedFormat2 _
            OutputFileName:=DestinationPath & "Document_" & docNumber & "_" & clientNumber & ".pdf", _
            ExportFormat:=wdExportFormatPDF

        isDocumentStart = False
    Next i

    SourceDoc.Close SaveChanges:=False

    MsgBox "The document has been split into separate documents based on the 'Ntra Ref' criteria and saved in the destination folder.", vbInformation
End Sub

Będę wdzięczna za waszą pomoc!

Pozdrawiam!

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 755
0

ChatGPT podpowiada
Zmiana w kodzie:

Zmień fragment:

Kopiuj

If i = pageCount Then
    Set endRange = SourceDoc.Content
Else
    Set endRange = SourceDoc.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=pageNumbers(i + 1))
End If

Na:

Kopiuj

If i = pageCount Then
    ' Znajdź ostatnią niepustą stronę
    Set endRange = SourceDoc.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=SourceDoc.ComputeStatistics(wdStatisticPages))
    endRange.Start = endRange.Start - 1 ' Zmniejsz zakres o jeden znak, aby uniknąć eksportu pustej strony
Else
    Set endRange = SourceDoc.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=pageNumbers(i + 1))
End If

co do parsowania nr klienta to tak

Kopiuj
regex.Pattern = "Ntra Ref\s*:\s*(\d{6})"
...
If matches.Count > 0 Then
  clientNumber = matches(0).Submatches(0) ' Pobieramy pierwszą submatch (czyli numer klienta)
Else
  clientNumber = "000000" ' Zabezpieczenie w przypadku braku numeru
End If

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.