У меня проблема с этим кодом, он должен пройти через все формы на всех слайдах и заменить их, но в определенный момент он просто вылетает. Сначала вам предлагается вставить слово, которое вы хотите найти, а затем слово, которым вы хотите его заменить. Как только вы вставляете это, он вылетает, иногда несколько слов заменяют их, а другие нет. Кто-нибудь знает, в чем проблема? Код следующий:
Sub Reemplazar()
Dim sld As Slide
Dim shp As Shape
Dim ShpTxt As TextRange
Dim TmpTxt As TextRange
Dim Findword As String
Dim ReplaceWord As String
Findword = InputBox("Ingrese palabra que se quiere reemplazar")
ReplaceWord = InputBox("Ingrese palabra por la que se va a reemplazar")
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
Set ShpTxt = shp.TextFrame.TextRange
If ShpTxt <> "" Then
Set ShpTxt = shp.TextFrame.TextRange
Set TmpTxt = ShpTxt.Replace( _
FindWhat:=Findword, _
Replacewhat:=ReplaceWord, _
WholeWords:=False)
Do While Not TmpTxt Is Nothing
Set ShpTxt = ShpTxt.Characters(TmpTxt.Start + TmpTxt.Length, ShpTxt.Length)
Set TmpTxt = ShpTxt.Replace( _
FindWhat:=Findword, _
Replacewhat:=ReplaceWord, _
WholeWords:=False)
Loop
End If
Next shp
Next sld
End Sub
Программа останавливается и запрашивает отладку, выдавая сообщение «Ошибка '-2147024809 (80070057)» и выделяя строку «Set ShpTxt = shp.TextFrame.TextRange».
Он останавливается и запрашивает отладку, выдавая сообщение «Ошибка '-2147024809 (80070057)» и выделяя эту строку «Set ShpTxt = shp.TextFrame.TextRange»
Предоставляет ли он больше информации об ошибке? Кажется, что он брошен, когда форма заблокирована / защищена или лист (в случае excel не уверен в powerpoint и защите) защищен.
Кроме номера ошибки и «Указанное значение вне допустимого диапазона», никакой другой информации
Так что, возможно, вы попали в фигуру, в которой отсутствует текстовый фрейм, что вполне разумно, так как они есть не у всех фигур (а то, что вы можете не осознавать, сформировано в вашей PowerPoint, на самом деле является формами). Хотя обычно лучше не делать этого, в этом случае я думаю, что вполне разумно, прежде чем начинать зацикливание, установить On Error Resume Next
и позволить этой штуке летать. Есть и другие более сложные способы обойти это, но в этом случае я бы, вероятно, не стал беспокоиться.
Это сработало отлично, спасибо вам большое!
Я рад, что помог тебе справиться с ошибкой. Одна вещь, о которой я не знал, - это метод HasTextFrame
для объекта формы powerpoint (насколько мне известно, аналогичного метода в Excel, который я обычно использую, нет). Пожалуйста, рассмотрите возможность использования решения @SteveRindsberg ниже, поскольку On Error Resume Next
может маскировать другие ошибки. Опять же, я думаю, что On Error Resume Next
- это нормальное решение в этом случае, но если бы это был мой код, я бы определенно использовал этот метод HasTextFrame
, так как он намного чище.
@JNevill Полностью согласен. В Excel, похоже, нет некоторых методов / свойств формы, которые есть в PPT, поэтому я подозреваю, что вам придется полагаться на перехват ошибок, чтобы сделать то же самое в Excel.
Прежде чем пытаться выполнить замену, убедитесь, что эта фигура МОЖЕТ содержать текст, и если да, то ДЕЙСТВИТЕЛЬНО хранит текст:
If osh.HasTextFrame Then
If osh.TextFrame.HasText Then
' NOW do your replacements
End If
End If
Что значит "Авария". Наступает ли момент, когда он выдает ошибку и спрашивает, хотите ли вы отладить, или ваше приложение PowerPoint действительно вылетает без предупреждения?