Вставка специального msoClipboardFormatPlainText создает нежелательный разрыв строки на Mac

#vba #powerpoint #microsoft365

#vba #powerpoint #microsoft365

Вопрос:

Я пытаюсь заставить свои макросы vba для PowerPoint работать и на Mac. Многие из них делают это, но здесь или там что-то идет не так.

Один макрос предназначен для копирования текста из одной выбранной фигуры в другие выбранные фигуры без форматирования.

Я использую

 .TextFrame2.TextRange.PasteSpecial msoClipboardFormatPlainText
  

Макрос работает так, как должен на компьютерах с Windows, и так же работает на Mac, только с одной маленькой проблемой: он создает нежелательный разрыв строки в конце текста в целевых фигурах. Кто-нибудь знает способ избежать этого?

Опция

 .TextFrame2.TextRange.PasteSpecial msoClipboardFormatRTF
  

не создает этот разрыв, но сохраняет цвет шрифта исходной формы и такой же, чтобы

 .TextFrame2.TextRange.PasteSpecial msoClipboardFormatNative
  

который сохраняет цвет шрифта и размер шрифта исходной формы. Опция открытого текста наиболее близка к моей цели на данный момент. Но, конечно, я хотел бы иметь идеальное решение.

Приветствуется любая подсказка. Спасибо!

Редактировать: это полный код. После предложения Джона я добавил строку, начинающуюся с .text , но это не имело никакого значения на моем Mac.

 Sub DubTextOnly()

    Dim shp As Shape
    Dim shp1 As Shape
    Dim i As Integer

    On Error GoTo err

    If ActiveWindow.Selection.ShapeRange.Count < 2 Then
        MsgBox "Please select at least two shapes (no tables)"
        Exit Sub
    End If
    
Set shp1 = ActiveWindow.Selection.ShapeRange(1)

shp1.TextFrame2.TextRange.Copy
DoEvents
shp1.Tags.Add "Deselect", "yes"

    For Each shp In ActiveWindow.Selection.ShapeRange
        If shp.Tags("Deselect") = "yes" Then
        Else
        With shp
        With .TextFrame
            For i = 1 To 9
            With .Ruler
                .Levels(i).FirstMargin = 0
                .Levels(i).LeftMargin = 0
            End With
            Next
            End With
            With .TextFrame2
            With .TextRange
                .ParagraphFormat.Bullet.Type = ppBulletNone
                .PasteSpecial msoClipboardFormatPlainText
                .Text = Replace(.Text, vbCr amp; vbCr, vbCr)
            End With
        End With
        End With
        DoEvents
        End If
    Next shp
    For Each shp In ActiveWindow.Selection.ShapeRange
        If shp.Tags("Deselect") = "yes" Then
        shp.Tags.Delete "Deselect"
        End If
    Next shp
    Exit Sub
    
err:
    MsgBox "Please select at least two shapes (no tables)"
    
End Sub
  

Ответ №1:

Вы видите эффект разных окончаний строк в macOS и Windows. Windows использует возврат каретки плюс перевод строки ( vbCrLf в VBA), в то время как macOS использует только перевод строки vbLf . При вставке в PowerPoint программа переводит оба символа в отдельные абзацы, при этом второй символ остается пустым.

Попробуйте этот код:

 Sub PasteTest()
    With ActivePresentation.Slides(1).Shapes(1).TextFrame2.TextRange
        .PasteSpecial msoClipboardFormatPlainText
        .Text = Replace(.Text, vbCr amp; vbCr, vbCr)
    End With
End Sub
  

Это не должно влиять на операции в Windows, поскольку двойные возвраты там не создаются.

Комментарии:

1. К сожалению, это не решение. Как вы и предсказывали, это не влияет на работу в Windows, но и на Mac разницы нет. Разрыв все еще появляется. Большое вам спасибо за попытку, она показалась мне очень многообещающей.

2. Я тестирую весь код перед публикацией, и этот макрос удалит двойные возвраты. У вас может быть другая комбинация символов, но, не зная, что это такое, я не могу предложить исправление.

3. Я отредактировал свою исходную публикацию, чтобы показать весь код. Надеюсь, это поможет определить, почему это работает на вашем Mac, но не на моем. Кстати. на компьютере установлен Microsoft 365.