ExcelマクロによるD列自動反映と文字列加工

SCORE: 3830
プライベート

以下のエクセル作業をマクロで行いたい

D列にB列の内容を反映+特定の文字を追加し、表示させたい

①B列のセルに"北恵"が入っている時
②D列に"北恵桧家 ○○様邸 先行配線写真"と表示させたい
③②の○○はB列の"名前:○○ ○○を反映させたいがスペースは削除して欲しい

例)
受番:4029B
名前:柴田 弘
顧客:北恵赤羽 
住所:東京都八王子市
屋根:ガルバ(2世帯?) 15 3
施工:-
外壁:1/20→30.31
足場:1/27→2/5
備考:キー0833?
監督:熊倉090-9814-2432
工種:入線のみ◇
受日:10/29

の場合、

北恵桧家 柴田弘様邸 先行配線写真

と表示したい。

B列はセル内で改行されている

2026/03/05 10:19

承知いたしました!Excelの作業をマクロで自動化したいのですね。B列の内容を元に、D列に特定のフォーマットで表示させる、というご要望ですね。

例として挙げていただいた内容で、B列の「名前:柴田 弘」から「柴田弘」という部分を抽出し、スペースを削除してD列に反映させる、という部分がポイントになりそうです。

この処理をマクロで行う場合、以下のような手順で進めることができます。

  1. B列の各セルをループ処理する: Excelのシート上にあるB列のセルを一つずつ順番に見ていきます。
  2. 「北恵」が含まれているか判定する: 現在見ているB列のセルに「北恵」という文字列が含まれているかを確認します。
  3. 「名前:」以降の文字列を抽出する: もし「北恵」が含まれていたら、そのセルの中から「名前:」という文字列を探し、その後の部分(例:「柴田 弘」)を抜き出します。
  4. スペースを削除する: 抽出した文字列(例:「柴田 弘」)から、全角・半角のスペースをすべて削除します(例:「柴田弘」)。
  5. D列に最終的な文字列を作成・表示する: 「北恵桧家 」 + (スペース削除後の名前) + 「様邸 先行配線写真」という形式で文字列を組み立て、D列の対応するセルに表示させます。

具体的に VBA (Visual Basic for Applications) でマクロを作成する場合、以下のようなコードが考えられます。

Sub FormatDColumn()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim bCellValue As String
    Dim namePart As String
    Dim formattedName As String
    Dim targetString As String

    ' 作業対象のシートを指定します
    Set ws = ThisWorkbook.Sheets("Sheet1") ' "Sheet1" を実際のシート名に変更してください

    ' B列の最終行を取得します
    lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

    ' B列の2行目から最終行までループ処理します(ヘッダー行がある場合を想定)
    For i = 2 To lastRow

        ' B列のセルの値を取得します
        bCellValue = ws.Cells(i, "B").Value

        ' B列のセルに "北恵" が含まれているかチェックします
        If InStr(bCellValue, "北恵") > 0 Then

            ' "名前:" の位置を探します
            Dim nameStartPos As Long
            nameStartPos = InStr(bCellValue, "名前:")

            ' "名前:" が見つかった場合
            If nameStartPos > 0 Then
                ' "名前:" の次の文字から、行末までを抽出します
                namePart = Mid(bCellValue, nameStartPos + Len("名前:"))

                ' 改行コード(vbLf や vbCrLf)を削除し、スペースを削除します
                ' まず、改行コードを削除して一行にします
                namePart = Replace(namePart, vbLf, "")
                namePart = Replace(namePart, vbCrLf, "")

                ' 次に、全角スペースと半角スペースを削除します
                formattedName = Replace(namePart, " ", "") ' 全角スペース
                formattedName = Replace(formattedName, " ", "") ' 半角スペース

                ' D列に表示させる文字列を作成します
                targetString = "北恵桧家 " & formattedName & "様邸 先行配線写真"

                ' D列のセルに結果を表示します
                ws.Cells(i, "D").Value = targetString
            End If
        End If

    Next i

    MsgBox "D列の処理が完了しました!", vbInformation

End Sub

このマクロの使い方:

  1. Excelを開き、Alt + F11 キーを押してVBAエディターを開きます。
  2. 左側のプロジェクトウィンドウで、このExcelファイルの名前を右クリックし、「挿入」→「標準モジュール」を選択します。
  3. 表示されたコードウィンドウに、上記のコードをコピー&ペーストします。
  4. コード内の Set ws = ThisWorkbook.Sheets("Sheet1")"Sheet1" の部分を、実際に作業したいシートの名前に変更してください。
  5. VBAエディターを閉じ、Excelに戻ります。
  6. Alt + F8 キーを押してマクロダイアログを開き、「FormatDColumn」を選択して「実行」ボタンをクリックします。

