Lấy dữ liệu Phiếu xuất kho (Word) vào Sheet

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
719
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Kính gửi anh chị!
Hiện em đang làm đối soát vật tư xuất ra công trình cần phải lấy từ các phiếu xuất kho dạng file word do phần mềm xuất ra vào Excel. Làm thủ công với số lượng ít thì cố làm được, tuy nhiên với mỗi công trình có nhiều phiếu rất tồn thời gian
Mong muốn anh chị hỗ trợ giúp em có thể cho phép chọn nhiều phiếu xuất kho lấy được dữ liệu từ bảng trong word đưa vào excel bao gồm các thông tin như file đính kèm
Cám ơn các anh chị nhiều

1. Excel mong muốn kết quả như thế này

1635593095724.png

2. Phiếu xuất kho từ phần mềm dạng file word
1635593156460.png
 

File đính kèm

  • Lay DLieu PXK.xlsx
    40.2 KB · Đọc: 18
  • PXK_VTU 4-VTN_21_460133_.doc
    67.5 KB · Đọc: 22
Upvote 0
Thôi được, bạn tự kiểm tra.

Chả phải giận dỗi gì mà chỉ là tôi thấy mất thời gian vô ích nên muốn ngừng thôi.

Về tách thời gian từ header tôi dùng hàm Instr nhưng cũng có thể dùng RegEx - biểu thức chính quy.
Mã:
Function dulieuPXK(docFilename, sodong_ketqua As Long, ngaythang())
Dim filename As String, text As String, ma As String, soPhieu As String, ngay As String
Dim k As Long, n As Long, r As Long, c As Long, sodong As Long
Dim ketqua(), wordApp As Object, doc As Object
    sodong_ketqua = 0
    ngay = "yyyy-mm-dd"
    On Error Resume Next
    Set wordApp = CreateObject("Word.Application")
'    wordApp.Visible = True
    If Err.Number Then Exit Function
    ReDim ketqua(1 To 500 * UBound(docFilename), 1 To 11)   ' gia thiet la moi tap tin Word cho mang co 500 dong ket qua
    ReDim ngaythang(1 To UBound(docFilename), 1 To 2)
 
    For k = 1 To UBound(docFilename)
        Set doc = wordApp.documents.Open(docFilename(k))
        soPhieu = ""
        With doc.Sections.First.Headers(2).Range.Paragraphs
            For r = 1 To .Count
                text = .Item(r).Range.text
                Mid(text, 2, 1) = "o"   ' bien ky tu thu 2 thanh "o"
                If Mid(text, 1, 4) = "So: " Then
                    soPhieu = Trim(Mid(text, 5, Len(text) - 5))
                End If
                If soPhieu <> "" Then
                    If Mid(text, 1, 6) = "(oheo " Then  ' khong phai la "(Theo " ma la "(oheo " vi truoc do bien ky tu thu 2 cua text thanh "o"
                        text = Application.Trim(Mid(text, InStr(1, text, "Ng")))
                        n = InStr(1, text, " ") + 1
                        Mid(ngay, 9, 2) = Mid(text, n, 2)
                        n = InStr(n + 3, text, " ") + 1
                        Mid(ngay, 6, 2) = Mid(text, n, 2)
                        n = InStr(n + 3, text, " ") + 1
                        Mid(ngay, 1, 4) = Mid(text, n, 4)
                        ngaythang(k, 1) = soPhieu
                        ngaythang(k, 2) = ngay
                        Exit For
                    End If
                End If
            Next r
            If r > .Count Then
                sodong_ketqua = 0
                MsgBox "Tap tin " & docFilename(k) & " co cau truc khong hop le"
                Exit Function
            End If
        End With
     
        With doc.Tables(2)
            sodong = .Rows.Count - 3
            For r = 1 To sodong
                ketqua(sodong_ketqua + r, 1) = Replace(.Cell(r + 3, 3).Range.text, Chr(7), "")
                ketqua(sodong_ketqua + r, 2) = Replace(.Cell(r + 3, 2).Range.text, Chr(7), "")
                For c = 3 To 8
                    ketqua(sodong_ketqua + r, c) = Replace(.Cell(r + 3, c + 1).Range.text, Chr(7), "")
                    If c > 6 Then ketqua(sodong_ketqua + r, c) = CDbl(Replace(ketqua(sodong_ketqua + r, c), ".", "")) ' Don gia, Thanh tien
                Next c
                ketqua(sodong_ketqua + r, 9) = soPhieu
                ma = doc.Tables(1).Cell(5, 1).Range.text
                ketqua(sodong_ketqua + r, 10) = Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), "")
                ma = doc.Tables(1).Cell(3, 1).Range.text
                ketqua(sodong_ketqua + r, 11) = Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), "")
            Next r
        End With
        sodong_ketqua = sodong_ketqua + sodong
        doc.Close False
    Next k
 
    wordApp.Quit
    Set doc = Nothing
    Set wordApp = Nothing
    dulieuPXK = ketqua
