三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

TextRange.Replaceメソッド テキストボックスに標準関数Replace関数で置換した文字をTextに戻すと装飾が外れてしまう

TextRange.Textで箇条書き や 色の情報が消えて困ってます。
文字列を置換処理後、TextFrame.TextRange.Text = "置換後文字列"と単純に文字をセットすると
箇条書き や 色の情報が消えてしまう。
#PowerPointVBA #TextBox #Replace #デバッグ
www.youtube.com
https://www.youtube.com/watch?v=VR1V18qbZn8
目次
00:00 1.不具合の再現 TextFrame.TextRange.Text再代入をチェックする
01:55 実行結果を見せて、不具合の説明
03:28 2.TextRange.Replace メソッドがあるので、これを使うテスト
06:44 3.ReplaceALLみたいなコマンドを探せなかったのでループで回してみた
12:06 4.おわりの挨拶


1.不具合の再現 TextFrame.TextRange.Text再代入をチェックする
https://youtu.be/VR1V18qbZn8?t=112

単純に

    Dim ppShp As PowerPoint.Shape  'シェイプ
    Set ppShp = objSlide.Shapes("TextBox 2") 'テストはTextBox 2固定でテスト

    Dim strWORK As String
    Const sFIND = "パソコン"   '探す文字列
    Const sREPLACE = "PC"      '置き換える文字列

    strWORK = ppShp.TextFrame.TextRange.Text
    
    '単純にVBA replace関数で置き換える
    strWORK = Replace(strWORK, sFIND, sREPLACE)
    
    'Shapes("TextBox 2")へ戻すセットする
    ppShp.TextFrame.TextRange.Text = strWORK

を実行すると、

あら不思議、箇条書きや色がリセットされてしまう?

2.TextRange.Replace メソッドがあるので、これを使うテスト
https://www.youtube.com/watch?v=VR1V18qbZn8&t=208s

色とか、箇条書きが消えるのは、カンベン。
文字列を置き換えるメソッドを探すと

TextRange.Replace メソッド (PowerPoint)
https://learn.microsoft.com/ja-jp/office/vba/api/powerpoint.textrange.replace
learn.microsoft.com
↑が、見つかったので、これを使用してみます。



枠外:隙あれば自分語り、↑すぐ、みつかった感じで書いてますが、
初めの計画は、Findで探して選択状態にして、
SelectionのRangeから攻めようとしたら、
辞書の隣に探していた言葉じゃないけど、
TextRange.Replace メソッド が たまたま、見つかりました。
※あぶなかったぁ、Findで選択状態にしてSelectionを操作とか、別方向に行きそうだった。

と、解説が別方向に行ったところで、

話を元に戻して、

    Dim ppShp As PowerPoint.Shape  'シェイプ
    Set ppShp = objSlide.Shapes("TextBox 2") 'テストはTextBox 2固定でテスト

    Dim strWORK As String
    Const sFIND = "パソコン"   '探す文字列
    Const sREPLACE = "PC"      '置き換える文字列
    
    Dim ppTextRange As PowerPoint.TextRange
    Set ppTextRange = ppShp.TextFrame.TextRange
    
    ppTextRange.Replace sFIND, sREPLACE

と、
.Replace で簡単に置き換えすることができました。
※変数に入れて使っていますが、
ppShp.TextFrame.TextRange.Replace sFIND, sREPLACE
で、OK、イヤ長さ気にしなきゃ
objSlide.Shapes("TextBox 2").TextFrame.TextRange.Replace sFIND, sREPLACE
でしょ。

好きな書き方で、使ってみてください。


3.ReplaceALLみたいなコマンドを探せなかったのでループで回してみた
https://www.youtube.com/watch?v=VR1V18qbZn8&t=404s

全てを置換する。って感じのパラメーターがありそうなんだけど、
探せなかったので、
ループで回してみた。

TextRange.Replaceが結果を返すので、

    '初回 ループを一回以上回したかったので、そのまま、TextRangeを代入する
    Set ppTextRange = ppShp.TextFrame.TextRange
    
    '置換結果がある間、ループする
    While Not (ppTextRange Is Nothing)  'トリッキーなループだけど
        '置換処理の実行
        Set ppTextRange = ppShp.TextFrame.TextRange.Replace(sFIND, sREPLACE)
        'なんかバカっぽいけど、↑これで、結果がNothingならループを抜けるので
    Wend

みたいにして、繰り返してみた。


4.おわりの挨拶
https://www.youtube.com/watch?v=VR1V18qbZn8&t=726s

テキストの置き換え処理で、色などの装飾が外れてしまったら、
試してみてください。

もっと、良い方法がありそうだなぁ・・と思いつつ、失礼します。
(※文章全体じゃなかった、パワポならスライド全体に置換処理を発行できたりして・・・)

'動画内で、ループを思い付きで調整したパターン
'確認テスト用 TextRange.Replace ができなくなるまでループテスト
'TextBox 2 の文章を変えてみる
Sub 置換テスト004_TextRange_Replaceをループを調整()
    
    Dim nPAGE As Integer
    nPAGE = ActiveWindow.Selection.SlideRange.SlideIndex '現在選択しているページ
    
    Dim objSlide As PowerPoint.Slide  'スライド
    Set objSlide = ActivePresentation.Slides(nPAGE) '↑現在のページを変数に
    
    Dim ppShp As PowerPoint.Shape  'シェイプ
    Set ppShp = objSlide.Shapes("TextBox 2") 'テストはTextBox 2固定でテスト

    Const sFIND = "パソコン"   '探す文字列
    Const sREPLACE = "PC"      '置き換える文字列
    
    Dim ppTextRange As PowerPoint.TextRange
    
    '置換結果がある間、ループする
    Set ppTextRange = ppShp.TextFrame.TextRange.Replace(sFIND, sREPLACE)
    While Not (ppTextRange Is Nothing)  'トリッキーなループだけど
        '置換処理の実行
        Set ppTextRange = ppShp.TextFrame.TextRange.Replace(sFIND, sREPLACE)
        'なんかバカっぽいけど、↑これで、結果がNothingならループを抜けるので
    Wend

    MsgBox "処理終了、確認してください"

End Sub

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)