お示しの URL の #1 さんのご回答を参考にして書いてみました。
[日本語用のフォント] が施された文字は全角の「_」、それ以外は半角の「_」に書き換えるようにしておりますが、全角の「_」と半角の「_」とでは、文字の ベースライン が揃わないようですので、お気に召さなければ、後からすべて削除(半角の「_」を無文字にすべて置換)してください。
EXCEL VBA とは違って余り細々と操作できなさそうですので、このへんでご勘弁を。。。
<(_ _)>
なお、「赤色」とお書きなのが本当の「赤」でしたら、
RGB(Red:=255, Green:=0, Blue:=102)
の部分は
RGB(Red:=255, Green:=0, Blue:=0)
になるかと存じます。
[新しいマクロの記録] で、実際に「赤色」を施してみて、RGB の値を取得してください。
>当方、BASICやperlなどのプログラミングの経験はかつて多少あります
とのことですので、コーディング の操作内容はご理解いただけると存じますが、
>VBAはろくに使ったことがありません。
とのことですので、EXCEL VBA についての説明ですが、
http://okwave.jp/qa/q6129006.html
の #31【お別れの言葉】でもご覧ください。
'-------------------------------------------------------
Sub ChangeUnderBar()
Dim objSlide As slide
Dim objShape As shape
Dim objWord As TextRange
Dim objChara As TextRange
For Each objSlide In ActiveWindow.Parent.Slides
For Each objShape In objSlide.Shapes
For Each objWord In objShape.TextFrame.TextRange.Words
For Each objChara In objWord.Characters
'「赤色・48pt」の場合は「_」に変換
If objChara.Font.Size = 48 And _
objChara.Font.Color.RGB = RGB(Red:=255, Green:=0, Blue:=102) Then
Select Case objChara.LanguageID
Case msoLanguageIDJapanese
objChara.Text = "_"
Case Else
objChara.Text = "_"
End Select
objChara.Font.Size = 48
objChara.Font.Color.RGB = RGB(0, 0, 0)
End If
Next
Next
Next
Next
End Sub
質問者
お礼
コード付きのすばらしいご回答をいただき、心より御礼申し上げます。
全角の場合と半角の場合の違いまで、当初申し上げてもおりませんでしたのに
考慮していただいて、心より感謝いたします。
いただいたコードを拝見し、なるほどVBAではこのような
書き方になるのかと、VBA素人なりに合点がいきました。
ただ、実は私の環境では、いただいたものをそのまま実行すると
実行時エラー '-2147024809 (80070057)':
指定された値は境界を超えています。
というエラーメッセージが表示され、デバッグボタンを押すと
For Each objWord In objShape.TextFrame.TextRange.Words
の行が黄色くマーキングされます。
とくに、objWordの上にマウスカーソルを当てると
「objWord = Nothing」というポップアップが表示されます。
私の環境については、ループ範囲の設定が適切ではないという
趣旨のエラーなのかなと想像しております。
他の質問なども参考にIn以下を少し変えたりなど試してみておりますが
まだうまく実行できてはおりません、が、かなりゴールに近づいて
いるとは思いますのでもう少しねばってみたいと思います。
もしもなにか思い当たる節がおありでしたら、重ね重ねで恐縮ですが
教えていただだければ大変ありがたいです。
この度は本当にありがとうございました。
質問者
補足
お礼を投稿したあとで申し訳ないのですが、その後のご報告です。
いろいろと試してみまして、
http://www.d-consulting.biz/presentation/powerpoint/vba_change_font/
にヒントを得て、2度目のループと3度目のループの間に
If objShape.HasTextFrame Then
の一文を入れ、全体を以下のようにすることにより、
プログラムを動作させることができました。
この方法では、表の中の文字、助詞、一部テキストボックス中の文字など、
いくつか「赤字・48pt」でも変換できないところが依然残ってしまってはおりますが
それでも主観ですが全体の8~9割の置き換えには成功しており、
逐一手作業で置き換えるよりはこれで大幅に負担が軽減できます。
本当にどうもありがとうございました。
「完全に」動作させるためのアドバイスなど、もしもお気づきでしたら、
重ね重ねで恐縮ですが、再度ご助言いただけましたら大変幸いに存じます。
'-------------------------------------------------------
Sub ChangeUnderBar()
Dim objSlide As Slide
Dim objShape As Shape
Dim objWord As TextRange
Dim objChara As TextRange
For Each objSlide In ActiveWindow.Parent.Slides
For Each objShape In objSlide.Shapes
If objShape.HasTextFrame Then 'ここが追加
For Each objWord In objShape.TextFrame.TextRange.Words
For Each objChara In objWord.Characters
'「赤色・48pt」の場合は「_」に変換
If objChara.Font.Size = 48 And _
objChara.Font.Color.RGB = RGB(Red:=255, Green:=0, Blue:=0) Then
Select Case objChara.LanguageID
Case msoLanguageIDJapanese
objChara.Text = "_"
Case Else
objChara.Text = "_"
End Select
objChara.Font.Size = 48
objChara.Font.Color.RGB = RGB(0, 0, 0)
End If
Next
Next
End If 'ここが追加
Next
Next
End Sub
お礼
コード付きのすばらしいご回答をいただき、心より御礼申し上げます。 全角の場合と半角の場合の違いまで、当初申し上げてもおりませんでしたのに 考慮していただいて、心より感謝いたします。 いただいたコードを拝見し、なるほどVBAではこのような 書き方になるのかと、VBA素人なりに合点がいきました。 ただ、実は私の環境では、いただいたものをそのまま実行すると 実行時エラー '-2147024809 (80070057)': 指定された値は境界を超えています。 というエラーメッセージが表示され、デバッグボタンを押すと For Each objWord In objShape.TextFrame.TextRange.Words の行が黄色くマーキングされます。 とくに、objWordの上にマウスカーソルを当てると 「objWord = Nothing」というポップアップが表示されます。 私の環境については、ループ範囲の設定が適切ではないという 趣旨のエラーなのかなと想像しております。 他の質問なども参考にIn以下を少し変えたりなど試してみておりますが まだうまく実行できてはおりません、が、かなりゴールに近づいて いるとは思いますのでもう少しねばってみたいと思います。 もしもなにか思い当たる節がおありでしたら、重ね重ねで恐縮ですが 教えていただだければ大変ありがたいです。 この度は本当にありがとうございました。
補足
お礼を投稿したあとで申し訳ないのですが、その後のご報告です。 いろいろと試してみまして、 http://www.d-consulting.biz/presentation/powerpoint/vba_change_font/ にヒントを得て、2度目のループと3度目のループの間に If objShape.HasTextFrame Then の一文を入れ、全体を以下のようにすることにより、 プログラムを動作させることができました。 この方法では、表の中の文字、助詞、一部テキストボックス中の文字など、 いくつか「赤字・48pt」でも変換できないところが依然残ってしまってはおりますが それでも主観ですが全体の8~9割の置き換えには成功しており、 逐一手作業で置き換えるよりはこれで大幅に負担が軽減できます。 本当にどうもありがとうございました。 「完全に」動作させるためのアドバイスなど、もしもお気づきでしたら、 重ね重ねで恐縮ですが、再度ご助言いただけましたら大変幸いに存じます。 '------------------------------------------------------- Sub ChangeUnderBar() Dim objSlide As Slide Dim objShape As Shape Dim objWord As TextRange Dim objChara As TextRange For Each objSlide In ActiveWindow.Parent.Slides For Each objShape In objSlide.Shapes If objShape.HasTextFrame Then 'ここが追加 For Each objWord In objShape.TextFrame.TextRange.Words For Each objChara In objWord.Characters '「赤色・48pt」の場合は「_」に変換 If objChara.Font.Size = 48 And _ objChara.Font.Color.RGB = RGB(Red:=255, Green:=0, Blue:=0) Then Select Case objChara.LanguageID Case msoLanguageIDJapanese objChara.Text = "_" Case Else objChara.Text = "_" End Select objChara.Font.Size = 48 objChara.Font.Color.RGB = RGB(0, 0, 0) End If Next Next End If 'ここが追加 Next Next End Sub