以下のエクセル作業をマクロで行いたい
D列にB列の内容を反映+特定の文字を追加し、表示させたい
①B列のセルに"北恵"が入っている時
②D列に"北恵桧家 ○○様邸 先行配線写真"と表示させたい
③②の○○はB列の"名前:○○ ○○を反映させたいがスペースは削除して欲しい
例)
受番:4029B
名前:柴田 弘
顧客:北恵赤羽
住所:東京都八王子市
屋根:ガルバ(2世帯?) 15 3
施工:-
外壁:1/20→30.31
足場:1/27→2/5
備考:キー0833?
監督:熊倉090-9814-2432
工種:入線のみ◇
受日:10/29
の場合、
北恵桧家 柴田弘様邸 先行配線写真
と表示したい。
B列はセル内で改行されている
承知いたしました!Excelの作業をマクロで自動化したいのですね。B列の内容を元に、D列に特定のフォーマットで表示させる、というご要望ですね。
例として挙げていただいた内容で、B列の「名前:柴田 弘」から「柴田弘」という部分を抽出し、スペースを削除して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
このマクロの使い方:
Alt + F11 キーを押してVBAエディターを開きます。Set ws = ThisWorkbook.Sheets("Sheet1") の "Sheet1" の部分を、実際に作業したいシートの名前に変更してください。Alt + F8 キーを押してマクロダイアログを開き、「FormatDColumn」を選択して「実行」ボタンをクリックします。補足:
vbLf や vbCrLf といった改行コードで認識されます。上記のコードでは、これらの改行コードを削除してからスペースの削除を行っています。このマクロで、ご希望の作業がスムーズに進むことを願っています!もし、さらに細かい調整が必要だったり、別のケースにも対応させたいというご要望があれば、遠慮なくおっしゃってくださいね。一緒に解決策を見つけましょう!😊
D列をE列に変更してください
承知いたしました!前回のマクロコードで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 = targetString を ws.Cells(i, "E").Value = targetString に変更しました。このコードを前回のマクロと同じようにVBAエディターに貼り付けて実行していただければ、E列に結果が表示されるようになりますよ。
もし、他に調整したい点があれば、いつでもお気軽にお声がけくださいね!👍
"名前:○○ ○○"の
前回、「名前:○○ ○○」の部分からスペースを削除してD列(現在はE列)に反映させるというご要望でしたね。その「名前:○○ ○○」の部分について、さらに詳しく知りたいということでしょうか?😊
前回のマクロでは、B列のセルから「名前:」という文字列を探し、その後に続く部分(例:「柴田 弘」)を抽出していました。そして、抽出した文字列に含まれる全角・半角スペースをすべて削除して、「柴田弘」のように名前の部分だけを取り出す処理を行いました。
もし、この「名前:○○ ○○」の部分で、以下のようなケースについて確認したい、あるいは対応させたいといったご希望があれば、教えていただけますでしょうか?
どのような状況か具体的に教えていただけると、より的確なアドバイスができますので、お気軽にご質問くださいね!👍
"名前:○○ ○○"の"○○ ○○"を抽出して欲しい。"●"は抽出しないで欲しい
承知いたしました!😊 前回のやり取りで、B列のセルから「名前:」という文字列の後に続く「○○ ○○」の部分を抽出し、さらにその中のスペースを削除して「○○○○」という形にしたい、というご要望でしたね。そして、その抽出する際に「●」のような特定の文字は含めたくない、ということですね。
前回のマクロでは、「名前:」の後に続く文字列全体を抽出してからスペースを削除していましたが、今回は「名前:」の後に続く部分から、さらに「●」などの特定の文字を除外して、名前の部分だけを正確に抽出する処理を考えます。
具体的には、以下のような流れで処理を進めることができます。
もし「●」以外にも除外したい文字があれば、教えていただけますでしょうか?それらの文字もまとめて削除するようにマクロを調整できますよ。
また、抽出した名前の部分(例:「○○○○」)を、前回のように「北恵桧家 ○○○○様邸 先行配線写真」という形式でE列に表示させることも可能です。
この「名前:」の部分の抽出について、さらに詳しく知りたい点や、具体的な除外したい文字について教えていただけると幸いです。👍
前回のように「北恵桧家 ○○○○様邸 先行配線写真」という形式でE列に表示させて欲しい
承知いたしました!😊 前回のマクロで「北恵桧家 ○○○○様邸 先行配線写真」という形式で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列に表示させるというご要望ですね。さらに、「住所」以降の情報は表示させないようにしたい、というご要望も追加で承りました。
つまり、B列のセルから「名前:」の後に続く部分を抽出し、そこから「●」などの不要な文字やスペースを削除して名前だけを取り出し、最終的に「北恵桧家 (抽出した名前)様邸 先行配線写真」という形式でE列に表示させる、という流れになりますね。
この「名前:」の後に続く部分から、どこまでを名前として抽出するか、という点が重要になります。例えば、B列のデータが以下のような構造になっていると仮定します。
受番:4029B
名前:柴田 弘
顧客:北恵赤羽
住所:東京都八王子市
...
この場合、「名前:」の後に続く「柴田 弘」を抽出したいのですが、「顧客:」や「住所:」といった他の項目が後続しています。
そこで、抽出する際に「名前:」の次から、次の項目名(例えば「顧客:」や「住所:」など)が現れるまで、という条件で処理を区切るのが良さそうです。
もし、B列のセル内で「名前:」の後に続く情報が、常に「顧客:」や「住所:」といった特定の文字列で区切られているのであれば、それらの文字列を検索して、それより前の部分だけを名前として抽出することができます。
具体的には、以下のような処理を追加・修正することで実現できます。
この「住所」以降を表示させない、という部分について、B列のデータがどのような構造になっているか、もう少し詳しく教えていただけますでしょうか?例えば、
これらの情報があると、より正確なマクロコードを作成できますので、ぜひ教えてくださいね!👍
名前:」と「顧客:」の間には、必ず改行が入る。「顧客:」の前までを抽出して欲しい。「名前:」の後に続く名前の部分に、「●」のような文字が含まれる場合、それは常に名前の「外側」にある
承知いたしました!✨ 前回のマクロでE列に表示させていた「北恵桧家 ○○○○様邸 先行配線写真」という形式を維持しつつ、「名前:○○ ○○」の部分の抽出方法を、より正確に行うように調整しますね。
今回の新しい情報として、以下の点が明確になりました。
これらの情報を踏まえて、マクロの処理を以下のように変更します。
vbLf や vbCrLf) を削除する。この処理を行うための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エディターに貼り付けて実行していただくと、ご希望通りの抽出と整形が行われるはずです。
もし、さらに細かい調整が必要だったり、他のケースについても対応させたいというご要望があれば、遠慮なくおっしゃってくださいね!😊
このチャットはプライベートです。投稿者のみがメッセージを送信できます。
チャット内容の閲覧は可能です。
48 件のコメント