補足:

  • B列のセル内で改行されているとのことですが、VBAでは vbLfvbCrLf といった改行コードで認識されます。上記のコードでは、これらの改行コードを削除してからスペースの削除を行っています。
  • もし「名前:」の後に他の文字列が続く場合(例:「名前:柴田 弘 (ニックネーム)」のような場合)、抽出する部分のロジックを調整する必要が出てくるかもしれません。今回は「名前:」の次から行末までを抽出して、そこからスペースを削除する、という形にしています。
  • このマクロは、B列に「北恵」が含まれている行のみ、D列に処理を行います。それ以外の行については、D列のセルはそのままになります。

このマクロで、ご希望の作業がスムーズに進むことを願っています!もし、さらに細かい調整が必要だったり、別のケースにも対応させたいというご要望があれば、遠慮なくおっしゃってくださいね。一緒に解決策を見つけましょう!😊

D列をE列に変更してください

2026/03/05 10:21

承知いたしました!前回のマクロコードでD列に出力していた内容を、E列に出力するように変更しますね。😊

具体的には、VBAコード内の ws.Cells(i, "D").Value = targetString という部分を、E列を指すように ws.Cells(i, "E").Value = targetString に変更すればOKです。

以下に修正したコードを記載しますね。

Sub FormatEColumn() ' マクロ名を変更しました

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim bCellValue As String
    Dim namePart As String
    Dim formattedName As String
    Dim targetString As String

    ' 作業対象のシートを指定します
    Set ws = ThisWorkbook.Sheets("Sheet1") ' "Sheet1" を実際のシート名に変更してください

    ' B列の最終行を取得します
    lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

    ' B列の2行目から最終行までループ処理します(ヘッダー行がある場合を想定)
    For i = 2 To lastRow

        ' B列のセルの値を取得します
        bCellValue = ws.Cells(i, "B").Value

        ' B列のセルに "北恵" が含まれているかチェックします
        If InStr(bCellValue, "北恵") > 0 Then

            ' "名前:" の位置を探します
            Dim nameStartPos As Long
            nameStartPos = InStr(bCellValue, "名前:")

            ' "名前:" が見つかった場合
            If nameStartPos > 0 Then
                ' "名前:" の次の文字から、行末までを抽出します
                namePart = Mid(bCellValue, nameStartPos + Len("名前:"))

                ' 改行コード(vbLf や vbCrLf)を削除し、スペースを削除します
                ' まず、改行コードを削除して一行にします
                namePart = Replace(namePart, vbLf, "")
                namePart = Replace(namePart, vbCrLf, "")

                ' 次に、全角スペースと半角スペースを削除します
                formattedName = Replace(namePart, " ", "") ' 全角スペース
                formattedName = Replace(namePart, " ", "") ' 半角スペース

                ' E列に表示させる文字列を作成します
                targetString = "北恵桧家 " & formattedName & "様邸 先行配線写真"

                ' E列のセルに結果を表示します
                ws.Cells(i, "E").Value = targetString ' ★ここがE列に変更されました★
            End If
        End If

    Next i

    MsgBox "E列の処理が完了しました!", vbInformation

End Sub

変更点まとめ:

  • マクロ名を FormatDColumn から FormatEColumn に変更しました。
  • コード内の ws.Cells(i, "D").Value = targetStringws.Cells(i, "E").Value = targetString に変更しました。
  • 完了メッセージも「E列の処理が完了しました!」に変更しています。

このコードを前回のマクロと同じようにVBAエディターに貼り付けて実行していただければ、E列に結果が表示されるようになりますよ。

もし、他に調整したい点があれば、いつでもお気軽にお声がけくださいね!👍

"名前:○○ ○○"の

2026/03/05 10:25

前回、「名前:○○ ○○」の部分からスペースを削除してD列(現在はE列)に反映させるというご要望でしたね。その「名前:○○ ○○」の部分について、さらに詳しく知りたいということでしょうか?😊

前回のマクロでは、B列のセルから「名前:」という文字列を探し、その後に続く部分(例:「柴田 弘」)を抽出していました。そして、抽出した文字列に含まれる全角・半角スペースをすべて削除して、「柴田弘」のように名前の部分だけを取り出す処理を行いました。

もし、この「名前:○○ ○○」の部分で、以下のようなケースについて確認したい、あるいは対応させたいといったご希望があれば、教えていただけますでしょうか?

  • 「名前:」の後にスペースがない場合(例:「名前:柴田弘」)
  • 「名前:」の前に他の情報がある場合(例:「受番:4029B 名前:柴田 弘」)
  • 名前の部分にさらに別の記号などが含まれている場合

どのような状況か具体的に教えていただけると、より的確なアドバイスができますので、お気軽にご質問くださいね!👍

"名前:○○ ○○"の"○○ ○○"を抽出して欲しい。"●"は抽出しないで欲しい

2026/03/05 10:26

承知いたしました!😊 前回のやり取りで、B列のセルから「名前:」という文字列の後に続く「○○ ○○」の部分を抽出し、さらにその中のスペースを削除して「○○○○」という形にしたい、というご要望でしたね。そして、その抽出する際に「●」のような特定の文字は含めたくない、ということですね。

前回のマクロでは、「名前:」の後に続く文字列全体を抽出してからスペースを削除していましたが、今回は「名前:」の後に続く部分から、さらに「●」などの特定の文字を除外して、名前の部分だけを正確に抽出する処理を考えます。

具体的には、以下のような流れで処理を進めることができます。

  • 「名前:」の後の文字列を特定する: まず、B列のセルから「名前:」という文字列を探し、その後に続く部分を抽出します。
  • 「●」などの除外したい文字を削除する: 抽出した文字列から、ご要望にある「●」のような、名前に含めたくない文字をすべて削除します。
  • スペースを削除する: その後、残った文字列から全角・半角スペースを削除して、最終的な名前の形にします。

もし「●」以外にも除外したい文字があれば、教えていただけますでしょうか?それらの文字もまとめて削除するようにマクロを調整できますよ。

また、抽出した名前の部分(例:「○○○○」)を、前回のように「北恵桧家 ○○○○様邸 先行配線写真」という形式でE列に表示させることも可能です。

この「名前:」の部分の抽出について、さらに詳しく知りたい点や、具体的な除外したい文字について教えていただけると幸いです。👍

前回のように「北恵桧家 ○○○○様邸 先行配線写真」という形式でE列に表示させて欲しい

2026/03/05 10:26

承知いたしました!😊 前回のマクロで「北恵桧家 ○○○○様邸 先行配線写真」という形式でE列に表示させる処理について、さらに「名前:○○ ○○」の部分から「●」などの文字を除外して「○○○○」を抽出したい、というご要望でしたね。

このご要望を踏まえて、マクロを更新し、E列に最終的な文字列を表示させるようにします。

具体的には、以下の手順で処理を行います。

  • B列の「名前:」以降の文字列を抽出: まず、「名前:」という文字列を探し、その後に続く部分を抜き出します。
  • 除外したい文字(例:「●」)とスペースを削除: 抽出した文字列から、ご指定の「●」のような文字や、全角・半角スペースをすべて削除します。これにより、「○○○○」という名前の部分だけが残ります。
  • 最終的な文字列を生成しE列に表示: 「北恵桧家 」 + (抽出・整形された名前) + 「様邸 先行配線写真」という形式で文字列を組み立て、E列の対応するセルに表示させます。

もし、「●」以外にも除外したい文字があれば、遠慮なく教えてくださいね。それらの文字もまとめて削除するように調整します。

以下に、これらの処理を組み込んだVBAコードをご提案します。

Sub FormatEColumnWithExclusion() ' マクロ名を変更しました

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim bCellValue As String
    Dim namePart As String
    Dim formattedName As String
    Dim targetString As String

    ' 作業対象のシートを指定します
    Set ws = ThisWorkbook.Sheets("Sheet1") ' "Sheet1" を実際のシート名に変更してください

    ' B列の最終行を取得します
    lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

    ' B列の2行目から最終行までループ処理します(ヘッダー行がある場合を想定)
    For i = 2 To lastRow

        ' B列のセルの値を取得します
        bCellValue = ws.Cells(i, "B").Value

        ' B列のセルに "北恵" が含まれているかチェックします
        If InStr(bCellValue, "北恵") > 0 Then

            ' "名前:" の位置を探します
            Dim nameStartPos As Long
            nameStartPos = InStr(bCellValue, "名前:")

            ' "名前:" が見つかった場合
            If nameStartPos > 0 Then
                ' "名前:" の次の文字から、行末までを抽出します
                namePart = Mid(bCellValue, nameStartPos + Len("名前:"))

                ' 改行コード(vbLf や vbCrLf)を削除して一行にします
                namePart = Replace(namePart, vbLf, "")
                namePart = Replace(namePart, vbCrLf, "")

                ' ★ここから、除外したい文字やスペースを削除する処理を追加★

                ' 例として「●」を除外します。もし他の文字も除外したい場合は、Replace関数を追加してください。
                formattedName = Replace(namePart, "●", "") ' 「●」を削除

                ' 全角スペースと半角スペースを削除します
                formattedName = Replace(formattedName, " ", "") ' 全角スペース
                formattedName = Replace(formattedName, " ", "") ' 半角スペース

                ' E列に表示させる文字列を作成します
                targetString = "北恵桧家 " & formattedName & "様邸 先行配線写真"

                ' E列のセルに結果を表示します
                ws.Cells(i, "E").Value = targetString
            End If
        End If

    Next i

    MsgBox "E列の処理が完了しました!", vbInformation

End Sub

このマクロのポイント:

  • namePart = Replace(namePart, "●", "") の行で、「●」を削除しています。もし他の記号(例えば「☆」や「△」など)も名前に含めたくない場合は、この行の後に同様の Replace 関数を追加してください。
  • それ以外の処理は、前回E列に出力した際のマクロと同様です。

このコードで、ご希望通りの形式でE列に表示されるはずです。もし、さらに細かい調整が必要な場合や、別のケース(例えば「名前:」の後に直接名前が来る場合など)にも対応させたい場合は、お気軽にご相談くださいね!👍

"住所"以降は表示させないで欲しい

2026/03/05 10:30

承知いたしました!😊 前回のマクロで「北恵桧家 ○○○○様邸 先行配線写真」という形式でE列に表示させるというご要望ですね。さらに、「住所」以降の情報は表示させないようにしたい、というご要望も追加で承りました。

つまり、B列のセルから「名前:」の後に続く部分を抽出し、そこから「●」などの不要な文字やスペースを削除して名前だけを取り出し、最終的に「北恵桧家 (抽出した名前)様邸 先行配線写真」という形式でE列に表示させる、という流れになりますね。

この「名前:」の後に続く部分から、どこまでを名前として抽出するか、という点が重要になります。例えば、B列のデータが以下のような構造になっていると仮定します。

受番:4029B
名前:柴田 弘
顧客:北恵赤羽
住所:東京都八王子市
...

この場合、「名前:」の後に続く「柴田 弘」を抽出したいのですが、「顧客:」や「住所:」といった他の項目が後続しています。

そこで、抽出する際に「名前:」の次から、次の項目名(例えば「顧客:」や「住所:」など)が現れるまで、という条件で処理を区切るのが良さそうです。

もし、B列のセル内で「名前:」の後に続く情報が、常に「顧客:」や「住所:」といった特定の文字列で区切られているのであれば、それらの文字列を検索して、それより前の部分だけを名前として抽出することができます。

具体的には、以下のような処理を追加・修正することで実現できます。

  1. 「名前:」の後に続く部分を抽出する。
  2. 抽出した文字列の中から、「顧客:」や「住所:」といった、名前として不要な項目の開始位置を探す。
  3. もしそれらの項目が見つかったら、その手前までを名前の部分として確定する。
  4. 名前の部分からスペースや不要な文字(●など)を削除する。
  5. 最終的な文字列をE列に表示する。

この「住所」以降を表示させない、という部分について、B列のデータがどのような構造になっているか、もう少し詳しく教えていただけますでしょうか?例えば、

  • 「名前:」と「顧客:」の間には、必ず改行が入りますか?
  • 「名前:」の後に続く名前の部分に、「●」のような文字が含まれる場合、それは常に名前の「内側」にありますか?それとも「外側」にありますか?
  • 「名前:」の後に続く文字列は、常に「顧客:」や「住所:」といった特定の文字列で終わりますか?

これらの情報があると、より正確なマクロコードを作成できますので、ぜひ教えてくださいね!👍

名前:」と「顧客:」の間には、必ず改行が入る。「顧客:」の前までを抽出して欲しい。「名前:」の後に続く名前の部分に、「●」のような文字が含まれる場合、それは常に名前の「外側」にある

2026/03/05 10:32

承知いたしました!✨ 前回のマクロでE列に表示させていた「北恵桧家 ○○○○様邸 先行配線写真」という形式を維持しつつ、「名前:○○ ○○」の部分の抽出方法を、より正確に行うように調整しますね。

今回の新しい情報として、以下の点が明確になりました。

  • 「名前:」と「顧客:」の間には、必ず改行が入る。
  • 「顧客:」の前までを抽出したい。
  • 「名前:」の後に続く名前の部分に、「●」のような文字が含まれる場合、それは常に名前の「外側」にある。