End Function

Sub lay_dulieu()
Dim sodong_ketqua As Long, docFilename, ketqua, ngaythang()
    docFilename = Application.GetOpenFilename("Word Files (*.doc;*.docx), *.doc;*.docx", MultiSelect:=True)
    If Not IsArray(docFilename) Then Exit Sub
    ketqua = dulieuPXK(docFilename, sodong_ketqua, ngaythang)
    If sodong_ketqua > 0 Then
        With ThisWorkbook.Worksheets("TEMP")
            .Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(sodong_ketqua, UBound(ketqua, 2)).Value = ketqua
            .Range("Q1:R1").Resize(UBound(ngaythang, 1)).Value = ngaythang  ' cot Q:R
        End With
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ Code tuyệt vời ạ
Cám ơn anh nhiều
 
Upvote 0
Thôi được, bạn tự kiểm tra.

Chả phải giận dỗi gì mà chỉ là tôi thấy mất thời gian vô ích nên muốn ngừng thôi.

Về tách thời gian từ header tôi dùng hàm Instr nhưng cũng có thể dùng RegEx - biểu thức chính quy.
Mã:
Function dulieuPXK(docFilename, sodong_ketqua As Long, ngaythang())
Dim filename As String, text As String, ma As String, soPhieu As String, ngay As String
Dim k As Long, n As Long, r As Long, c As Long, sodong As Long
Dim ketqua(), wordApp As Object, doc As Object
    sodong_ketqua = 0
    ngay = "yyyy-mm-dd"
    On Error Resume Next
    Set wordApp = CreateObject("Word.Application")
'    wordApp.Visible = True
    If Err.Number Then Exit Function
    ReDim ketqua(1 To 500 * UBound(docFilename), 1 To 11)   ' gia thiet la moi tap tin Word cho mang co 500 dong ket qua
    ReDim ngaythang(1 To UBound(docFilename), 1 To 2)
 
    For k = 1 To UBound(docFilename)
        Set doc = wordApp.documents.Open(docFilename(k))
        soPhieu = ""
        With doc.Sections.First.Headers(2).Range.Paragraphs
            For r = 1 To .Count
                text = .Item(r).Range.text
                Mid(text, 2, 1) = "o"   ' bien ky tu thu 2 thanh "o"
                If Mid(text, 1, 4) = "So: " Then
                    soPhieu = Trim(Mid(text, 5, Len(text) - 5))
                End If
                If soPhieu <> "" Then
                    If Mid(text, 1, 6) = "(oheo " Then  ' khong phai la "(Theo " ma la "(oheo " vi truoc do bien ky tu thu 2 cua text thanh "o"
                        text = Application.Trim(Mid(text, InStr(1, text, "Ng")))
                        n = InStr(1, text, " ") + 1
                        Mid(ngay, 9, 2) = Mid(text, n, 2)
                        n = InStr(n + 3, text, " ") + 1
                        Mid(ngay, 6, 2) = Mid(text, n, 2)
                        n = InStr(n + 3, text, " ") + 1
                        Mid(ngay, 1, 4) = Mid(text, n, 4)
                        ngaythang(k, 1) = soPhieu
                        ngaythang(k, 2) = ngay
                        Exit For
                    End If
                End If
            Next r
            If r > .Count Then
                sodong_ketqua = 0
                MsgBox "Tap tin " & docFilename(k) & " co cau truc khong hop le"
                Exit Function
            End If
        End With
   
        With doc.Tables(2)
            sodong = .Rows.Count - 3
            For r = 1 To sodong
                ketqua(sodong_ketqua + r, 1) = Replace(.Cell(r + 3, 3).Range.text, Chr(7), "")
                ketqua(sodong_ketqua + r, 2) = Replace(.Cell(r + 3, 2).Range.text, Chr(7), "")
                For c = 3 To 8
                    ketqua(sodong_ketqua + r, c) = Replace(.Cell(r + 3, c + 1).Range.text, Chr(7), "")
                    If c > 6 Then ketqua(sodong_ketqua + r, c) = CDbl(Replace(ketqua(sodong_ketqua + r, c), ".", "")) ' Don gia, Thanh tien
                Next c
                ketqua(sodong_ketqua + r, 9) = soPhieu
                ma = doc.Tables(1).Cell(5, 1).Range.text
                ketqua(sodong_ketqua + r, 10) = Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), "")
                ma = doc.Tables(1).Cell(3, 1).Range.text
                ketqua(sodong_ketqua + r, 11) = Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), "")
            Next r
        End With
        sodong_ketqua = sodong_ketqua + sodong
        doc.Close False
    Next k
 
    wordApp.Quit
    Set doc = Nothing
    Set wordApp = Nothing
    dulieuPXK = ketqua
End Function

Sub lay_dulieu()
Dim sodong_ketqua As Long, docFilename, ketqua, ngaythang()
    docFilename = Application.GetOpenFilename("Word Files (*.doc;*.docx), *.doc;*.docx", MultiSelect:=True)
    If Not IsArray(docFilename) Then Exit Sub
    ketqua = dulieuPXK(docFilename, sodong_ketqua, ngaythang)
    If sodong_ketqua > 0 Then
        With ThisWorkbook.Worksheets("TEMP")
            .Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(sodong_ketqua, UBound(ketqua, 2)).Value = ketqua
            .Range("Q1:R1").Resize(UBound(ngaythang, 1)).Value = ngaythang  ' cot Q:R
        End With
    End If
End Sub
Anh batman1 nhờ anh chỉnh giúp em đoạn code chỗ phần mã vật tư hiện các mã sau khi lấy vào file Excel đều thêm ký tự xuống dòng ạ. Ký tự char(13) anh ạ dẫn đến việc so sánh Vlookup sang Sheet khác bị lỗi ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Em đang phải dùng tạm Code này để xoá ký tự xuống dòng nếu a rảnh giúp em chỗ này với ạ. Em cám ơn
Mã:
Sub Remove_Char_13()
    On Error Resume Next
    
    Dim MyRange As Range
    Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
 
        For Each MyRange In ActiveSheet.UsedRange
                If 0 < InStr(MyRange, Chr(13)) Then
                        MyRange = Replace(MyRange, Chr(13), "")
                End If
        Next
 
    Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
End Sub
 
Upvote 0
Anh batman1 nhờ anh chỉnh giúp em đoạn code chỗ phần mã vật tư hiện các mã sau khi lấy vào file Excel đều thêm ký tự xuống dòng ạ. Ký tự char(13) anh ạ dẫn đến việc so sánh Vlookup sang Sheet khác bị lỗi ạ
Cả cụm cũ
Mã:
For r = 1 To sodong
...
Next r
thay bằng

Mã:
For r = 1 To sodong
    ketqua(sodong_ketqua + r, 1) = Replace(Replace(.Cell(r + 3, 3).Range.text, Chr(7), ""), Chr(13), "")
    ketqua(sodong_ketqua + r, 2) = Replace(Replace(.Cell(r + 3, 2).Range.text, Chr(7), ""), Chr(13), "")
    For c = 3 To 8
        ketqua(sodong_ketqua + r, c) = Replace(Replace(.Cell(r + 3, c + 1).Range.text, Chr(7), ""), Chr(13), "")
        If c > 6 Then ketqua(sodong_ketqua + r, c) = CDbl(Replace(ketqua(sodong_ketqua + r, c), ".", "")) ' Don gia, Thanh tien
    Next c
    ketqua(sodong_ketqua + r, 9) = soPhieu
    ma = doc.Tables(1).Cell(5, 1).Range.text
    ketqua(sodong_ketqua + r, 10) = Replace(Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), ""), Chr(13), "")
    ma = doc.Tables(1).Cell(3, 1).Range.text
    ketqua(sodong_ketqua + r, 11) = Replace(Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), ""), Chr(13), "")
Next r
 
Upvote 0
Cả cụm cũ
Mã:
For r = 1 To sodong
...
Next r
thay bằng

Mã:
For r = 1 To sodong
    ketqua(sodong_ketqua + r, 1) = Replace(Replace(.Cell(r + 3, 3).Range.text, Chr(7), ""), Chr(13), "")
    ketqua(sodong_ketqua + r, 2) = Replace(Replace(.Cell(r + 3, 2).Range.text, Chr(7), ""), Chr(13), "")
    For c = 3 To 8
        ketqua(sodong_ketqua + r, c) = Replace(Replace(.Cell(r + 3, c + 1).Range.text, Chr(7), ""), Chr(13), "")
        If c > 6 Then ketqua(sodong_ketqua + r, c) = CDbl(Replace(ketqua(sodong_ketqua + r, c), ".", "")) ' Don gia, Thanh tien
    Next c
    ketqua(sodong_ketqua + r, 9) = soPhieu
    ma = doc.Tables(1).Cell(5, 1).Range.text
    ketqua(sodong_ketqua + r, 10) = Replace(Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), ""), Chr(13), "")
    ma = doc.Tables(1).Cell(3, 1).Range.text
    ketqua(sodong_ketqua + r, 11) = Replace(Replace(Mid(ma, InStr(1, ma, ":") + 2), Chr(7), ""), Chr(13), "")
Next r
Em cám ơn anh nhiều ạ
 
Upvote 0
Dear anh batman1
Hôm trước anh có giúp đỡ lấy thông tin phiếu xuất kho từ file Word qua, nay do nhu cầu bổ sung thêm nhờ anh code giúp em lấy thêm thông tin từ phiếu nhập kho với ạ
Em cám ơn anh nhiều, mong anh giúp đỡ ạ

Dữ liệu mong muốn nhận được
1642810766371.png
 

File đính kèm

  • PNK_VTU 3-VTN_21_313828_.doc
    47 KB · Đọc: 6
  • PNK_VTU 3-VTN_21_329419_.doc
    41.5 KB · Đọc: 6
  • Help_Phieu Nhap kho.xlsx
    19.5 KB · Đọc: 2
Lần chỉnh sửa cuối:
Upvote 0
Mong các anh chị giúp đỡ em với ạ
Bài đã được tự động gộp:

Mong các anh chị giúp đỡ em với ạ
 
Upvote 0
Dear anh batman1
Hôm trước anh có giúp đỡ lấy thông tin phiếu xuất kho từ file Word qua, nay do nhu cầu bổ sung thêm nhờ anh code giúp em lấy thêm thông tin từ phiếu nhập kho với ạ
Em cám ơn anh nhiều, mong anh giúp đỡ ạ

Dữ liệu mong muốn nhận được
View attachment 271712
Muốn giúp gì thì phải mô tả kỹ chứ tôi đâu có nhiệm vụ nhìn vào cái bảng bạn đưa rồi đoán mò.

