Auto VBA Extract Dữ liệu từ PDF sang Excel

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

ngoctuyen1995

Thành viên hoạt động
Tham gia
25/4/17
Bài viết
196
Được thích
19
Giới tính
Nữ
Thân chào cả Nhà GPEX..!

Hiện tại em có một File PDF bao gồm hơn 100 Page, mỗi Page tương ứng với một đơn đặt hàng và chi tiết theo từng Đơn. Em muốn trích xuất dữ liệu từ PDF sang Excel theo Template để dễ dàng tracking Data hơn ạ vì nếu nhìn từng Page thì em rất khó khăn trong việc Tracking.

Em có đính kèm File Excel Demo và 2 page của file PDF ạ.


Mong cả nhà giúp đỡ, anh chân thành cảm ơn ạ.
 

File đính kèm

  • Data.xlsx
    12.9 KB · Đọc: 21
  • Test.pdf
    196.1 KB · Đọc: 34
Nếu tôi đề xuất 1 phương pháp bán thủ công bạn nghĩ sao?
Bước 1) Thủ công: Mở file PDF, Ctrl A, copy toàn bộ body
Bước 2) Qua excel, chọn ô A1 của 1 sheet trống (VD: sheet Temp) : Paste Special/Unicode Text
Lúc này, cột A bao gồm tất cả data từ PDF copy sang
Bước 3) Tự động hóa: Dùng VBA code lọc dữ liệu đem qua 1 sheet khác theo mẫu

Trong hình đính kèm, cột A, vùng màu xanh là vùng chứa data cần lọc ra.
Nếu bạn OK thì mình tiếp tục nhé.

Capture.JPG
 
Upvote 0
Nếu tôi đề xuất 1 phương pháp bán thủ công bạn nghĩ sao?
Bước 1) Thủ công: Mở file PDF, Ctrl A, copy toàn bộ body
Bước 2) Qua excel, chọn ô A1 của 1 sheet trống (VD: sheet Temp) : Paste Special/Unicode Text
Lúc này, cột A bao gồm tất cả data từ PDF copy sang
Bước 3) Tự động hóa: Dùng VBA code lọc dữ liệu đem qua 1 sheet khác theo mẫu

Trong hình đính kèm, cột A, vùng màu xanh là vùng chứa data cần lọc ra.
Nếu bạn OK thì mình tiếp tục nhé.

View attachment 290942
Dạ, em ok ạ. Mong Anh giúp đỡ.
 
Upvote 0
1. Cách khác: code VBA
- Gọi Word Application, mở file PDF.
- Duyệt qua các Table trong Word để lấy dữ liệu.

2. Kiếm cái thư viện Extract PDF free rồi dùng VBA gọi. xử lý.

Chưa làm qua cái nào trong 2 cách trên :D
 
Upvote 0
1. Cách khác: code VBA
- Gọi Word Application, mở file PDF.
- Duyệt qua các Table trong Word để lấy dữ liệu.

2. Kiếm cái thư viện Extract PDF free rồi dùng VBA gọi. xử lý.

Chưa làm qua cái nào trong 2 cách trên :D
Thớt chỉ có ý tưởng thôi chứ đã làm được đâu. Mục đích có cho biết là để "track" cái gì đó (cái gì đó thì không cho biết).

Tracking là công việc khó, cần kinh nghiệm để biết dữ liệu như thế nào (form/format) và bao nhiêu (scope) thì đủ.
Thớt đưa ra ý tưởng, quý vị gò lưng làm chuột thí nghiệm từng bước. Tôi nghĩ là ngoài code VBA "bấm một phát", thớt không chấp nhận cách nào khác đâu.
 
Upvote 0
Cái này chỉ hơn nhau ở cái mồm, chịu khó dẻo cái miệng (cho dù là bên bán hay bên mua) kêu người tạo ra bảng PDF đó gửi bảng Excel là được.
 
Upvote 0
OK.
Sau khi mở file PDF, copy, dán vào cột A (paste special/Unicode Text) sheet "Temp" xong, qua sheet "Data" nhấn nút "Run"

Cách dùng:
Alt-F11 mở cửa sổ VBA, insert/module1, dán code này vô.
Sheet Data, nút "Run", chuột phải, assign macro, tìm đến sub "PDF"
PHP:
Option Explicit
Sub PDF()
Dim lr&, i&, k&, rng, res(1 To 10000, 1 To 10)
Dim s, inv As String
With Sheets("Temp")
    lr = .Cells(Rows.Count, "A").End(xlUp).Row
    rng = .Range("A1:A" & lr).Value
