chuyển file word dạng bảng (có hình ảnh) vào sheet Excel (1 người xem)

Liên hệ QC

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

NewBie2019

Thành viên mới
Tham gia
1/10/19
Bài viết
21
Được thích
0
Giới tính
Nữ
Chào các anh/chị/em
Mình đang có vấn đề cần các ACE quan tâm giúp đỡ
Mình có nhiều tập tin word chứa các bảng table (vừa chữ, vừa hình ảnh) đã lập từ những năm trước,
nay sếp lại yêu cầu làm báo cáo trong excel để dễ trích lọc, nên đành phải chuyển từ cũ (word) sang mới (excel)
nêú làm bằng tay thì oải quá vì thông tin hình ảnh quá nhiều - mỗi file có từ 50 hình đến 100 hình, nên mới vào hỏi các ACE giúp dùm.
Mình chỉ nghĩ được là mình lập có 1 Folder chứa các file word này, khi chép file vào Excel, thì hỏi để chọn up từng file W vào từng sheet (nhưng mình làm hổng nổi - xem file đính kèm: chẳng hạn mình có 4 file word có table cần chép vào file Excel này, chỉ gồm ít trang, vì dung lượng lớn, trang forum không cho chép hơn-, và cũng chưa hiểu có phương án nào khác nữa mà mong các ACE bày giúp)
xin cảm ơn
 

File đính kèm

Tôi làm tạm cho 1 tập tin Word vì do bạn chưa viết rõ nên đằng nào cũng phải làm lại.
Lưu ý:
- code giả thiết là tất cả các cột đều có cùng số dòng, và tất cả các dòng đều có cùng số cột. Không có chuyện 1 ô được chia (split) thành nhiều ô, hoặc nhiều ô được gộp thành 1. Phải như tập tin hiện thời của bạn.
- mỗi ô bên Excel được định dạng Alignment Vertical là Top, với Wrap Text.
- Chỉ có thể đọc được độ rộng mỗi cột của bảng trong Word. Và độ rộng mỗi cột bên Excel được thiết lập như bên Word.
- Do không đọc được độ cao mỗi dòng (tôi nói về đọc trực tiếp từ Word) nên tôi thiết lập độ cao tất cả các dòng bên Excel bằng độ rộng lớn nhất từ các cột. Sau đó nếu độ cao của ảnh nào đó > độ cao của dòng chứa ảnh đó thì độ cao của riêng dòng đó được tăng bằng độ cao của ảnh.
- tôi giả thiết là tập tin Word có thể chứa nhiều hơn 1 bảng. Các bảng sẽ được chuyển sang Excel vào các sheet liên tiếp của 1 tập tin Excel - mỗi sheet chỉ chứa 1 bảng. Các bảng sẽ bắt đầu từ B2. Muốn dịch chuyển sang vị trí khác thì thêm dòng ở trên hoặc cột ở bên trái. Thế thôi.

Do bạn không viết rõ nên tôi không chắc là tập tin Word có thể có nhiều hơn 1 bảng. Bạn phải khẳng định lại. Riêng tôi đề xuất giải pháp cho 2 tình huống:
1. Mỗi tập tin Word có thể có > 1 bảng.
Trong trường hợp này với mỗi tập tin Word ta sẽ tạo 1 tập tin Excel và các bảng của 1 tập tin Word sẽ được nhập vào các sheet liên tiếp của 1 tập tin Excel.

2. Mỗi tập tin Word chỉ chứa 1 ảnh.
Trong trường hợp này tạo 1 tập tin Ecel và tất cả các ảnh từ tất cả các tập tin Word được nhập vào các sheet liên tiếp của 1 tập tin Excel.

Bạn phải cho biết mình có trường hợp nào, và nếu muốn xử lý khác với cái tôi đề nghị thì phải cho biết.

Tôi đánh giá là ngoài chuyện độ cao dòng thì mọi khía cạnh khác đều chấp nhận được. Tôi không muốn làm nhiều lần nên bạn phải trả lời các câu hỏi của tôi, và mô tả kỹ. Về độ cao các dòng của bảng bên Excel tôi sẽ tìm cách khác.

Cách sử dụng: mở tập tin Word -> Alt + F11 -> chạy sub WordTableToExcel trong Module1.
 

File đính kèm

