Excel 2007上的Excel Shape.TextFrame.Characters.Insert是否已损坏?

时间:2011-03-30 08:17:30

标签: excel vba excel-vba excel-2007 excel-2003

我已经使用了Excel 2003这段代码,它模仿了微软网站上的解决方案。如何在形状的文本框架中添加超过255个字符:

For i = 0 To Int(Len(myTxt) / 255)
    .Characters(.Characters.Count + 1).Insert Mid(myTxt, (i * 255) + 1, 255)
Next i

这在Excel 2007下无效。有两个问题。

  1. 插入不能插入字段的末尾,它插入现有字符。所以.Characters(.Character.Count).Insert会起作用,即使这不是我想做的事。
  2. 它作为覆盖而不是插入操作。无论我在哪里应用Insert,它都会覆盖现有的字符。因此,(.Character.Count)处的插入将删除最终字符。
  3. 现在我已经内置了逻辑,可以根据您使用的Excel版本进行不同的操作。但我找不到与此问题有关的任何内容。这是一个已知的bug吗?有没有办法解决这个问题?

    (在相关的说明中,我也无法设置.Characters(x,y).Font.Underline = True。)

    编辑在我的特定示例中,上面的代码包含类似With myWorksheet.Shapes(1)的内容,其中形状是文本框。它内部已有文字,我需要将myTxt(长度超过255个字符的string)附加到其中。这段代码在Excel 2003上没有问题。我在其他地方看到过这个问题,但是从Stack Overflow中寻找一个正式的声明......

1 个答案:

答案 0 :(得分:3)

我同意,您的代码在2003年有效,但在2007年失败。但令我惊讶的是,它完全有效。试图在.Characters集合中引用“再一个”字符会抛出错误 - 如果你在上面划分你的行,我认为你在第1点指出,你会发现它具体是.Characters(.Characters.Count + 1)。这不是失败的方法,它是不存在的成员,这对我来说似乎是正确的。

这是在2003年和2007年都能满足您需求的代码。

Public Sub Loop_InsertTest()

    Dim MyWks   As Excel.Worksheet
    Dim MyTxt   As Shape
    Dim MyFrme  As TextFrame
    Dim i       As Long

    Const StartText As String = "This is a very, very, very, very, very, very, very, very, very, very, very, " _
                              & "very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, " _
                              & "very, very, very, very, very, very, very, very, very, very, long piece of text."
    Const MaxIterations As Long = 1000

    Debug.Print Len(StartText)

    Set MyWks = ThisWorkbook.Worksheets(1)
    Set MyTxt = MyWks.Shapes.AddTextbox(msoTextOrientationHorizontal, 10, 10, 1000, 1000)
    Set MyFrme = MyTxt.TextFrame

    'Debug.Print TypeName(MyTxt), MyTxt.Name'
    MyFrme.Characters.Text = StartText
    MyFrme.AutoSize = True

    For i = 1 To MaxIterations
        Insert_ThisText MyFrme, " Now it's even longer."
    Next i

End Sub

Private Sub Insert_ThisText(pFrme As TextFrame, _
                            pstrText As String)
    Dim strRight    As String
    Dim i           As Long

    With pFrme
        For i = 0 To Int(Len(pstrText) / 254)
            strRight = .Characters(.Characters.Count).Text
            .Characters(.Characters.Count).Insert strRight & Mid(pstrText, (i * 254) + 1, 254)
            'Debug.Print Len(pstrText), .Characters.Count'
        Next i
    End With

End Sub