2011-05-04 156 views
0

與我一起散步。刪除Excel單元格格式文本中的標籤

我已經建立了一個Access應用程序在我公司的一個內部項目管理數據。此應用程序的功能之一是查詢數據庫,然後將查詢輸出到Excel電子表格,然後將電子表格格式化爲規格。

其中一個輸出的細胞是從所述數據庫中的富文本備註字段大量文本的。當富文本發送到Excel它承載的HTML標籤表明大膽斜體,因此對於輸出我要補充的格式化和刪除標記。

這是我需要格式化文本的示例(這段文字是在一個單元格):

For each participant, record 1 effort per lesson delivered 

    • Time Spent = # minutes spent on lesson 

<strong>OR</strong> 
For each participant, record 1 effort per month 

    • Time Spent = total # minutes spent on lessons that month 

    <strong>Note:</strong> Recording 1 effort per lesson is recommended but not  required 
<strong>Note:</strong> Use groups function in ABC when appropriate (see <u>Working With  Groups</u> in ABC document library on the ABC portal) 

我有一個三個整潔的小遞歸函數來格式化文本,這裏是加粗功能:

Function BoldCharacters(rng As Range, Optional ByVal chrStart As Long) 
'This will find all the "<strong></strong>" tags and bold the text in between. 
Dim tagL As Integer 
tagL = 8 
rng.Select 

If chrStart = 0 Then chrStart = 1 

b1 = InStr(chrStart, ActiveCell.Value, "<strong>") + tagL 
    If b1 = tagL Then Exit Function 
b2 = InStr(b1, ActiveCell.Value, "</strong>") 

ActiveCell.Characters(Start:=b1, Length:=b2 - b1).Font.Bold = True 

'Remove the tags 
'ActiveCell.Characters(Start:=1, Length:=1).Delete 
'ActiveCell.Characters(Start:=b2 - tagL, Length:=tagL + 1).Delete 

'Recursion to get all the bolding done in the cell 
Call BoldCharacters(ActiveCell, b2 + tagL + 1) 

End Function 

現在是這個問題。這很好地格式化文本。但「ActiveCell.Characters.Delete」的方法,當我嘗試使用它,因爲單元格中包含超過255個字符刪除標籤失敗。所以我不能使用刪除方法。

當我這樣做:

With xlApp.Selection 
    .Replace what:="<strong>", replacement:="" 

的標記都刪除,但格式化全部被毀!那麼有什麼意義!?

我在尋找我的格式化文本和刪除標記的方式。我正在考慮把大量文本和'分塊'到許多單元格中,處理格式化和重新組裝,但這聽起來很困難,容易出錯,甚至可能不起作用。

任何想法!?

謝謝!

回答

1

您可能希望將數據導出到Excel之前刪除的格式。在刪除格式的同時,將格式信息(位置,長度,樣式)存儲到數據結構中。導出「純文本」數據後,您可以遍歷結構並在Excel中應用格式。這可能是一個耗時的過程,具體取決於您計劃在給定時間輸出多少條記錄,但它會消除Excel施加的限制。

+0

我認爲這是我現在領導的方向。我將不得不創建一些數據結構來描述在刪除標籤之前格式必須去的位置。 – Jesse 2011-05-05 15:56:19

0

如果這是很好的HTML(即它一直關閉標籤),那麼你可以使用正則表達式。

Dim data As String 
data = "For each participant, record 1 effort per lesson delivered  • Time Spent = # minutes spent on lesson <strong>OR</strong> For each participant, record 1 effort per month  • Time Spent = total # minutes spent on lessons that month  <strong>Note:</strong> Recording 1 effort per lesson is recommended but not  required <strong>Note:</strong> Use groups function in ABC when appropriate (see <u>Working With  Groups</u> in ABC document library on the ABC portal)" 
Dim r As New RegExp 
r.Pattern = "<(.|\n)*?>" 
r.Global = True 
Debug.Print r.Replace(data, "") 

要使用RegExp對象,設置爲微軟的VBScript正則表達式5.5參考。

心連心

+0

我的錯,我沒有注意到的要求格式化文本太。抱歉。 – oharab 2011-05-04 17:56:41

0

東西沿着這些路線可能是有用的:

Sub DoFormat(rng As Range) 
    Dim DataObj As New MSForms.DataObject 
    Dim s As String, c As Range 

    For Each c In rng.Cells 
     s = "<html>" & Replace(c.Value, " ", "&nbsp;") & "</html>" 
     DataObj.SetText s 
     DataObj.PutInClipboard 
     c.Parent.Paste Destination:=c 
    Next c 

End Sub 

你需要一提到「微軟窗體2.0對象庫」