【问题标题】:Is Excel Shape.TextFrame.Characters.Insert broken on Excel 2007?Excel Shape.TextFrame.Characters.Insert 在 Excel 2007 上是否损坏?
【发布时间】:2011-07-25 22:04:16
【问题描述】:

我有这段代码,我一直在使用 Excel 2003,它模仿了不久前 Microsoft 网站上给出的解决方案。如何向形状的文本框添加超过 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. Insert 不能在字段末尾插入,它在现有字符处插入。所以.Characters(.Character.Count).Insert 会起作用,尽管这不是我想做的。
  2. 它作为覆盖操作,而不是插入操作。无论我在哪里应用 Insert 它都会覆盖现有字符。因此,(.Character.Count) 处的插入将删除最后一个字符。

现在我已经内置了逻辑,可以根据您使用的 Excel 版本进行不同的操作。但我找不到与此问题相关的任何内容。这是一个已知的错误吗?有没有办法解决这种行为?

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

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

【问题讨论】:

  • 你能添加 With 块吗?以及对象的声明?会有所帮助。
  • @downwitch 添加了详细说明。

标签: vba excel excel-2007 excel-2003


【解决方案1】:

我同意,您的代码在 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

【讨论】:

  • Downwitch,刚刚测试过,确实有效。我已经有一个明确检查 Excel 版本的解决方案,但这也很好。我的原始代码是基于微软自己的一篇知识库文章,因此我被淘汰了它在 2007 年不再工作:support.microsoft.com/kb/105416
  • 非常感谢,你救了我!我遇到了和 Joel 完全相同的问题,并且看不到明显的解决方案。你的 cmets 关于non-existent member 是罪魁祸首是正确的。奇怪的是,我的代码与 Joel 的代码非常相似,取自 Microsoft support,所以我没想到该区域会出现任何问题。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多