Lấy dữ liệu Phiếu xuất kho (Word) vào Sheet (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
729
Đượ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

Ngồi buồn làm thử.
Lưu ý: code viết cho cấu trúc dữ liệu y hệt như trong tập tin Word. Nếu là xuất từ máy thì chắc chắn các tập tin Word sẽ có cấu trúc như nhau.

Mở tập tin Excel -> Alt + F11 -> menu Insert -> Module -> dán code sau vào Module1. Tên sheet dùng trong code là TEMP, nếu khác thì sửa lại. Gán cho Button macro lay_dulieu. Mỗi lần chạy lay_dulieu thì phải chọn các tập tin Word (doc, docx) và kết quả sẽ được nhập vào sheet sau các kết quả cũ.

Mã:
Function dulieuPXK(docFilename, sodong_ketqua As Long)
Dim filename As String, text As String, ma As String, k As Long, r As Long, c As Long, sodong As Long, ketqua(), wordApp As Object, doc As Object
    sodong_ketqua = 0
    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
   
    For k = 1 To UBound(docFilename)
        Set doc = wordApp.documents.Open(docFilename(k))
        With doc.Sections.First.Headers(2).Range.Paragraphs
            For r = 1 To .Count
                text = .Item(r).Range.text
                Mid(text, 2, 1) = "o"
                If Mid(text, 1, 4) = "So: " Then
                    text = Trim(Mid(text, 5, Len(text) - 5))
                    Exit For
                End If
            Next r
            If r > .Count Then Exit Function
        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) = text
                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
    docFilename = Application.GetOpenFilename("Word Files (*.doc;*.docx), *.doc;*.docx", MultiSelect:=True)
    If Not IsArray(docFilename) Then Exit Sub
    ketqua = dulieuPXK(docFilename, sodong_ketqua)
    If sodong_ketqua > 0 Then
        ThisWorkbook.Worksheets("TEMP").Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(sodong_ketqua, UBound(ketqua, 2)).Value = ketqua
    End If
End Sub
 
Upvote 0
Dạ quá tuyệt vời. Em cám ơn anh batman1
Thêm 1 yêu cầu nho nhỏ anh giúp em bổ sung với nhé cho em thêm danh sách phiếu xuất và ngày xuất sang cột P:R với ạ, mục đích sử dụng sau này Vlookup khi cần lấy thêm thông tin ạ
1635644842177.png
 

File đính kèm

Upvote 0
Dạ quá tuyệt vời. Em cám ơn anh batman1
Thêm 1 yêu cầu nho nhỏ anh giúp em bổ sung với nhé cho em thêm danh sách phiếu xuất và ngày xuất sang cột P:R với ạ, mục đích sử dụng sau này Vlookup khi cần lấy thêm thông tin ạ
View attachment 268501
Theo tôi hiểu thì ngày lấy từ header của tập tin Word. Thế còn PX1, ..., PX11 lấy từ đâu?

Thêm nữa, mỗi lần thao tác bạn có thể chọn nhiều tập tin. Vậy thì giả sử chọn 3 tập tin: tập tin 1 bảng 2 có 11 mục và ngày là 11.10.2021, tập tin 2 bảng 2 có 5 mục và ngày là 13.10.2021, tập tin 3 bảng 2 có 9 mục và ngày là 15.10.2021. 3 ngày khác nhau, 3 phiếu xuất khác nhau với số mục khác nhau. Vậy cột P:R trông như thế nào? P1: P11 = PX1, PX2, ..., PX11, P12: P16 = PX1, ..., PX5, P17: P25 = PX1, PX2, ..., PX9? Phiếu và Ngày ở Q1:R1, Q12:R12 và Q17:R17?

Tung kết quả lên nhưng phải giải thích chúng được lấy ở đâu, trình bầy chúng như thế nào. Tôi không đoán mò nữa.
 
Upvote 0
Dạ anh!
Cột đó chỉ liệt kê mã phiếu xuất kho và ngày xuất kho của các phiếu file word được chọn anh. Em đính kèm 2 phiếu xuất kho và kết quả mong muốn anh
VD: Như em đang nhờ có 1 phiếu thì list kết quả như trên ạ, nếu nhiều phiếu thì list tiếp theo anh. Còn PX1, PX2,.... PX11 thì em ví dụ liệt kê số phiếu được chọn

