2016-01-19 28 views
1

我不得不solve a little problem today(即PDF轉換器已經加入到每一個細胞一個MS Word文檔中修剪尾隨空白)工作,我很快發現,這種使用是不可能的在每個單元結束TRIM()不表

Sub TrimCellSpaces() 
    Dim itable As Table 
    Dim C As Cell 
    For Each itable In ThisDocument.Tables 
     For Each C In itable.Range.Cells 
      C.Range.Text = Trim(C.Range.Text) 
     Next 
    Next 
End Sub 

我很驚訝,這不僅無法刪除尾隨空白,它甚至還添加段落標記:標準Word界面,所以寫了一個小VBA腳本。所以我嘗試了一個正則表達式的方法:

Sub TrimCellSpaces() 
    Dim myRE As New RegExp 
    Dim itable As Table 
    Dim C As Cell 
    myRE.Pattern = "\s+$" 
    For Each itable In ThisDocument.Tables 
     For Each C In itable.Range.Cells 
      With myRE 
       C.Range.Text = .Replace(C.Range.Text, "") 
      End With 
     Next 
    Next 
End Sub 

相同的結果。我添加了一個斷點,將C.Range.Text(替換前)的值複製到十六進制編輯器中,並發現它以十六進制序列0D 0D 0707是ASCII Bell字符(!))結束。

我改變了正則表達式來\s+(?!.*\w),和腳本完美無缺。替換操作後,C.Range.Text的值僅在0D 07(少一個0D)處結束。

我也有一個新創建的表試過,沒有一個通過Word的PDF進口商產生的 - 相同的結果。

這是怎麼回事? Word是否使用0D 0D 07作爲「細胞末端」標記?或者是0D 07?爲什麼\s+只刪除一個0D

+0

結尾字符不是空格字符 - 它可能只是出現這種方式,因爲您的系統無法正確顯示它。 'Trim $()'只會刪除字符串的* start *和* end *處的空白字符 - 如果鈴聲字符出現在字符串的末尾,那麼'Trim $()'不起作用。 –

+0

是的,當然 - 我的問題是*爲什麼*首先有一個響鈴字符。創建一個新的Word文檔,創建一個表格,在該表格中輸入任何值並通過VBA獲取該單元格的內容,最後有'0D0D07'。爲什麼? –

+0

aaah,我明白了 - 您的問題閱讀的方式我認爲PDF軟件對響鈴字符負責,並且您想知道爲什麼沒有將空白字符刪除。道歉! –

回答

1

在ANSI 13 + 07 ANSI字結尾的所有細胞 - 這是「電池的末端」標誌(有點「陽光」,如果你有非打印字符在UI通的顯示)。 Word使用它來構建表格並存儲與單元相關的信息。

這是不可能從表格單元格中刪除此字符組合 - Word需要它。如果你能刪除它,桌子就會破裂。所以Word只會阻止你刪除它們。

如果您需要的表格單元格的內容,你基本上需要檢查的最後兩個字符的字符代碼,並使用字符串之前刪除他們的文本字符串。您需要檢查兩個字符,因爲Microsoft改變了文本從幾個版本的單元格返回的方式。有時它只返回其中一個字符,有時也會返回兩個字符,具體取決於您如何獲取信息以及涉及哪個版本的Word。

+0

這解釋了它 - 我的正則表達式可能刪除了兩個'0D',並且Word取而代之以保持單元格「合法」。 「Trim()」在單元格末尾添加了一個段落標記,但仍然很奇怪。有沒有關於這方面的官方文件? –

+0

我確定有,但快速搜索並沒有像我的解釋那樣明確。幾十年(超過25年)的情況就是如此,所以我想象清楚的文檔與其他WordBasic一起被埋沒。我可以指向https://msdn.microsoft.com/en-us/library/dd909100(v=office.12).aspx(搜索術語:單元格標記)我想它可能會在ECMA文檔中提及爲Open XML文件格式。 –