Excel VBA質問箱 IV

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

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


12412 / 76734 ←次へ | 前へ→

【69843】Re:書式を保持したまま置換したい
発言  n  - 11/9/2(金) 23:32 -

引用なし
パスワード
   検索文字の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

7 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 お礼

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