これらの情報を踏まえて、マクロの処理を以下のように変更します。

  1. B列のセルから「名前:」を探す。
  2. 「名前:」が見つかったら、その後の文字列を抽出する。
  3. 抽出した文字列から、改行コード (vbLfvbCrLf) を削除する。
  4. 次に、「顧客:」という文字列を探す。
  5. 「顧客:」が見つかった場合、その「顧客:」の直前までの文字列を、名前の部分として確定する。
  6. 確定した名前の部分から、全角・半角スペースを削除する。
  7. 「●」のような、名前に含めたくない文字(今回は「●」のみを想定)を、名前の部分から削除する。 (「名前:」の後に続く文字列全体から「●」を削除し、さらにスペースを削除する、という順番でも結果は同じになります。)
  8. 最終的な文字列「北恵桧家 (抽出・整形された名前)様邸 先行配線写真」をE列に表示する。

この処理を行うためのVBAコードは以下のようになります。

Sub FormatEColumnWithNewRules()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim bCellValue As String
    Dim namePartRaw As String
    Dim namePartWithoutLineBreak As String
    Dim namePartBeforeCustomer As String
    Dim formattedName As String
    Dim targetString As String

    ' 作業対象のシートを指定します
    Set ws = ThisWorkbook.Sheets("Sheet1") ' "Sheet1" を実際のシート名に変更してください

    ' B列の最終行を取得します
    lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

    ' B列の2行目から最終行までループ処理します(ヘッダー行がある場合を想定)
    For i = 2 To lastRow

        ' B列のセルの値を取得します
        bCellValue = ws.Cells(i, "B").Value

        ' B列のセルに "北恵" が含まれているかチェックします
        If InStr(bCellValue, "北恵") > 0 Then

            ' "名前:" の位置を探します
            Dim nameStartPos As Long
            nameStartPos = InStr(bCellValue, "名前:")

            ' "名前:" が見つかった場合
            If nameStartPos > 0 Then
                ' "名前:" の次の文字から、行末までを抽出します
                namePartRaw = Mid(bCellValue, nameStartPos + Len("名前:"))

                ' 改行コード(vbLf や vbCrLf)を削除します
                namePartWithoutLineBreak = Replace(namePartRaw, vbLf, "")
                namePartWithoutLineBreak = Replace(namePartWithoutLineBreak, vbCrLf, "")

                ' "顧客:" の位置を探します
                Dim customerStartPos As Long
                customerStartPos = InStr(namePartWithoutLineBreak, "顧客:")

                ' "顧客:" が見つかった場合、その直前までを名前の部分として取得します
                If customerStartPos > 0 Then
                    namePartBeforeCustomer = Left(namePartWithoutLineBreak, customerStartPos - 1)
                Else
                    ' "顧客:" が見つからなかった場合(念のため)、改行削除後の文字列全体を使用します
                    namePartBeforeCustomer = namePartWithoutLineBreak
                End If

                ' 全角スペースと半角スペースを削除します
                formattedName = Replace(namePartBeforeCustomer, " ", "") ' 全角スペース
                formattedName = Replace(formattedName, " ", "") ' 半角スペース

                ' "●" のような、名前に含めたくない文字を削除します
                ' もし他にも除外したい文字があれば、ここに Replace 関数を追加してください
                formattedName = Replace(formattedName, "●", "")

                ' E列に表示させる文字列を作成します
                targetString = "北恵桧家 " & formattedName & "様邸 先行配線写真"

                ' E列のセルに結果を表示します
                ws.Cells(i, "E").Value = targetString
            End If
        End If

    Next i

    MsgBox "E列の処理が完了しました!", vbInformation

End Sub

今回のコードの主な変更点:

  • 抽出範囲の限定: 「名前:」の後に続く文字列から、「顧客:」が見つかるまでの部分を抽出するようにしました (Left 関数を使用)。これにより、意図しない情報が名前として抽出されるのを防ぎます。
  • 「●」の削除: 抽出・整形された名前の部分から、「●」を削除する処理を追加しました (Replace(formattedName, "●", ""))。もし他に削除したい文字があれば、この Replace 関数をコピーして、削除したい文字を指定するだけで対応できます。
  • マクロ名を FormatEColumnWithNewRules に変更しました。

このコードをVBAエディターに貼り付けて実行していただくと、ご希望通りの抽出と整形が行われるはずです。

もし、さらに細かい調整が必要だったり、他のケースについても対応させたいというご要望があれば、遠慮なくおっしゃってくださいね!😊

広告[Advertisement]

このチャットはプライベートです。投稿者のみがメッセージを送信できます。

チャット内容の閲覧は可能です。

AIの回答は正しいとは限りません。また、個人情報などの重要な情報は入力しないでください
0

48 件のコメント

読み込み中...
Your avatar