|
検索文字の2文字目以降を置換すると良いようです。
ただし、検索文字が1文字だけのケースがあると上手く行かないです。
そこを無理やり処理してますが、もっと良い方法があるのかも。
Sub test()
Dim ws As Worksheet
Dim tb As TextBox
Dim chk As String
Dim rep As String
Dim n As Long
Dim p As Long
Dim x(8)
chk = "うえお"
rep = "こんにちは"
n = Len(chk) - 1
For Each ws In Worksheets
For Each tb In ws.TextBoxes
With tb
Do
p = InStr(.Text, chk)
If p = 0 Then Exit Do
If n > 0 Then
.Characters(p + 1, n).Insert rep
.Characters(p, 1).Delete
Else
With .Characters(p, 1).Font
x(0) = .Name
x(1) = .Size
x(2) = .Bold
x(3) = .Italic
x(4) = .Shadow
x(5) = .FontStyle
x(6) = .ColorIndex
x(7) = .OutlineFont
x(8) = .Strikethrough
End With
.Characters(p, 1).Insert rep
With .Characters(p, Len(rep)).Font
.Name = x(0)
.Size = x(1)
.Bold = x(2)
.Italic = x(3)
.Shadow = x(4)
.FontStyle = x(5)
.ColorIndex = x(6)
.OutlineFont = x(7)
.Strikethrough = x(8)
End With
End If
Loop
End With
Next
Next
End Sub
また、Characters().Fontから下線などの情報がどうしても取れないみたいですね。
『Excel 2003 および Excel 2002 でオートシェイプに入力されている文字の正しいプロパティ情報が取得できない』
ht tp://support.microsoft.com/kb/959558/ja
1文字置換のケースでは、mhtファイル経由を検討してみてもいいかもしれません。
Sub sample()
Const chk = "赤"
Const rep = "黒"
Dim ws As Worksheet
Dim tmp As String
Dim buf As String
Dim n As Long
'作業用mhtファイル名を設定。 _
同名既存ファイルがあれば上書きするので要注意。
tmp = Application.DefaultFilePath & "\temp.mht"
Set ws = ActiveSheet
ActiveWorkbook.PublishObjects.Add( _
xlSourceSheet, tmp, _
ws.Name, "", _
xlHtmlStatic).Publish True
'作業用mhtファイルOpen。
n = FreeFile
Open tmp For Input As #n
buf = StrConv(InputB(LOF(n), #n), vbUnicode)
Close #n
'---置換作業---
buf = Replace$(buf, chk, rep)
'--------------
'作業ファイル書き込み直してOpen、Copy。
n = FreeFile
Open tmp For Output As #n
Print #n, buf
Close #n
With Workbooks.Open(tmp)
.Sheets(1).Copy ws
.Close False
End With
'作業用mhtファイル削除。
Kill tmp
Set ws = Nothing
End Sub
|
|