Phải mô tả cụ thể muốn làm gì, nếu làm bằng tay thì phải thực hiện những thao tác nào, theo thứ tự nào, lấy gì ở đâu xào nấu với gì từ đâu rồi món đưa tới bàn nào ...

Nếu vấn đề hoàn toàn mới thì lập chủ đề mới. Nếu là ý mới thêm cho vấn đề cũ thì code giải quyết vấn đề cũ ở đâu? Và code mới chỉ giải quyết vấn đề mới hay phải sửa code cũ để giải quyết cả vấn đề cũ và mới? Mọi mô tả, giải thích, dữ liệu mẫu phải ở một chỗ và ở chỗ này, chứ không phải người giúp phải đọc những bài trước đó để hiểu để có dữ liệu, code.
 
Upvote 0
Muốn giúp gì thì phải mô tả kỹ chứ tôi đâu có nhiệm vụ nhìn vào cái bảng bạn đưa rồi đoán mò.

Phải mô tả cụ thể muốn làm gì, nếu làm bằng tay thì phải thực hiện những thao tác nào, theo thứ tự nào, lấy gì ở đâu xào nấu với gì từ đâu rồi món đưa tới bàn nào ...

Nếu vấn đề hoàn toàn mới thì lập chủ đề mới. Nếu là ý mới thêm cho vấn đề cũ thì code giải quyết vấn đề cũ ở đâu? Và code mới chỉ giải quyết vấn đề mới hay phải sửa code cũ để giải quyết cả vấn đề cũ và mới? Mọi mô tả, giải thích, dữ liệu mẫu phải ở một chỗ và ở chỗ này, chứ không phải người giúp phải đọc những bài trước đó để hiểu để có dữ liệu, code.
Dạ anh batman1!
Cùng 1 nội dung hôm trước anh đã giúp em lấy thong tin từ các phiếu xuất kho. Code đó chạy rất rốt rồi ạ
Bây giờ cùng code của anh em lấy thông tin từ phiếu nhập kho với cấu trúc khác phiếu xuất kho ạ
Em xin mô tả lại như sau:
1. Cho phép chọn nhiều phiếu nhập kho để lấy thông tin vào Sheet
2. Các thông tin cần lấy bao gồm Mã vật tư, Tên hàng hoá, ĐVT, Số lượng, Serial Number, và số phiếu nhập ạ
* Thông tin mong muốn lấy từ phiếu nhập vào Sheet

1642842820747.png
* Dữ liệu các phiếu nhập kho
1642842864463.png

1642842895110.png
 

File đính kèm

  • Help_Phieu Nhap kho.xlsx
    19.5 KB · Đọc: 5
  • PNK_VTU 3-VTN_21_313828_.doc
    47 KB · Đọc: 3
  • PNK_VTU 3-VTN_21_329419_.doc
    41.5 KB · Đọc: 3
Upvote 0
Dạ anh batman1!
Cùng 1 nội dung hôm trước anh đã giúp em lấy thong tin từ các phiếu xuất kho. Code đó chạy rất rốt rồi ạ
Bây giờ cùng code của anh em lấy thông tin từ phiếu nhập kho với cấu trúc khác phiếu xuất kho ạ
Em xin mô tả lại như sau:
1. Cho phép chọn nhiều phiếu nhập kho để lấy thông tin vào Sheet
2. Các thông tin cần lấy bao gồm Mã vật tư, Tên hàng hoá, ĐVT, Số lượng, Serial Number, và số phiếu nhập ạ

* Thông tin mong muốn lấy từ phiếu nhập vào Sheet

* Dữ liệu các phiếu nhập kho