End With
Do
    i = i + 1
    s = Split(rng(i, 1))
    If InStr(1, rng(i, 1), "(PO No.)") Then inv = s(UBound(s))
    If UBound(s) > 1 Then
        If IsNumeric(s(0)) And IsNumeric(s(1)) And Len(s(1)) = 7 And IsNumeric(Left(s(2), 7)) Then
            k = k + 1
            res(k, 1) = k: res(k, 2) = rng(i, 1): res(k, 10) = inv
            Do
                i = i + 1: s = Split(rng(i, 1))
                If UBound(s) > 2 Then
                    If IsNumeric(s(0)) And IsDate(s(1)) And IsDate(s(2)) Then Exit Do 'And IsNumeric(s(3)) Then Exit Do
                End If
                res(k, 2) = res(k, 2) & " " & rng(i, 1)
            Loop Until i >= lr - 1
        End If
    End If
    If UBound(s) > 2 Then
        If IsNumeric(s(0)) And IsDate(s(1)) And IsDate(s(2)) Then 'And IsNumeric(s(3)) Then
            res(k, 3) = s(0): res(k, 4) = s(1): res(k, 5) = s(2): res(k, 6) = s(3)
            res(k, 7) = rng(i + 1, 1): res(k, 8) = rng(i + 2, 1): res(k, 9) = rng(i + 3, 1)
            i = i + 3
        End If
    End If
Loop Until i >= lr - 1
With Sheets("Data")
    .Range("A4:J10000").ClearContents
    .Range("A4").Resize(k, 10).Value = res
End With
End Sub
 

File đính kèm

  • Data.xlsm
    42.1 KB · Đọc: 26
Upvote 0
Thớt chỉ có ý tưởng thôi chứ đã làm được đâu. Mục đích có cho biết là để "track" cái gì đó (cái gì đó thì không cho biết).

Tracking là công việc khó, cần kinh nghiệm để biết dữ liệu như thế nào (form/format) và bao nhiêu (scope) thì đủ.
Thớt đưa ra ý tưởng, quý vị gò lưng làm chuột thí nghiệm từng bước. Tôi nghĩ là ngoài code VBA "bấm một phát", thớt không chấp nhận cách nào khác đâu.
Cảm ơn anh đã quan tâm ạ, em cũng đã tìm kiếm nhiều nguồn nhưng không ra được kết quả ạ. Nếu cả nhà giúp được em thì em cảm ơn ạ, còn không thì cũng không sao ạ. Chứ em không có ý là đem ai ra làm chuột thí nghiệm nào hết.
Bài đã được tự động gộp:

Cái này chỉ hơn nhau ở cái mồm, chịu khó dẻo cái miệng (cho dù là bên bán hay bên mua) kêu người tạo ra bảng PDF đó gửi bảng Excel là được.
dạ, em cũng đã thử xin file Raw data bên client nhưng bên đó hơi khó khăn, nên mới có Bài đăng này ạ.
 
Upvote 0
OK.
Sau khi mở file PDF, copy, dán vào cột A (paste special/Unicode Text) sheet "Temp" xong, qua sheet "Data" nhấn nút "Run"

Cách dùng:
Alt-F11 mở cửa sổ VBA, insert/module1, dán code này vô.
Sheet Data, nút "Run", chuột phải, assign macro, tìm đến sub "PDF"
PHP:
Option Explicit
Sub PDF()
Dim lr&, i&, k&, rng, res(1 To 10000, 1 To 10)
Dim s, inv As String
With Sheets("Temp")
    lr = .Cells(Rows.Count, "A").End(xlUp).Row
    rng = .Range("A1:A" & lr).Value
End With
Do
    i = i + 1
    s = Split(rng(i, 1))
    If InStr(1, rng(i, 1), "(PO No.)") Then inv = s(UBound(s))
    If UBound(s) > 1 Then
        If IsNumeric(s(0)) And IsNumeric(s(1)) And Len(s(1)) = 7 And IsNumeric(Left(s(2), 7)) Then
            k = k + 1
            res(k, 1) = k: res(k, 2) = rng(i, 1): res(k, 10) = inv
            Do
                i = i + 1: s = Split(rng(i, 1))
                If UBound(s) > 2 Then
                    If IsNumeric(s(0)) And IsDate(s(1)) And IsDate(s(2)) Then Exit Do 'And IsNumeric(s(3)) Then Exit Do
                End If
                res(k, 2) = res(k, 2) & " " & rng(i, 1)
            Loop Until i >= lr - 1
        End If
    End If
    If UBound(s) > 2 Then
        If IsNumeric(s(0)) And IsDate(s(1)) And IsDate(s(2)) Then 'And IsNumeric(s(3)) Then
            res(k, 3) = s(0): res(k, 4) = s(1): res(k, 5) = s(2): res(k, 6) = s(3)
            res(k, 7) = rng(i + 1, 1): res(k, 8) = rng(i + 2, 1): res(k, 9) = rng(i + 3, 1)
            i = i + 3
        End If
    End If
Loop Until i >= lr - 1
With Sheets("Data")
    .Range("A4:J10000").ClearContents
    .Range("A4").Resize(k, 10).Value = res
End With
End Sub
Em làm được rồi ạ, Em cảm ơn anh đã giúp đỡ..
Chúc Anh sức khỏe và Thành Công ạ.
 
Upvote 0
Theo mình hiểu là vẫn theo phương án lấy dữ liệu từ phía bên đối tác.
Quan hệ là hợp tác công việc để đối chiếu công nợ 2 bên, cũng không có gì bảo mật. Nên thì mình nghĩ không có bên nào gây khó dễ đâu

Bạn nhờ lãnh đạo bên mình trao đổi với bên đối tác xem, mình nghĩ sẽ hiệu quả hơn.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom