• ベストアンサー

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

エクセルでセルの内容を自動的に変換する方法をお聞きしたいです. いま、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 のような実行結果となりました。 しかし、考え方はよく分かったので、修正はできそうです!! 勉強になりました。ありがとうございました!

関連するQ&A

  • 同じ内容のセルを消去

    こんにちは。 エクセルで、A列の各セルに下のようなデータがそれぞれ入っているとして、 A あ い う あ あ い え これを重複する内容のセルを消去(一つを残す)して A あ い う え という風にしたいのですが、自動的に出来る方法をご存じないでしょうか?

  • 同一セル内の3桁の数字を任意の数字に変換し表示

    excelの関数を教えて下さい。 同一セル内の3桁の数字(1から8までの数字を使用した3桁;例えば124)を、別のセル内に、関数(12345678をそれぞれ24587613へ変換する関数)で変換された3桁(例えば248)で表示したいのですが、その際に使用する関数を教えてください。エクセル上に表示する数字は1から8までのうちの3桁で、12345678をそれぞれ24587613へ変換したいです。 各セルに1数字の場合はVLOOKUP関数を使用し変換できたのですが、同一セル内に複数数字がある場合の考え方がわかりません。 よろしくお願いします。

  • エクセルでセルの内容を2つに分けたい。

    エクセルで作成したデータに1セルに OS1リボン18mm、~OS9999テープ5mm みたいなデータが縦に4000行くらい入っているデータがあります。(共通項はOSのみ、次に数字が1桁から4桁まで入りその後は任意の名称が入ってます) これを1列目1~9999、2列目をリボン18mm~テープ5mmみたいに分けて入れる方法ありますか? もしだめなら1~9999だけに出来れば良いです。 宜しくお願いします。そのときに番号順にソートしたいです。現在は文字列なので1.1001.201.50.みたいな順です) ちなみにOSはMe、エクセルは2000です。

  • エクセルのファイル名を任意のセルの内容にしたい

    windows2000、Excel2000の環境です。 ファイル名が数字7桁のブックが約1000個あります。 このブックのファイル名をブックに含まれるセル(最大2つ)の文字列+元のファイル名の数字7桁にしたいのです。 マクロやVBで一括で変換する方法はありませんでしょうか? セルの指定は特定の個所ではなく、ブックごとに違いますので、ブックを1つずつ開いて指定する形になります。 よろしくお願いします。

  • エクセル上の8桁の数字を一括して日付に変換する方法を教えて下さい。

    エクセル上の8桁の数字を一括して日付に変換する方法を教えて下さい。 ダウンロードしたエクセルデータのA列に日付として8桁の数字が入っているのですが、文字列として認識してるようで日付に変換出来ません。 例えば2010年1月1日の欄には20100101と入っていて、2001/01/01と変換したいのですがどうすればいいでしょうか。 セルの書式設定→表示形式→ユーザー定義で試してみましたが上手くいきませんでした。 データの量が何千行もあって膨大なので、1行ずつスラッシュを入れていくという作業は出来ません。 8桁の数字を一括して日付に変換出来る方法はあるのでしょうか。 教えて下さい。 宜しくお願い致します。

  • エクセル セル内の一定文字の置換

    以下のように、一つのセルに、数字がカンマで区切られて入力されているデータが数万件あります。 A列1行目 「10, 20, 30, 40, 50, 80, 110, 120, 130」 A列2行目 「10, 20, 40, 80, 110, 130」 A列3行目 「50, 100, 110, 120, 130」 ●それぞれ、2桁の数字を、始めに「0」をつけて、3桁にしたいです。 ●セルは全て文字列設定になっています。 ●「10」を検索し、「010」に置換えようとしたら、「110」も検索対象になってしまい、「1010」になってしまいました。 ★完成させたい答え 1行目 「010, 020, 030, 040, 050, 080, 110, 120, 130」 2行目 「010, 020, 040, 080, 110, 130」 3行目 「050, 100, 110, 120, 130」 関数などで短時間で出来る方法を教えて下さい。よろしくお願いします。

  • エクセルシートのセルに3桁と4桁の数字を・・

    エクセルシートのセルに3桁と4桁の数字を入れたいのですが、 000とか、 001 とか、 0850 などです。 現在、 0とか 1 とか 850 になっています。 おそらく、数字情報のデータになっていると思います。 それぞれ、0で始まる3桁、4桁の文字列にしたいのですが、 よろしくお願いします。行数は30000行ほどあります。

  • Excelマクロで置換

    Excelマクロで置換 セルA1に6桁・スペース・24桁の数字が入っています。 最初の6桁に130,397,430,440が含まれているシートを選択 そのシートの中に "ああああ"があったら"ああああい"に "いいいい"があったら"いいいいう"に "うううう"があったら"ううううえ"に と置換をするマクロを書きたいと思っています。 置換する対象の文字列は多いので別マクロで作成し呼び出したいと考えています。 シートは1ブックに30シート程。何シートあるかはブックによって変わります。 現在マクロの記録を使って試行錯誤しているのですが なにぶん初心者なのでなかなかうまくいきません。 どなたかご教授頂ければと思います。

  • 【Excel】指定先のセルの内容に応じた表示方法

    【Excel】指定先のセルの内容に応じた表示方法 今ここに、2つのエクセルファイルがあります。 αはデータ出力用、βはデータ入力用です。 αのA列にβのB列に入力されたものを指定の形式に変換して出力させることは可能でしょうか。 例えば、βのB列には数字、★などの記号と空白セルがあります。 それをαのA列に、βのB列が数字なら○、★なら★、空白セルなら×と変換をさせた状態で表示させたいのです。 αのデータにβのデータを入れる場合は、「=指定のセルをクリック」で出来るのですが、指定の変換方式で出力できればと思い質問させていただきました。 乱文駄文で失礼致しますが、皆さん宜しくお願い致します。

  • テキスト形式(.txt)をエクセルで読み込むときに1桁目の「0」を読み込みたい

    タブ区切りで作成されたテキストデータがあります。 これをエクセルで読み込むと、タブ区切りからセル区切りに自動的に変換されますが、 テキストに「0」から始まるデータがある場合、エクセルに変換されると数値として読み取ってしまうので、2桁目以降の0以外の数字を1桁目として認識してしまいます。 つまり、 「テキストデータを「文字列」のデータとしてエクセルで読み取る」 方法を探しています。 ご存知の方、教えてください。 よろしくお願いいたします。

専門家に質問してみよう