Bạn nên nói rõ ra. Nếu tôi hiểu thì dữ liệu nguồn bây giờ là các tập tin WORD, kết quả sẽ ở trong tập tin Excel. Tôi hiểu đúng? Nếu đúng thì không có chuyện BỔ SUNG gì ở đây. Ở vấn đề trước thì dữ liệu nguồn là tập tin Excel, trên cơ sở đó tạo tập tin kết quả Word. Bâu giờ nguồn dữ liệu là Word và kết quả là Excel thì sao gọi là bổ sung đươc.

Nếu dữ liệu nguồn vẫn là Excel còn cái phải tạo là Word thì tôi không hiểu giải thích chọn nhiều phiếu nhập kho để lấy thông tin vào Sheet

Khi mô tả thì bám sát dữ liệu. Nếu dữ liệu có Tên Vật tư thiết bị thì khi mô tả phải dùng Tên Vật tư thiết bị chứ không phải là Tên hàng hóa. Ở tập tin đích phải tô đỏ mọi dữ liệu lấy từ nguồn và giải thích rõ nó được lấy từ đâu ở nguồn. Tại sao phải thế? Vì người giúp bạn sang ngày hôm sau là người ta đã quên hết. Họ có cuộc sống của họ, trăm ngàn vấn đề của họ cần nhớ. Cái mà bạn giải thích ở bài nnn thì họ đã quên. Phải giải thích lại chứ không thể bắt họ đọc lại bài nnn rồi mmm rồi kkk để xem mô tả cũ. Mọi mô tả phải làm lại ở chỗ mới. Hãy mô tả lại cụ thể, nếu làm bằng tay thì bạn thực hiện những thao tác nào, trên cơ sở nào, lấy gì ở đâu và nhập vào đâu. Nếu muốn người khác đoán mò thì hãy đợi người khác. Tôi rất khó tính.

 
Upvote 0
Bạn nên nói rõ ra. Nếu tôi hiểu thì dữ liệu nguồn bây giờ là các tập tin WORD, kết quả sẽ ở trong tập tin Excel. Tôi hiểu đúng? Nếu đúng thì không có chuyện BỔ SUNG gì ở đây. Ở vấn đề trước thì dữ liệu nguồn là tập tin Excel, trên cơ sở đó tạo tập tin kết quả Word. Bâu giờ nguồn dữ liệu là Word và kết quả là Excel thì sao gọi là bổ sung đươc.

Nếu dữ liệu nguồn vẫn là Excel còn cái phải tạo là Word thì tôi không hiểu giải thích chọn nhiều phiếu nhập kho để lấy thông tin vào Sheet

Khi mô tả thì bám sát dữ liệu. Nếu dữ liệu có Tên Vật tư thiết bị thì khi mô tả phải dùng Tên Vật tư thiết bị chứ không phải là Tên hàng hóa. Ở tập tin đích phải tô đỏ mọi dữ liệu lấy từ nguồn và giải thích rõ nó được lấy từ đâu ở nguồn. Tại sao phải thế? Vì người giúp bạn sang ngày hôm sau là người ta đã quên hết. Họ có cuộc sống của họ, trăm ngàn vấn đề của họ cần nhớ. Cái mà bạn giải thích ở bài nnn thì họ đã quên. Phải giải thích lại chứ không thể bắt họ đọc lại bài nnn rồi mmm rồi kkk để xem mô tả cũ. Mọi mô tả phải làm lại ở chỗ mới. Hãy mô tả lại cụ thể, nếu làm bằng tay thì bạn thực hiện những thao tác nào, trên cơ sở nào, lấy gì ở đâu và nhập vào đâu. Nếu muốn người khác đoán mò thì hãy đợi người khác. Tôi rất khó tính.

Dạ em xin lỗi anh batman1 đã nhờ anh mà mô tả không rõ ràng ạ
Dữ liệu nguồn là các phiếu nhập kho (file Word), thông tin sau khi lấy được sẽ đưa vào Sheet "BBTHVT" ạ
Em xin mô tả như sau đính lại file ạ

1642846418228.png
 

