• ベストアンサー

セルの内容を変換 【置換】

エクセルでセルの内容を自動的に変換する方法をお聞きしたいです. いま、D列にデータとして 22(5) 1986.5 p.588-590 という文字列データがあります。 これを vol.22, NO.5 p.588-590 (1986.5) という風に書き換えをしたいのですが、 自動的にこれを行うマクロを作りたいです。 どのようにすればよいかお知恵を貸してください。 vol.の数字は2桁とは限りません。 NO.の数字も1桁とは限りません。 p.も同様です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

'変換する範囲を指定してマクロ呼出 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

maryu0709
質問者

お礼

御回答ありがとうございました。 お示しいただきましたマクロ、正常に動作いたしました!これで単純作業から開放されました。大感謝です! ソースも分かりやすいですし、私もこれを参考に勉強しないといけないと感じます^^; ありがとうございました!

その他の回答 (2)

noname#204879
noname#204879
回答No.3

マクロをお望みなのでお役に立ちませんが、マクロなしでも可能だということで… ="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行表示されているものと仮定しています。

maryu0709
質問者

お礼

折り返しである仮定の下に…ということでしたが、改行があってもOKでした! すべてうまくいきました。ありがとうございます! このような方法もあると知り、またひとつ勉強させていただきました。

maryu0709
質問者

補足

早速の御回答ありがとうございます。 マクロでないと実現できないのかと思い「マクロで」と書きました。こういうやり方もあるのですね。勉強になります。 2行に折り返して…と仮定いただきましたが、実際に改行してあります。こちらの情報不足で申し訳ありませんが、改行してある場合はどのようになりますか? 御回答いただけるとうれしいです。 よろしくお願いします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 少なくとも、以下のようなパターンにはなっていないと、このマクロでは難しいです。 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

maryu0709
質問者

お礼

早速の御回答ありがとうございました。 22(5) 1986.5 p.588-590 ↓↓↓↓↓↓↓↓↓↓ vol.22 p.588-590, No.5 p.588-590 のような実行結果となりました。 しかし、考え方はよく分かったので、修正はできそうです!! 勉強になりました。ありがとうございました!