|
ブック内に含まれる全テキストボックスを対象に
文字の色やスタイル、サイズなどを変えることなく
文字を置換したいのですが、うまくいかず困っています。
例えば「このペンは赤ペンです」という文章がはいったテキストボックスで
「このペンは」は「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
|
|