Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12428 / 76734 ←次へ | 前へ→

【69827】書式を保持したまま置換したい
質問  めー  - 11/9/1(木) 17:57 -

引用なし
パスワード
   ブック内に含まれる全テキストボックスを対象に
文字の色やスタイル、サイズなどを変えることなく
文字を置換したいのですが、うまくいかず困っています。

例えば「このペンは赤ペンです」という文章がはいったテキストボックスで
「このペンは」は「MS Pゴシック」「黒色の文字」
「赤ペン」は「MS P明朝」「赤い文字」「太字」
「です」は「MS Pゴシック」「青色の文字」
というように、文字一つひとつに異なるフォントを設定しているとします。

このテキストボックス内の「赤ペン」の部分を「私の物」と変えたい場合に
「赤ペン」の部分の「MS P明朝」「赤い文字」「太字」を変えずに
文字だけ「私の物」に変えたいのです。

そこで、置換をする前に書式の情報を配列にいれてから、文字を置換し、
置換された文章に、元の書式を適用するようなコードを書いたのですが、
一部の書式は保持されるものの、すべての書式を保持することができませんでした。

下記がそのコードです。
解決方法や、参考になるようなサイトなどをご存知でしたら
ご教示の程お願い致します。

なお、下記のコードでは、「検索文字列」と「置換文字列」が
同じ文字数と想定して書いています。
「検索文字列」と「置換文字列」の文字数が違う場合のパターンは
コメントアウトで「検索と置換の文字数が違う場合」と記したところに
書く予定にしています。


Option Explicit
Option Base 1
Dim BeforeStr As String '      検索文字列
Dim AfterStr As String '      置換文字列
Dim bCount As Long '        検索文字列の文字数
Dim aCount As Long '        置換文字列の文字数
Dim dif As Long '          置換文字列の文字数−検索文字列の文字数
Dim WS As Worksheet '        ワークシート
Dim s As Shape '          オートシェイプ
Dim i As Long
Dim sCount As Long '        置換前・後のオートシェイプ内の文字数
Dim myName() As String '      フォントの種類
Dim myFontStyle() As String '    フォントのスタイル(太字、斜体など)
Dim mySize() As Variant '      フォントのサイズ
Dim myStrikethrough() As Boolean ' 水平な取り消し線の設定
Dim mySuperscript() As Variant '  上付き文字
Dim mySubscript() As Variant '   下付き文字
Dim myOutlineFont() As Boolean '  アウトライン フォント
Dim myShadow() As Boolean '     影付きフォント
Dim myUnderline() As Variant '   下線の種類
Dim myColorIndex() As Variant '   フォントの色
Dim bInStr As Long '        検索文字が何文字目からスタートするのか

Sub 文字列入力()
'  Application.ScreenUpdating = False
  BeforeStr = InputBox("置換前の文字列を入力してください。")
  AfterStr = InputBox("置換後の文字列を入力してください。")
  Call 文字列操作
End Sub

Sub 文字列操作()
  
  bCount = Len(BeforeStr) '      検索文字列の文字数
  aCount = Len(AfterStr) '      置換文字列の文字数
  dif = aCount - bCount '       検索文字列の文字数−置換文字列の文字数
  
  For Each WS In Worksheets '-----------------------------------------------▼For文 -(1)ブック内のシート全て
    WS.Activate
    
    For Each s In WS.Shapes '---------------------------------------------▼For文 -(2)シート内のテキストボックスすべて
      If s.Name Like "Text Box*" Then '---------------------------------▼If文  -(1)オートシェイプを判別
        s.Select
        sCount = Len(Selection.Characters.Text) '        置換前・後のオートシェイプ内の文字数
        bInStr = InStr(Selection.Characters.Text, BeforeStr) ' 検索文字が何文字目からスタートするのか

        Call 書式格納
        Call 置換
        Call 適用

      End If '---------------------------------------------------------▲If文  -(1)テキストボックスを判別
    Next '----------------------------------------------------------------▲For文 -(2)シート内のテキストボックスすべて
  Next '--------------------------------------------------------------------▲For文 -(1)ブック内のシート全て

'  Application.ScreenUpdating = True

End Sub

