Excel VBA質問箱 IV

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

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


10933 / 13644 ツリー ←次へ | 前へ→

【19105】置換方法について教えてください。 まり 04/10/21(木) 18:26 質問[未読]
【19107】Re:置換方法について教えてください。 かみちゃん 04/10/21(木) 21:44 回答[未読]

【19105】置換方法について教えてください。
質問  まり  - 04/10/21(木) 18:26 -

引用なし
パスワード
   置換機能について教えてください。

EXCELの一つのセルに入力された文字列(【変換前】)を【変換後】のような文字列に変換したいです。
ですが、CC123CA01から5バイトととって”,(カンマ)”を”,CC123”に置換しても途中でCA588という文字列の集合にかわるため、どのようにプログラムを書いたらいいのか分かりません。

Cells.Replace What:=",", Replacement:=",CC123", LookAt:=xlPart, _
                     ↑
                 この部分が変化します。

すごく初歩的なことかも知れませんが、お分かりになられる方は教えていただけないでしょうか?
よろしくお願いします。

【変換前】
CC123CA01,CC05,AD75,SS22,ET65,QE88,CA588EA35,EE77,OU96,LL09,RJ11

            ↓ ↓ ↓
【変換後】
CC123CA01,CC123CCC05,CC123CAD75,CC123CSS22,CC123CET65,CC123CQE88,CA588EA35,EE77,CA588EOU96,CA588ELL09,CA588ERJ11


◆まだ未完成なプログラムです。----------------------------------

 Sub replace7()  '文字列の変換
  Dim LastRow As Long
  Dim i As Long
  Dim j As Long
  Dim a As Range
  Dim b As Range
  'エラー時も処理を続けます
  On Error Resume Next
  Set a = Application.InputBox("上(左上)のセルを選択して下さい", "セルの指定", Type:=8)
  'キャンセル時は終了します
  If a Is Nothing Then
    Exit Sub
  End If
  
  'エラー時も処理を続けます
  On Error Resume Next
  Set b = Application.InputBox("下(右下)のセルを選択して下さい", "セルの選択", Type:=8)
  'キャンセル時は終了します
  If b Is Nothing Then
    Exit Sub
  End If
  
  For i = a.Row To b.Row
    For j = a.Column To b.Column
      Cells.Replace What:=",", Replacement:=",CC123", LookAt:=xlPart, _
      SearchOrder:=xlByRows, MatchCase:=False
    Next
  Next
  MsgBox "処理が完了しました。"
End Sub

【19107】Re:置換方法について教えてください。
回答  かみちゃん  - 04/10/21(木) 21:44 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ですが、CC123CA01から5バイトととって”,(カンマ)”を”,CC123”に置換しても途中でCA588という文字列の集合にかわるため、どのようにプログラムを書いたらいいのか分かりません。

置換というよりは、まず途中で変わる文字列があるのかないのかを検索します。
途中で変わる文字列があるならば、置換処理を2回する。
途中で変わる文字列がなければ、置換処理を1回する。
という方法になるかと思います。

また、

>Cells.Replace What:=",", Replacement:=",CC123", LookAt:=xlPart, _

では、セル全体を指定していますので、iとかjとかで、For〜Nextの繰り返し処理は意味がなさないです。

また、セル指定の入力ボックスも2回出ますが、1回でセル範囲を指定したほうがスマートではないでしょうか?

このあたりを踏まえて、以下修正したコードです。
WinXP(Home) + Excel2002(SR-3)で動作確認済みです。

Sub replace7()  '文字列の変換
  Dim a As Range
  Dim b As Range
  'エラー時も処理を続けます
  On Error Resume Next
  '処理したいセル範囲をaとする。
  Set a = Application.InputBox("処理したいセル範囲を選択して下さい", "セルの指定", Type:=8)
  'キャンセル時は終了します
  If a Is Nothing Then
    Exit Sub
  End If
 
  For Each b In a
   '途中で変わる文字列"CA588"を探す。探す文字列は「途中の文字列」なので、",CA588"とカンマ付きとする。
   If InStr(b, ",CA588") <> 0 Then
    b = Replace(Mid(b, 1, InStr(b, ",CA588") - 1), ",", ",CC123") & "," & _
       Replace(Mid(b, InStr(b, ",CA588") + 1, Len(b) - InStr(b, ",CA588")), ",", ",CA588")
   Else
    b = Replace(b, ",", ",CC123")
   End If
  Next
  MsgBox "処理が完了しました。"
End Sub

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