Tiếp cận theo hướng khác, code dùng trên Excel.
Mã:
Sub WordToExcel()
Dim i As Long, oDoc As Object, sDocPath As String, oTable As Object
With Application.FileDialog(msoFileDialogFilePicker)
    .Filters.Clear
    .Filters.Add "MS Word Files", "*.doc*"
    .AllowMultiSelect = True
    If .Show Then
        Application.ScreenUpdating = False
        For i = 1 To .SelectedItems.Count
            sDocPath = .SelectedItems(i)
            With CreateObject("Word.Application")
                Set oDoc = .Documents.Add(sDocPath)
                For Each oTable In oDoc.Tables
                    oTable.Range.Find.Execute FindText:="^p", _
                                              ReplaceWith:="[NewLine]", _
                                              MatchWholeWord:=False, _
                                              MatchWildcards:=False, _
                                              Wrap:=0, _
                                              Format:=False, _
                                              Replace:=2
                Next
                sDocPath = Left(sDocPath, InStrRev(sDocPath, ".")) & "mhtml"
                oDoc.SaveAs Filename:=sDocPath, FileFormat:=9
                oDoc.Close False
                .Quit
            End With
            With Workbooks.Open(Filename:=sDocPath, ReadOnly:=True)
                .Sheets(1).Cells.Replace What:="[NewLine]", Replacement:="" & Chr(10) & "", LookAt:=xlPart, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
                .Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
                .Close False
                FixRowHeight ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            End With
            Kill sDocPath
            DoEvents
        Next
        Application.ScreenUpdating = True
    End If
End With
End Sub
Private Sub FixRowHeight(ByVal Sh As Worksheet)
Dim oShape As Shape, dHeight As Double
For Each oShape In Sh.Shapes
    oShape.Placement = xlMove
    dHeight = oShape.Height
    With oShape.TopLeftCell
        If .RowHeight < dHeight Then .EntireRow.RowHeight = dHeight
    End With
Next
End Sub
 
Tiếp cận theo hướng khác, code dùng trên Excel.
Mã:
Sub WordToExcel()
Dim i As Long, oDoc As Object, sDocPath As String, oTable As Object
With Application.FileDialog(msoFileDialogFilePicker)
    .Filters.Clear
    .Filters.Add "MS Word Files", "*.doc*"
  ......
Next
End Sub
Cám ơn anh HuuThang
đúng cái vấn đề mình đang gặp
Lại lần nữa cám ơn anh nhiều
---------------------------------
Hỏi anh thêm 1 ý, nếu anh không giận:
có thể chia code anh đã viết thành 3 câu lệnh cho 3 nút trên form được không ạ?
Untitled.png
Nếu được - hoặc không được, vẫn xin được CÁM ƠN ANH THẬT NHIỀU
Bài đã được tự động gộp:

Tôi làm tạm cho 1 tập tin Word vì do bạn chưa viết rõ nên đằng nào cũng phải làm lại.
Lưu ý:
.......
......
Cách sử dụng: mở tập tin Word -> Alt + F11 -> chạy sub WordTableToExcel trong Module1.
Cám ơn anh BatMan1 đã giúp đỡ
Chỉ đơn giản là bảng word như thế nào thì vào y các ô cell trên sheet như thế đó (không ép kích cỡ ô cell so với hình hay chữ trong word)
và chép từ word có sẵn vào Excel đang mở (chứ không phải tạo một excel mới khác excel đang mở).
Lần nữa, thật lòng cám ơn anh Batman1 nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
đúng cái vấn đề mình đang gặp
Code viết để giải quyết vấn đề của chính bạn mà bạn nói cứ như bạn vô tình tìm thấy code ở một chủ đề nào đó vậy!
có thể chia code anh đã viết thành 3 câu lệnh cho 3 nút trên form được không ạ?
Được nhưng tôi thấy màu mè không cần thiết. Trường hợp này một cửa sổ duyệt file sẽ cơ động, đơn giản và hiệu quả hơn nhiều so với một combobox.
 
Cám ơn anh BatMan1 đã giúp đỡ
Chỉ đơn giản là bảng word như thế nào thì vào y các ô cell trên sheet như thế đó (không ép kích cỡ ô cell so với hình hay chữ trong word)
và chép từ word có sẵn vào Excel đang mở (chứ không phải tạo một excel mới khác excel đang mở).
Lần nữa, thật lòng cám ơn anh Batman1 nhiều
1. Tôi hỏi nhưng bạn không trả lời. Tuy nhiên tôi thấy mỗi tập tin word mà bạn đính kèm chỉ có 1 bảng. Ngoài ra với mỗi tập tin word chọn từ ComboBox bạn chỉ gán cho 1 sheet có tên từ TextBox mà code của tôi nhập vào mỗi sheet chỉ 1 bảng. Vậy tôi tự giả thiết là chỉ lấy từ mỗi word 1 bảng.

