[[20150204072424]] 『エクセルマクロ 文字置換のワイルドカードについ』(noro) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセルマクロ 文字置換のワイルドカードについて』(noro)

文字の置換を一括で行うために次のマクロを教えていただきました。

Sub 置換()

    Dim i As Long
    With ThisWorkbook.Sheets("sheet2")
    For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
            Cells.Replace What:=.Range("A" & i).Value, Replacement:=.Range("B" & i).Value, _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
                        SearchFormat:=False, ReplaceFormat:=False
        Next
    End With
End Sub

sheet2(例)
A列 B列
検索 置換後
東京  日本

ここにワイルドカードを使用したいのですが、次の例の場合がうまくゆきません
平成23年度(置換前)  [23](置換後)
平成6年度    [06]
としたくて

平成??年度  [??]
平成?年度   [0?]

としたところ
[]
[0]
となってしまいました。
よい方法を教えてください。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 そら置換先の文字がないからねぇ。
 大量にあるならともかく、おそらく年度が入力されているセルなんて、1セルくらいでしょう?
 そこだけ置換ではなく、指定してあげればいかがでしょうか?
(稲葉) 2015/02/04(水) 08:39

 ワイルドカードで検索した結果を、置換文字列で利用したいというのは Replace 関数では
 難しそうです。

 今回の例だけだったら、関数でもでできそうですけれど、VBAでやるのであれば正規表現が
 利用できますので、なれないと敷居が高いかもしれませんが、挑戦してみてはどうでしょうか。

http://officetanaka.net/excel/vba/tips/tips38.htm
http://www.happy2-island.com/vbs/cafe02/capter02104.shtml

 平成を年にする例(一桁数字を二桁で0パディングしたい場合は、セルの書式でどうでしょうか)。

 Sub Samle()
    Dim objRegExp
    Set objRegExp = CreateObject("VBScript.RegExp")

    With objRegExp
        .Pattern = "平成(\d{1,2})年"
        .IgnoreCase = True
        .Global = True
    End With

    Dim r As Range
    Dim sMatch
    For Each r In Range("A1:A22")
        Set sMatch = objRegExp.Execute(r.Value)
        If sMatch.Count > 0 Then
            r.Value = sMatch(0).SubMatches(0)
        End If
    Next
 End Sub
(Mook) 2015/02/04(水) 10:17

 シート内の色々な箇所にあるなら処理に時間が掛かり無理かもしれませんが、ある一定の
 範囲に固まっているなら、その範囲を選択した状態で下記コードを実行なんて方法でも
 いいのかな。

 Sub 置換2()

     Dim r As Range

     For Each r In Selection
       If r.Value <> "" Then r.Value = "[" & Format(Replace(Replace(r.Value, "平成", ""), "年度", ""), "00") & "]"
    Next

 End Sub
(se_9) 2015/02/04(水) 10:28

 検索条件を部分一致にして
 平成  空白
 年度  空白
 で置換
 かな?
(seiya) 2015/02/04(水) 10:31

 ん、
 平成6年度 → 平成06年度
 にしたいってことだと思っていたのですが、違うのかな?
(稲葉) 2015/02/04(水) 10:32

 平成23年度→[23] 
 平成6年度 →[06]
 ではないのか?
 追記
 数値は固定ではなく書式文字で表せば
 平成e年度→[ee]
 では?
(ねむねむ) 2015/02/04(水) 10:35

 >平成??年度  [??] 
 >平成?年度   [0?] 
 ここちゃんと読んでませんでした
 済みません。
(稲葉) 2015/02/04(水) 10:42

置換ではないのですが
Sub 置換()
    Dim i As Long
    Dim j As Long
    Dim Sout As String
    Dim S As String
    Dim A As String
    With ThisWorkbook.Sheets("Sheet2")
    For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
    A = .Range("A" & i).Value
     For j = 1 To Len(A)
       S = Mid$(A, j, 1)
             If S Like "[0-9]" Then
                  Sout = Sout & S
             End If
            Next
            .Range("B" & i).Value = "[" & Format(Sout, "00") & "]"
           Sout = ""
        Next
      End With
End Sub
ともできる
(デイト) 2015/02/04(水) 10:51

みなさん色々ありがとうございました。
それぞれのコメントを勉強しながら工夫してみたいと思っています。
なお、置換は「平成」に限らず、「昭和」もあり、いずれも、年号のところは「[」で、「年度」の文字は「]」で数字のみを[]でくくることになります。(A列各行にすべて
入っています)
(noro) 2015/02/04(水) 12:17

 検索条件を部分一致にして
 平成  空白
 昭和 空白
 年度  空白
 で置換

 セルの書式
 "["00"]"
(seiya) 2015/02/04(水) 12:30

上の追記で間に合わなかったのですが、「平成○○年」という場合はくくりません。あくまで「平成○○年度」のみを対象にしています。
どちらでもよければ単純に置換で「平成」を「[」にできるのですが。
(noro) 2015/02/04(水) 12:41

 それじゃ

 Sub test()
    Dim r As Range
    With CreateObject("VBScript.RegExp")
        .Pattern = "(平成|昭和|大正|明治)([\d0-9]+)年度"
        For Each r In ActiveSheet.UsedRange
            If .test(r.Value) Then
                r.Value = Format$(.Replace(r.Value, "$2"), """[""00""]""")
            End If
        Next
    End With
End Sub
(seiya) 2015/02/04(水) 13:07
 "00" を忘れてた...

seiyaさん。
ありがとうございました。
おかげさまでうまくゆきました。
(noro) 2015/02/04(水) 18:18

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.