File đính kèm

  • Help_Phieu Nhap kho.xlsx
    19.8 KB · Đọc: 8
  • PNK_VTU 3-VTN_21_313828_.doc
    47 KB · Đọc: 10
Upvote 0
Dạ em xin lỗi anh batman1 đã nhờ anh mà mô tả không rõ ràng ạ
Dữ liệu nguồn là các phiếu nhập kho (file Word), thông tin sau khi lấy được sẽ đưa vào Sheet "BBTHVT" ạ
Em xin mô tả như sau đính lại file ạ
Nguồn và đích trái với bài 1, vậy đây là vấn đề mới chứ đâu phải là bổ sung cho vấn đề cũ. Lần sau vấn đề mới thì phải lập chủ đề mới.

Vài câu hỏi nữa.
1. Code phải hiện cửa sổ để chọn các tập tin Word cần thao tác?

2. Hiện thời cả 2 tập tin Word đều có 2 dòng ở bảng 1. Luôn thế hay mỗi tập tin có thể có số dòng tùy ý?

3. Sẽ có tập tin Word có phụ lục và có tập tin không có phụ lục?

4. Tập tin mẫu Excel chỉ có dữ liệu cố định ở dòng 2-10? Thế có sẵn 29-30 không? Tôi hiểu là các dữ liệu sẽ nhập vào các dòng từ 11, tức code sẽ tự xóa kết quả cũ. Đúng thế? Nếu có sẵn 29-30 (giám đốc, người nhận, người giao) mà do chọn nhiều tập tin Word hoặc tổng cộng số dòng nhiều thì chèn thêm dòng và đẩy 29-30 (giám đốc, người nhận, người giao) xuống dưới?

Nếu tôi nhận được câu trả lời thì cũng phải tối hoặc đêm tôi mới giúp. Hôm nay weekend nên nghỉ ngơi, bia bọt ... Tối ở chỗ tôi sau tối ở Việt Nam 6 tiếng.
 
Upvote 0
1. Dạ Code sẽ cho chọn các tập tin Word có cấu trúc giống nhau và dữ liệu tùy ý không cố định
2. Tập tin word sẽ có file có phụ lục đối với hàng hóa có serial number, còn lại thì không ạ
3. Code sẽ đổ dữ liệu mới và xóa toàn bộ dữ liệu cũ ạ. Nếu dữ liệu nhiều hơn sẽ chèn thêm dòng. Đuôi Sheet Excel có các thành phần ký như thế
Dạ cám ơn anh. Mong anh giúp em ạ
 
Lần chỉnh sửa cuối:
Upvote 0
1. Dạ Code sẽ cho chọn các tập tin Word có cấu trúc giống nhau và dữ liệu tùy ý không cố định
2. Tập tin word sẽ có file có phụ lục đối với hàng hóa có serial number, còn lại thì không ạ
3. Code sẽ đổ dữ liệu mới và xóa toàn bộ dữ liệu cũ ạ. Nếu dữ liệu nhiều hơn sẽ chèn thêm dòng. Đuôi Sheet Excel có các thành phần ký như thế
1. Bạn nhập 3 giá trị Tốt vào I11, I12, I13 nhưng tôi không biết bạn lấy từ đâu vì trong tập tin Word chỉ có 1 giá trị Tốt cho Ma HH = 060469. Vì vậy code không nhập cột Tình trạng.

2. Bạn không nói gì nên code "đặt" các dòng GIÁM ĐỐC ... ngay sau bảng kết quả cho dù bảng dài hay ngắn.

3. Thêm Module và dán vào nó code sau

Mã:
Option Explicit