2. Nếu điều chỉnh độ cao cột cho chuẩn thì tôi định dùng DrawTextW (hàm API) để tính chiều cao cho text khi biết chiều rộng. Nhưng do bạn không câu nệ chuyện cao thấp nên tôi thôi.

3. Tập tin Excel luôn có 1 sheet tên là Sheet1. Không đổi tên và không xóa sheet này.

4. Code thực thi ở module riêng và tên là WordTableToExcel. Làm thế để bạn có thể tùy biến. Nếu một ngày đẹp trời bạn không muốn dùng Form nữa thì: code mở cửa sổ cho bạn chọn 1 hoặc nhiều tập tin word -> trong vòng lặp FOR với mỗi tập tin word được chọn thì code làm: tạo sheet mới có tên là *** (*** là tên cho sheet được tạo) -> gọi WordTableToExcel và cung cấp cho nó đường dẫn tới tập tin word hiện hành với tư cách là thông số 1, và *** với tư cách thông số 2

5. Tập tin hoàn chỉnh tôi đính kèm ở dưới. Tuy nhiên cách của huuthang_bd đơn giản hơn: word xuất ra trên đĩa tập tin MHTML -> Excel mở tập tin MHTML -> xóa tập tin MHTML. Khỏi phải nhọc công như tôi. :D
 

File đính kèm

Lần chỉnh sửa cuối:
1. Tôi hỏi nhưng bạn không trả lời. .......

5. Tập tin hoàn chỉnh tôi đính kèm ở dưới. Tuy nhiên cách của huuthang_bd đơn giản hơn: word xuất ra trên đĩa tập tin MHTML -> Excel mở tập tin MHTML -> xóa tập tin MHTML. Khỏi phải nhọc công như tôi. :D
Rất cám ơn anh Batman1
Bài anh viết rất tuyệt
Thật sự cám ơn anh.
Và cũng thật sự bối rối khi mình có trả lời câu hỏi anh rồi mà: ".. file word như thế nào thì vào y các ô cell trên sheet như thế đó ..."
là mình muốn trả lời khi anh viết:"..
- code giả thiết là tất cả các cột đều có cùng số dòng, và tất cả các dòng đều có cùng số cột. Không có chuyện 1 ô được chia (split) thành nhiều ô, hoặc nhiều ô được gộp thành 1. Phải như tập tin hiện thời của bạn...Là hoàn toàn chính xác
- mỗi ô bên Excel được định dạng Alignment Vertical là Top, với Wrap Text....Là hoàn toàn chính xác
- Chỉ có thể đọc được độ rộng mỗi cột của bảng trong Word. Và độ rộng mỗi cột bên Excel được thiết lập như bên Word....Là hoàn toàn chính xác
- Do không đọc được độ cao mỗi dòng (tôi nói về đọc trực tiếp từ Word) nên tôi thiết lập độ cao tất cả các dòng bên Excel bằng độ rộng lớn nhất từ các cột. Sau đó nếu độ cao của ảnh nào đó > độ cao của dòng chứa ảnh đó thì độ cao của riêng dòng đó được tăng bằng độ cao của ảnh.

Là hoàn toàn chính xác
.
Và khi mình trả lời anh biết ý mình:"..chép từ word có sẵn vào Excel đang mở (chứ không phải tạo một excel mới khác excel đang mở)"
là do khi anh đưa ra 2 phương án, 2 tình huống để viết VBA:
1. Mỗi tập tin Word có thể có > 1 bảng.
2. Mỗi tập tin Word chỉ chứa 1 ảnh.v.v...
vì mình không hiểu cách viết VBA cho việc "chép từ word có sẵn vào Excel đang mở (chứ không phải tạo một excel mới khác excel đang mở). " như mình mong muốn thì phải làm như thế nào, nên 2 tình huống này của anh, mình không thể nói gì không thể trả lời 2 tình huống anh nêu ra được, mà chỉ nêu ra là mình cần "chép từ word có sẵn vào Excel đang mở (chứ không phải tạo một excel mới khác excel đang mở" vậy thôi.
Mong anh hiểu dùm.
.
Lần nữa cám ơn anh nhiều
 
Web KT

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

Back
Top Bottom