Mã:
        With doc.Sections.First.Headers(2).Range.Paragraphs
            For r = 1 To .Count
                text = .Item(r).Range.text
                Mid(text, 2, 1) = "o"
                If Mid(text, 1, 4) = "So: " Then
                    text = Trim(Mid(text, 5, Len(text) - 5))
                    Exit For
                End If
            Next r
            If r > .Count Then Exit Function
        End With
Đoạn này anh đã lấy được phiếu xuất, anh lấy giúp em ngày xuất kho với ạ
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dạ anh!
Cột đó chỉ liệt kê mã phiếu xuất kho và ngày xuất kho của các phiếu file word được chọn anh.
VD: Như em đang nhờ có 1 phiếu thì list kết quả như trên ạ, nếu nhiều phiếu thì list tiếp theo anh.
Bạn ạ, vấn đề của bạn mà tôi bỏ ra nhiều thời gian để cụ thể vấn đề. Hơi vô lý phải không? Với dữ liệu mà tôi mất công liệt kê trong bài #4 thì P1:Rxyz phải có mặt mũi như nào?
Còn PX1, PX2,.... thì em ví dụ ạ
Ví dụ? Thế cụ thể chúng được lấy từ đâu? Từ trên trời? Nếu tự tạo thì tạo như nào?

Tôi viết thế thôi, chứ vấn đề của bạn mà bạn có vẻ thảnh thơi hơn tôi nhỉ.
 
Upvote 0
Bạn ạ, vấn đề của bạn mà tôi bỏ ra nhiều thời gian để cụ thể vấn đề. Hơi vô lý phải không? Với dữ liệu mà tôi mất công liệt kê trong bài #4 thì P1:Rxyz phải có mặt mũi như nào?

Ví dụ? Thế cụ thể chúng được lấy từ đâu? Từ trên trời? Nếu tự tạo thì tạo như nào?

Tôi viết thế thôi, chứ vấn đề của bạn mà bạn có vẻ thảnh thơi hơn tôi nhỉ.
Dạ nó được lấy thông tin từ đây anh
VD: Em đính kèm 2 phiếu đây ạ
1635676084161.png
1635676103680.png
Bài đã được tự động gộp:

Theo tôi hiểu thì ngày lấy từ header của tập tin Word. Thế còn PX1, ..., PX11 lấy từ đâu?

Thêm nữa, mỗi lần thao tác bạn có thể chọn nhiều tập tin. Vậy thì giả sử chọn 3 tập tin: tập tin 1 bảng 2 có 11 mục và ngày là 11.10.2021, tập tin 2 bảng 2 có 5 mục và ngày là 13.10.2021, tập tin 3 bảng 2 có 9 mục và ngày là 15.10.2021. 3 ngày khác nhau, 3 phiếu xuất khác nhau với số mục khác nhau. Vậy cột P:R trông như thế nào? P1: P11 = PX1, PX2, ..., PX11, P12: P16 = PX1, ..., PX5, P17: P25 = PX1, PX2, ..., PX9? Phiếu và Ngày ở Q1:R1, Q12:R12 và Q17:R17?

Tung kết quả lên nhưng phải giải thích chúng được lấy ở đâu, trình bầy chúng như thế nào. Tôi không đoán mò nữa.
Dạ ngày lấy từ header của từng tập tin Word ạ
 
Upvote 0
Dạ nó được lấy thông tin từ đây anh
VD: Em đính kèm 2 phiếu đây ạ
View attachment 268531
View attachment 268532
Bài đã được tự động gộp:


Dạ ngày lấy từ header của từng tập tin Word ạ
Số cho cột Q thì tôi cũng lấy từ header ngay từ bài #2. Ngày thì tôi cũng đoán là lấy từ header
Theo tôi hiểu thì ngày lấy từ header của tập tin Word

Không cần bạn giải thích tôi cũng đã đoán được ngày và số lấy từ header. Cái tôi chưa hiểu là PX...

Thế còn PX1, ..., PX11 lấy từ đâu?

Tôi nhìn trong tập tin Word thì không thấy chỗ nào có PX1, ..., PX11. Nếu là tự tạo thì sao kông nói một lời? Tung kết quả lên nhưng không một lời giải thích?