Sub lay_dulieu()
Const wdDoNotSaveChanges = 0
Dim k As Long, r As Long, c As Long, sodong As Long, curr_row As Long, count As Long, text As String, sn As String, soPhieu As String, files, kq(), chiso
Dim wordApp As Object, doc As Object, tabl As Object, serial As Object
    files = Application.GetOpenFilename("Word Files (*.doc; *.docx),*.doc;*.docx", , "Hay chon cac tap tin Word", , True)
    If Not IsArray(files) Then Exit Sub
    Set wordApp = CreateObject("Word.Application")
    wordApp.Visible = True
    
    ReDim kq(1 To 1000, 1 To 8)
    chiso = Array(3, 2, 4, 6, 5)    ' chi so cac cot can lay du lieu o bang hoac phu luc tu Word
    Set serial = CreateObject("Scripting.Dictionary")
    
    For k = 1 To UBound(files, 1)
        Set doc = wordApp.Documents.Open(files(k))  ' mo tap tin Word tiep theo
        soPhieu = ""
        With doc.Paragraphs
            For r = 1 To .count
                text = .Item(r).Range.text
                Mid(text, 2, 1) = "o"   ' bien ky tu thu 2 thanh "o"
                If Mid(text, 1, 4) = "So: " Then
                    soPhieu = Trim(Mid(text, 5, Len(text) - 5))
                    Exit For
                End If
            Next r
            If r > .count Then MsgBox "Tap tin " & files(k) & " co cau truc khong hop le"
        End With
        If soPhieu <> "" Then   ' neu co So phieu thi moi thuc hien tiep
            If doc.Tables.count >= 5 Then   ' neu co phu luc thi cho cac Ma HH va seri cua no vao tu dien dic
                Set tabl = doc.Tables(5)    ' seri o bang 5
                For r = 2 To tabl.Rows.count
                    text = tabl.Cell(r, 3).Range.text
                    text = Replace(Replace(text, Chr(7), ""), Chr(13), "")  ' Ma HH
                    If Not serial.exists(text) Then
                        sn = tabl.Cell(r, 6).Range.text
                        serial.Add text, Replace(Replace(sn, Chr(7), ""), Chr(13), "")   ' Ma HH + so seri
                    End If
                Next r
            End If
            If doc.Tables.count >= 3 Then   ' neu co bang du lieu thi ...
                Set tabl = doc.Tables(3)
                sodong = tabl.Rows.count - 2   ' bo 2 dong: dong tieu de va dong Tong gia tri
                For r = 1 To sodong
                    For c = 0 To UBound(chiso)
                        If c <> 3 Then  ' Ma HH, ...
                            text = tabl.Cell(r + 1, chiso(c)).Range.text
                            kq(curr_row + r, c + 2) = Replace(Replace(text, Chr(7), ""), Chr(13), "")  ' Ma HH, ...
                        ElseIf serial.exists(kq(curr_row + r, 2)) Then ' neu ton tai Ma HH trong tu dien serial voi tu cach la KEY thi ...
                            kq(curr_row + r, 5) = serial.Item(kq(curr_row + r, 2)) ' so seri
                        End If
                    Next c
                    kq(curr_row + r, 8) = soPhieu   ' So phieu
                    kq(curr_row + r, 1) = curr_row + r  ' STT
                Next r
            End If
            curr_row = curr_row + sodong
            count = count + sodong
            serial.RemoveAll
        End If
        doc.Close wdDoNotSaveChanges
    Next k
    If count Then
        With ThisWorkbook.Worksheets("BBTHVT")
            r = .Cells(Rows.count, "C").End(xlUp).Row   ' dong cuoi o cot C
            If count > r - 13 Then
                .Range("A11").Resize(count - r + 13).EntireRow.Insert xlDown    ' chen them (count - r + 13) dong
            ElseIf count < r - 13 Then
                .Range("A11").Resize(r - 13 - count).EntireRow.Delete xlUp  ' xoa bot (r - 13 - count) dong
            End If
            .Range("C11").Resize(count, 8).Value = kq   ' nhap ket qua xuong sheet
        End With
    End If
    wordApp.Quit
    Set doc = Nothing
    Set wordApp = Nothing
    Set serial = Nothing
End Sub
 
Upvote 0
Cám ơn anh rất nhiều anh batman1.
 
Upvote 0
Web KT

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

Back
Top Bottom