Sub 書式格納()
  ReDim myName(sCount) '      フォントの種類
  ReDim myFontStyle(sCount) '   フォントのスタイル(太字、斜体など)
  ReDim mySize(sCount) '      フォントのサイズ
  ReDim myStrikethrough(sCount) ' 水平な取り消し線の設定
  ReDim mySuperscript(sCount) '  上付き文字
  ReDim mySubscript(sCount) '   下付き文字
  ReDim myOutlineFont(sCount) '  アウトライン フォント
  ReDim myShadow(sCount) '     影付きフォント
  ReDim myUnderline(sCount) '   下線の種類
  ReDim myColorIndex(sCount) '   フォントの色
  
  For i = 1 To sCount '-----------------------------------------▼For文 -(3)オートシェイプ内の1文字〜最後の文字
    With Selection.Characters(Start:=i, Length:=i).Font '-----▼With  -(2)オートシェイプ内のフォント
      If IsNull(.Name) Then '-------------------------------▼IF文  -(2)フォントの種類のプロパティが空のとき
        myName(i) = "MS Pゴシック"
        Else
          myName(i) = .Name
      End If '----------------------------------------------▲IF文  -(2)フォントの種類のプロパティが空のとき
      If IsNull(.FontStyle) Then '--------------------------▲IF文  -(3)フォントのスタイルのプロパティが空のとき
        myFontStyle(i) = "標準"
        Else
          myFontStyle(i) = .FontStyle
      End If '----------------------------------------------IF文  -(3)フォントのスタイルのプロパティが空のとき
      mySize(i) = .Size
      myStrikethrough(i) = .Strikethrough
      mySuperscript(i) = .Superscript
      mySubscript(i) = .Subscript
      myOutlineFont(i) = .OutlineFont
      myShadow(i) = .Shadow
      myUnderline(i) = .Underline
      myColorIndex(i) = .ColorIndex
    End With '------------------------------------------------▲With  -(2)オートシェイプ内のフォント
  Next '--------------------------------------------------------▲For文 -(3)オートシェイプ内の1文字〜最後の文字
End Sub

Sub 置換()
  Selection.Characters.Text = Replace(Selection.Characters.Text, BeforeStr, AfterStr)
End Sub

Sub 適用()

  If aCount = bCount Then
  For i = 1 To sCount '-----------------------------------------▼For文 -(4)オートシェイプ内の1文字〜最後の文字
    With Selection.Characters(Start:=i, Length:=i).Font '-----▼With文 -(3)オートシェイプ内のフォント
        .Name = myName(i)
        .FontStyle = myFontStyle(i)
        .Size = mySize(i)
        .Strikethrough = myStrikethrough(i)
        .Superscript = mySuperscript(i)
        .Subscript = mySubscript(i)
        .OutlineFont = myOutlineFont(i)
        .Shadow = myShadow(i)
        .Underline = myUnderline(i)
        .ColorIndex = myColorIndex(i)
    
    End With '--------------------------------------------▲With文 -(3)オートシェイプ内のフォント
  Next '----------------------------------------------------▲For文 -(4)オートシェイプ内の1文字〜最後の文字
  End If
  
  sCount = Len(Selection.Characters.Text)
  ReDim Preserve myName(sCount) '      フォントの種類
  ReDim Preserve myFontStyle(sCount) '   フォントのスタイル(太字、斜体など)
  ReDim Preserve mySize(sCount) '      フォントのサイズ
  ReDim Preserve myStrikethrough(sCount) ' 水平な取り消し線の設定
  ReDim Preserve mySuperscript(sCount) '  上付き文字
  ReDim Preserve mySubscript(sCount) '   下付き文字
  ReDim Preserve myOutlineFont(sCount) '  アウトライン フォント
  ReDim Preserve myShadow(sCount) '     影付きフォント
  ReDim Preserve myUnderline(sCount) '   下線の種類
  ReDim Preserve myColorIndex(sCount) '   フォントの色
          
'▼ 検索と置換の文字数が違う場合******************** 

'▲ 検索と置換の文字数が違う場合******************** 

End Sub
3 hits

【69827】書式を保持したまま置換したい めー 11/9/1(木) 17:57 質問
【69829】Re:書式を保持したまま置換したい UO3 11/9/2(金) 10:15 発言
【69831】Re:書式を保持したまま置換したい めー 11/9/2(金) 12:15 発言
【69833】Re:書式を保持したまま置換したい sasa 11/9/2(金) 13:09 回答
【69834】Re:書式を保持したまま置換したい めー 11/9/2(金) 13:27 発言
【69843】Re:書式を保持したまま置換したい n 11/9/2(金) 23:32 発言
【69847】Re:書式を保持したまま置換したい n 11/9/3(土) 12:31 発言
【69858】Re:書式を保持したまま置換したい めー 11/9/5(月) 18:19 お礼
【69849】Re:書式を保持したまま置換したい sasa 11/9/3(土) 16:50 回答
【69859】Re:書式を保持したまま置換したい めー 11/9/5(月) 18:24 お礼

12428 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free