Не работает ли Excel Shape.TextFrame.Characters.Insert в Excel 2007?

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

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

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

EDIT В моем конкретном примере код выше содержит что-то вроде With myWorksheet.Shapes(1), где фигура представляет собой текстовое поле. Внутри него уже есть текст, и мне нужно добавить к нему myTxt (string длиннее 255 символов). Этот код работал без проблем в Excel 2003. Я видел, что эта проблема упоминается в другом месте, но я ищу официальное заявление о ней из переполнения стека...


person Joel Goodwin    schedule 30.03.2011    source источник
comment
Не могли бы вы добавить блок With, частью которого это является? А объявление объекта? Помог бы.   -  person downwitch    schedule 05.04.2011
comment
@downwitch Добавлены подробности для уточнения.   -  person Joel Goodwin    schedule 08.04.2011


Ответы (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
person downwitch    schedule 11.04.2011
comment
Downwitch, только что проверил, действительно работает. У меня уже было решение, которое явно проверяло версию Excel, но это тоже хорошо. Мой первоначальный код был основан на статье базы знаний Microsoft, поэтому в 2007 году он больше не работал: support.microsoft.com/kb/105416 - person Joel Goodwin; 12.04.2011
comment
Большое спасибо, вы меня спасли! У меня была точно такая же проблема, как у Джоэла, и я не видел очевидного решения. И ваши комментарии о том, что non-existent member является виновником, точны. Как ни странно, мой код, очень похожий на код Джоэла, был взят из службы поддержки Microsoft, поэтому Я не ожидал никаких проблем в этой области. - person DaveU; 22.12.2014