Board logo

標題: [發問] 讀取表格 [打印本頁]

作者: kannas    時間: 2010-11-28 16:27     標題: 讀取表格

本帖最後由 kannas 於 2010-12-2 21:35 編輯

請問如何用Excel 的VB,寫成讀取word的表格,
並把它轉變在Excel上面,格式要跟word上的一樣。
作者: et5323    時間: 2010-11-29 12:10

你可以参考下这里:
http://forum.twbts.com/viewthrea ... &page=1#pid9388

提问题最好有附件.
作者: kannas    時間: 2010-12-1 01:05

我指的是程式執行時,
會自動讀取指定路徑的word檔案,
並把檔案寫回Excel上面,
但我希望他的格式不會變。

有點像是
http://tw.myblog.yahoo.com/jw!_DIL5waFHwVKfL8odMZ4urti/article?mid=1617&prev=1572&next=1615&l=f&fid=16
這個的程式
但是我用這個弄,格式會變,雖然位子一樣,但格式卻沒了。
作者: kimbal    時間: 2010-12-2 22:06

我指的是程式執行時,
會自動讀取指定路徑的word檔案,
並把檔案寫回Excel上面,
但我希望他的格式不會變 ...
kannas 發表於 2010-12-1 01:05



   一個非常懶的方法
copy and paste....
  1. Sub dsa()
  2.        Dim Wd   'Word
  3.        Dim Dc   '文件
  4.        Dim Tb   '內表
  5.        Dim i, j    '定位
  6.    
  7.            Sheet1.UsedRange.EntireRow.Delete    'Excel Sheet1 清表
  8.            Set Wd = CreateObject("Word.Application")
  9.            Dim RgR As Range
  10.            Set Dc = Wd.Documents.Open("C:\temp\1.DOC ") '檔名
  11.            Wd.Visible = True
  12.            With Wd.Selection.Find
  13.                 .Text = "^l"
  14.                 .Replacement.Text = " "
  15.             End With
  16.             Wd.Selection.Find.Execute Replace:=2
  17.             With Wd.Selection.Find
  18.                 .Text = "^p"
  19.                 .Replacement.Text = " "
  20.             End With
  21.             Wd.Selection.Find.Execute Replace:=2
  22.            For Each Tb In Dc.tables
  23.                Set RgR = Sheet1.UsedRange.EntireRow.Offset(Sheet1.UsedRange.Rows.Count + 1, 0).Cells(1)
  24.                Tb.Range.Copy
  25.                RgR.Select
  26.                ActiveSheet.PasteSpecial Format:="HTML"
  27.            Next
  28.          
  29.            Wd.Quit
  30. End Sub
複製代碼

作者: kannas    時間: 2010-12-17 11:01

本帖最後由 kannas 於 2010-12-17 11:05 編輯

我的表格上有些格內有分行
我想讓他在Excel內只在一個格想用Chr來分行

上面那個程式他會更改到word的資料,變得每次都會問是否存word檔案

可以的話可以解釋每個程式的意思嗎?
因為我有些看不懂,我想了解每步驟的意思。
感謝。
作者: Hsieh    時間: 2010-12-17 15:52

本帖最後由 Hsieh 於 2010-12-17 15:54 編輯

回復 5# kannas
  1. Sub WriteWordTb()
  2. Dim Tb As Table, Ar()
  3. Set Wd = CreateObject("Word.Application") '創建WORD程式物件
  4. Cells.Clear '清空工作表內容
  5. With Wd '關於WORD程式物件
  6.   With .Documents.Open(ThisWorkbook.Path & "\1.doc") '開啟指定的檔案
  7.     For Each Tb In .tables 'doc文件中的每個Table
  8.     For i = 1 To Tb.Rows.Count
  9.         For j = 1 To Tb.Columns.Count
  10.            For s = 0 To Tb.Cell(i, j).Range.Sentences.Count - 1
  11.               ReDim Preserve Ar(s)
  12.               Ar(s) = Tb.Cell(i, j).Range.Sentences(s + 1)
  13.            Next
  14.          mystr = Join(Ar, Chr(10))
  15.         Cells(i, j) = mystr
  16.         Erase Ar
  17.         Next
  18.     Next
  19.     Next
  20.   End With
  21.   .Quit '關閉程式
  22. End With
  23. End Sub
複製代碼

作者: kannas    時間: 2010-12-17 19:55

回復 6# Hsieh


    這個程式無法執行耶
   它顯示編譯錯誤:  使用者自訂型態尚未定義
作者: Hsieh    時間: 2010-12-17 20:04

本帖最後由 Hsieh 於 2010-12-23 14:19 編輯

]回復 7# kannas


    須引用項目
MicroSoft Word 12.0 Object Library
[attach]4132[/attach]
或取消Tb變數宣告
  1. Sub WriteWordTb()
  2. Dim Ar()
  3. Set Wd = CreateObject("Word.Application") '創建WORD程式物件
  4. Cells.Clear '清空工作表內容
  5. With Wd '關於WORD程式物件
  6.   With .Documents.Open(ThisWorkbook.Path & "\1.doc") '開啟指定的檔案
  7.     For Each Tb In .tables 'doc文件中的每個Table
  8.     For i = 1 To Tb.Rows.Count
  9.         For j = 1 To Tb.Columns.Count
  10.            For s = 0 To Tb.Cell(i, j).Range.Sentences.Count - 1
  11.               ReDim Preserve Ar(s)
  12.               Ar(s) = Tb.Cell(i, j).Range.Sentences(s + 1)
  13.            Next
  14.          mystr = Join(Ar, Chr(10))
  15.         Cells(i, j) = mystr
  16.         Erase Ar
  17.         Next
  18.     Next
  19.     Next
  20.   End With
  21.   .Quit '關閉程式
  22. End With
  23. End Sub