Nếu tự tạo thì có phải là: trong tập tin 1 trong bảng 2 có 11 dòng. Danh sách xuất CÓ DẠNG <PX><số thự tự từ 1 đến 11>? Nếu thế thì tại sao tập tin 2 có 5 dòng mà lại không có TIẾP THEO PX1, PX2, ..., PX5 (5 dòng từ tập tin 2)? Hoặc 5 dòng TIẾP THEO PX12, PX13, ..., PX16? Tức cứ mỗi tập tin thì đánh số lại từ 1, và tiền tố luôn là PX? Nếu thế thì chọn 3 tập tin sẽ có 3 PX1?

Tôi đã cho ví dụ trong bài #4 với số tập tin là 3, có 3 ngày khác nhau, với số dòng là 11, 5 và 9 thì cứ thế mà liệt kê trong P:R cho tôi hiểu chứ đính kèm thêm tập tin làm gì nữa?

Tung kết quả lên cũng phải giải thích cho người khác hiểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cái PX1...PXx là số thứ tự phiếu được lấy thông tin ạ với tiền tố là PX + số thứ tự phiếu ạ
 
Upvote 0
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
4 bài hỏi nhằm xác định vấn đề để trợ giúp cứ như đi vào hư không bởi 4 bài trả lời không tưởng tượng nổi về khả năng đọc hiểu của người trả lời.
 
Upvote 0
Dạ anh giúp em với ạ
Thông tin lấy trong PXK của anh đã rất tuyệt vời rồi
Còn phần tạo 1 mảng tên phiếu và ngày xuất anh giúp em ạ
Bài đã được tự động gộp:

4 bài hỏi nhằm xác định vấn đề để trợ giúp cứ như đi vào hư không bởi 4 bài trả lời không tưởng tượng nổi về khả năng đọc hiểu của người trả lời.
Dạ mong muốn phần đó của em chỉ liệt kê số phiếu và ngày xuất của phiếu được import vào thôi ạ. Thực sự diễn giải và câu hỏi em cũng chưa rõ lắm ạ
 
Upvote 0
Dạ mong muốn phần đó của em chỉ liệt kê số phiếu và ngày xuất của phiếu được import vào thôi ạ. Thực sự diễn giải và câu hỏi em cũng chưa rõ lắm ạ
Bạn lặp lại chuyện đó làm gì nhỉ? Bạn có đọc và hiểu bài #4 chưa? Chắc là chưa hiểu gì vì đến bài này bạn vẫn cứ "em chỉ liệt kê số phiếu..."
 
Upvote 0
Bạn lặp lại chuyện đó làm gì nhỉ? Bạn có đọc và hiểu bài #4 chưa? Chắc là chưa hiểu gì vì đến bài này bạn vẫn cứ "em chỉ liệt kê số phiếu..."
Thớt chỉ cần 2 cột Q và R, còn cột P là số thứ tự với tiền tố "PX", dùng công thức excel là ="PX "&row()
 
Upvote 0
Thớt chỉ cần 2 cột Q và R, còn cột P là số thứ tự với tiền tố "PX", dùng công thức excel là ="PX "&row()
Tôi đoán được thớt nói gì nhưng tại sao cứ ông nói gà (là tiền đề, phải chấp nhận) thì bà nói vịt. Ông ấy cáu là phải, tôi ngoài cuộc mà còn cáu nữa là.
 
Upvote 0
Dạ khổ thế ạ, đến diễn giải cho người khác hiểu ý mình còn chưa được ạ
Anh Maika8008 và anh HieuCD giúp em với ạ. Anh batman1 giận em rồi
 
Upvote 0
Muốn lấy mã phiếu xuất ra theo code của anh batman1 em phải làm sao đây ạ
Anh em xin giúp thêm đoạn code tách ngày tháng phiếu với ạ
1635698882509.png
 
Upvote 0
Thớt chỉ cần 2 cột Q và R, còn cột P là số thứ tự với tiền tố "PX", dùng công thức excel là ="PX "&row()
Thế thì tại sao tới bài #11 vẫn cứ
Dạ cột P: Q chỉ liệt kê số phiếu, ngày xuất kho được import vào thôi anh

Sao không nói một câu: "Thôi em bỏ cột P, anh làm giúp em cột Q: R". Đừng nói là câu nói khó quá không nghĩ ra.
 
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

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

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

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

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

Back
Top Bottom