- ベストアンサー
セルの内容を変換 【置換】
エクセルでセルの内容を自動的に変換する方法をお聞きしたいです. いま、D列にデータとして 22(5) 1986.5 p.588-590 という文字列データがあります。 これを vol.22, NO.5 p.588-590 (1986.5) という風に書き換えをしたいのですが、 自動的にこれを行うマクロを作りたいです。 どのようにすればよいかお知恵を貸してください。 vol.の数字は2桁とは限りません。 NO.の数字も1桁とは限りません。 p.も同様です。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
'変換する範囲を指定してマクロ呼出 Public Sub conv() Dim r As Range Dim regex, matches, match Set regex = CreateObject("VBScript.RegExp") regex.Pattern = "(\d+)\((\d+)\)\s+(\d{4}\.\d+)(\r|\n)+(.*)" For Each r In Selection Set matches = regex.Execute(r.Value) Set match = matches(0) With match r.value = "vol." & .SubMatches(0) & ", NO." & .SubMatches(1) & vbLf _ & .SubMatches(4) & " (" & .SubMatches(2) & ")" End With Next End Sub
その他の回答 (2)
マクロをお望みなのでお役に立ちませんが、マクロなしでも可能だということで… ="vol."&LEFT(A1,FIND("(",A1)-1)&", NO."&MID(A1,FIND("(",A1)+1,FIND(")",A1)-FIND("(",A1)-1)&CHAR(10)&TRIM(MID(A1,FIND("p",A1),99))&" ("&TRIM(MID(A1,FIND(")",A1)+1,FIND("p",A1)-FIND(")",A1)-2))&")" ただし、お示しのデータは一つのセルに折り返して2行表示されているものと仮定しています。
お礼
折り返しである仮定の下に…ということでしたが、改行があってもOKでした! すべてうまくいきました。ありがとうございます! このような方法もあると知り、またひとつ勉強させていただきました。
補足
早速の御回答ありがとうございます。 マクロでないと実現できないのかと思い「マクロで」と書きました。こういうやり方もあるのですね。勉強になります。 2行に折り返して…と仮定いただきましたが、実際に改行してあります。こちらの情報不足で申し訳ありませんが、改行してある場合はどのようになりますか? 御回答いただけるとうれしいです。 よろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 少なくとも、以下のようなパターンにはなっていないと、このマクロでは難しいです。 22(5) 1986.5 ↑ 数字と括弧付き数字があること。 1桁以上4桁までの数字とコンマと数字。 その間に、スペースのあるなしは問わない。 p.588-590 かならず、p.数字という組み合せで、上下が隣り合っていることが条件です。 c.Offset(, 1) とあるように、隣のE列のセルに出力するようになっています。上書きの場合は、同じような書き方のところは、全て c.Value とすれば、上書きします。 'なるべく標準モジュールに貼り付けてお使いください。 Sub PageFormatting() Dim c As Range Dim strVol As String Dim strNo As String Dim strDate As String With CreateObject("VBScript.RegExp") .Global = False .IgnoreCase = True Application.ScreenUpdating = False For Each c In Range("D1", Range("D65536").End(xlUp)) If VarType(c.Value) = vbString Then If c.Text Like "#*" Then .Pattern = "(\d+)\((\d)\)\s*(\d{1,4}\.\d+)" If .test(StrConv(c.Text, vbNarrow)) Then strVol = .Replace(c.Text, "$1") strNo = .Replace(c.Text, "$2") strDate = .Replace(c.Text, "$3") c.Offset(, 1).Value = "vol." & strVol & ", No." & strNo End If ElseIf c.Text Like "p.#*" Then If strDate <> "" Then c.Offset(, 1).Value = c.Value & " (" & strDate & ")" End If End If End If Next c Application.ScreenUpdating = True End With End Sub
お礼
早速の御回答ありがとうございました。 22(5) 1986.5 p.588-590 ↓↓↓↓↓↓↓↓↓↓ vol.22 p.588-590, No.5 p.588-590 のような実行結果となりました。 しかし、考え方はよく分かったので、修正はできそうです!! 勉強になりました。ありがとうございました!
お礼
御回答ありがとうございました。 お示しいただきましたマクロ、正常に動作いたしました!これで単純作業から開放されました。大感謝です! ソースも分かりやすいですし、私もこれを参考に勉強しないといけないと感じます^^; ありがとうございました!