複製代碼

作者: kannas    時間: 2010-12-20 22:39

回復 8# Hsieh


   請問我用上面那個程式後,因為有些表格內他的字數有點小多,
  用自動調整欄寬的話,整個表格就會破壞掉,變得很寬。
  像是有一串字,點下格子內他會顯示全部的字,如果沒點就只顯示表格大小所能顯示的字數,其他則不顯示,
  可以把它弄成像是自動換行嗎?
   讓表格看起來不會很奇怪?

   問了這麼多  真是麻煩各位了  謝謝!!!
作者: Hsieh    時間: 2010-12-20 23:17

本帖最後由 Hsieh 於 2010-12-23 14:05 編輯

所以,妳並非要讓文字依據WORD表格內容換行
那就設定EXCEL自動換列
  1. Sub WriteWordTb()
  2. Dim Tb As Table, Ar()
  3. Set Wd = CreateObject("Word.Application") '創建WORD程式物件
  4. Cells.Clear '清空工作表內容
  5. With Wd '關於WORD程式物件
  6.   With .Documents.Open(ThisWorkbook.Path & "\1.doc") '開啟指定的檔案
  7.     For Each Tb In .tables 'doc文件中的每個Table
  8.     For i = 1 To Tb.Rows.Count
  9.         For j = 1 To Tb.Columns.Count
  10.            For s = 0 To Tb.Cell(i, j).Range.Sentences.Count - 1
  11.               ReDim Preserve Ar(s)
  12.               Ar(s) = Tb.Cell(i, j).Range.Sentences(s + 1)
  13.            Next
  14.          mystr = Join(Ar, Chr(10))
  15.         With Cells(i, j)
  16.         .Value = mystr
  17.         .WrapText = True
  18.         End With
  19.         Erase Ar
  20.         Next
  21.     Next
  22.     Next
  23.   End With
  24.   .Quit '關閉程式
  25. End With
  26. End Sub
複製代碼

作者: kannas    時間: 2010-12-23 01:33

回復 10# Hsieh


請問Join的程式有辦法用And來寫嗎?
我聽人說這個比較簡單,Join是比較高階的用法
我不明白用And寫的話,是要哪些條件連結哪些條件??

               *ReDim Preserve Ar(s)
               *Ar(s) = Tb.Cell(i, j).Range.Sentences(s + 1)
               
            Next
            
         *mystr = Join(Ar, Chr(10))
         *.Value = mystr
         *.WrapText = True
         
         End With
         
         Erase Ar


還有可以解釋上面有*的程式意思嗎?
我雖然大概知道意思,但有人問我時,我真的無法達出來。


麻煩您了  謝謝!
作者: 老夏    時間: 2010-12-23 11:19

捨簡而就繁

[attach]4192[/attach]
作者: Hsieh    時間: 2010-12-23 14:29

回復 11# kannas
老夏前輩的物件包裝方法是妳該學習方向
http://forum.twbts.com/viewthread.php?tid=782&extra=&highlight=word&page=1
參考之前的討論,你對物件聯結的方法會有較多的認識

單就VBA語法討論,你所提到的join方法
這是字串的連結函數,你可參考VBA說明
就能知道此函數用法及用途
你要用&代替JOIN函數當然也行
那就是在取得表格內的每一句字串,
用mystr=mystr & chr(10) & Tb.Cell(i, j).Range.Sentences(s + 1)
  1. Sub WriteWordTb()
  2. Dim Tb As Table, Ar()
  3. Set Wd = CreateObject("Word.Application") '創建WORD程式物件
  4. Cells.Clear '清空工作表內容
  5. With Wd '關於WORD程式物件
  6.   With .Documents.Open(ThisWorkbook.Path & "\1.doc") '開啟指定的檔案
  7.     For Each Tb In .tables 'doc文件中的每個Table
  8.     For i = 1 To Tb.Rows.Count
  9.         For j = 1 To Tb.Columns.Count
  10.            For s = 0 To Tb.Cell(i, j).Range.Sentences.Count - 1
  11.                 If mystr="" Then
  12.                 mystr=Tb.Cell(i, j).Range.Sentences(s + 1)
  13.                 Else
  14.                mystr= mystr & chr(10) & Tb.Cell(i, j).Range.Sentences(s + 1) '連接每句
  15.                End If
  16.            Next
  17.         With Cells(i, j)
  18.         .Value = mystr '儲存格的值
  19.          mystr=""   '把變數歸零
  20.         .WrapText = True  '儲存格設定成自動換行
  21.         End With
  22.         Next
  23.     Next
  24.     Next
  25.   End With
  26.   .Quit '關閉程式
  27. End With
  28. End Sub
複製代碼

作者: FAlonso    時間: 2010-12-25 19:14


為什麼H大可以有這些指令,但我沒有?


Uploaded with ImageShack.us




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)