none
請問一個VB 2005的物件Clipboard的語法? RRS feed

  • 問題

  • 請問下列程式,發生"TextDataFormat.Html"未宣告的錯誤訊息,不知如何修改?謝謝!

        Public Function GetDocContent(ByVal strFile As String) As String
            Dim wdObj As Object ' 宣告
            Dim TMP As String
            wdObj = CreateObject("Word.Application") ' 個體化Word 物件
            With wdObj
                .Documents.Open(strFile) ' 開啟Word 檔

                TMP = .ActiveDocument.Content                            ''讀出Word的內容
                My.Computer.Clipboard.SetText(TMP, TextDataFormat.Html)  ''將Word的內容以Html格式複製到剪貼簿裡
                GetDocContent = My.Computer.Clipboard.GetText            ''從剪貼簿裡取出Html格式的

                ' 底下關掉Word 檔, 釋放資源
                On Error Resume Next
                .ActiveDocument.Close()
                .ActiveWindow.Close()
                .Quit()
            End With
            wdObj = Nothing
        End Function

    2006年11月23日 下午 02:26

解答

  • ...

    TMP 是 word 物件,並非是 html 格式。物件本身不能直接送到剪貼簿。

    而 Office 所有處理剪貼簿的方式是採用延後提出的方式,只向剪貼簿提出 Office 可支援的格式,並不真的把資料送到剪貼簿,等到收到要求貼上指定格式時,才由剪貼簿向 Office 要求資料,得到後轉提供給要求端。

    作法上應該是在 Word 物件內用 Select 方法,再用 wdApp.Selection.Copy 送到剪貼簿,再由 VB2005 探詢是否有 HTML 格式,若有,才能從剪貼簿取得 HTML 格式。

    註:部份物件支援 Copy ,不用透過 Selection ,但是要查一下線上手冊。

    詳細相關說明均可在 http://msdn.microsoft.com/library/ 查得。

    2006年11月23日 下午 03:35
    版主

所有回覆

  • ...

    TMP 是 word 物件,並非是 html 格式。物件本身不能直接送到剪貼簿。

    而 Office 所有處理剪貼簿的方式是採用延後提出的方式,只向剪貼簿提出 Office 可支援的格式,並不真的把資料送到剪貼簿,等到收到要求貼上指定格式時,才由剪貼簿向 Office 要求資料,得到後轉提供給要求端。

    作法上應該是在 Word 物件內用 Select 方法,再用 wdApp.Selection.Copy 送到剪貼簿,再由 VB2005 探詢是否有 HTML 格式,若有,才能從剪貼簿取得 HTML 格式。

    註:部份物件支援 Copy ,不用透過 Selection ,但是要查一下線上手冊。

    詳細相關說明均可在 http://msdn.microsoft.com/library/ 查得。

    2006年11月23日 下午 03:35
    版主
  • 謝謝您的指正,看了您的說明,始知自己才疏學淺,再次感謝您!
    已經花了一個多月,還是被這個問題搞得昏頭轉向,我對VB完全不懂,買了兩本VB2005的書,看了也是一頭霧水,老闆又一再催促,實在令人氣餒! 懇求哪問位先進能幫我修改一下上述程式,讓我能『從一個WORD檔案(.DOC)中,讀出其全部內容(內含數學方程式),然後能將這些內容顯示在網頁上』.
    2006年11月23日 下午 04:17
  • 這個前面大概你發起的討論緒都有這樣的討論了。

    你可以把 Word 檔利用 SaveAs 另存新檔的方式,存成 HTML 格式,再去分析檔案與輸出即可。

    基本上在 ASP.NET 內最好不要操控 Automation ,極有可能釋放不掉,所以最好是離線做,離線作可以寫一個小的 Window Form 程式來操控 Automation 。

    2006年11月24日 上午 12:51
    版主
  • 謝謝您的回應!

    我有個疑惑?事實上,上列的程式碼是演化自下列程式碼,這個副程式(GetDocContent)可以正常執行,它是利用GetDocContent = .ActiveDocument.Content,把資料存如入變數GetDocContent,而此變數的資料型態為String,既然如此,在上列程式碼中,我利用TMP = .ActiveDocument.Content,把資料存如入變數TMP中,而變數TMP也宣告為String,為何就不行?
    ---------------------------------------------------------
    Public Function GetDocContent(strFile As String) As String
        Dim wdObj As Object ' 宣告
        Set wdObj = CreateObject("Word.Application") ' 個體化 Word 物件
        With wdObj
            .Documents.Open strFile ' 開啟 Word 檔
            GetDocContent = .ActiveDocument.Content ' 讀出 Word 內容囉
            ' 底下關掉 Word 檔 , 釋放資源
            On Error Resume Next
            .ActiveDocument.Close
            .ActiveWindow.Close
            .Quit
        End With
        Set wdObj = Nothing
    End Function
    ---------------------------------------------------------

     

    2006年11月24日 上午 03:28
  • 你原先的原始碼我沒有很仔細看。

    你可以參考 Word VBA 線上手冊:

    mk:@MSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1028\vbawd10.chm::/html/woproContent1.htm

    Content 屬性

    請參閱套用至範例特定

    回一個 Range 物件,代表主控文件的本文 (本文:包含的文字範圍與文件中其他文字區域有所不同的文件區域。例如,如果文件包括本文、註腳及標題,則它包含主要本文、註腳本文及標題本文。)。唯讀。


    並非傳回 String 型別。

    但是在 VB6 下有很明確的預設型別,當在 VB6 下:

    Set xxx = wdDoc.Content 會傳回 Range 物件

    xxx = wdDoc.Content 會傳回預設屬性,若預設屬性為 String ,則傳回該內容。

    在 VBNET 下沒有 Set 了,除非測過,否則我不敢說到底是 Range 物件還是該物件下的預設屬性。

    你可以先用 Window Form 模式進行開發測試,錯誤行會以黃色反白,請把該行明確指出。此時,把滑鼠游標移到變數上方,會跳出該變數的內容,請把變數內容簡單抄下來,或用即時運算視窗,輸入 ? 變數,用剪貼方式貼上版面,以利後續討論。

    2006年11月24日 上午 05:31
    版主