Excel Shape.TextFrame.Characters.Insert не работает в Excel 2007? - PullRequest
2 голосов
/ 30 марта 2011

У меня есть этот фрагмент кода, который я использую в 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. Вставка не может быть вставлена ​​в конце поля, она имеет вставку в существующий символ. Так что .Characters(.Character.Count).Insert будет работать, хотя я не хочу этого делать.
  2. Он работает как перезапись, а не как вставка. Куда бы я ни применил команду «Вставить», она заменяет существующие символы. Таким образом, вставка в (.Character.Count) удалит последний символ.

Теперь я встроил логику для работы по-разному в зависимости от используемой версии Excel. Но я не мог найти ничего, касающегося этой проблемы. Это известная ошибка? Есть ли способ исправить это поведение?

(В связанной заметке я не могу установить .Characters(x,y).Font.Underline = True также.)

РЕДАКТИРОВАТЬ В моем конкретном примере приведенный выше код содержит что-то вроде With myWorksheet.Shapes(1), где фигура представляет собой текстовое поле. В нем уже есть текст, и мне нужно добавить myTxt (string длиннее 255 символов) к нему. Этот код работал без проблем в Excel 2003. Я видел эту проблему, упоминаемую в другом месте, но искал формальное заявление об этом из переполнения стека ...

1 Ответ

3 голосов
/ 11 апреля 2011

Я согласен, ваш код работает в 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
...