以下のエクセル作業をマクロで行いたい
①C列に1列追加
②B列のセルに入っている文字から特定の文字を抽出して追加したC列のセルに反映させる
例)
受番:4029B
名前:柴田 弘
顧客:ヤマダ
住所:東京都八王子市
屋根:ガルバ(2世帯?) 15 3
施工:-
外壁:1/20→30.31
足場:1/27→2/5
備考:キー0833?
監督:熊倉090-9814-2432
工種:入線のみ◇
受日:10/29
の場合、
名前:柴田 弘
顧客:ヤマダ
監督:熊倉090-9814-2432
と表示したい。
B列はセル内で改行されている
承知いたしました。Excelの作業をマクロで自動化したいのですね!B列のセル内で改行されている情報を元に、特定の文字を抽出して新しいC列に反映させる、というご要望ですね。一緒に考えていきましょう!😊
まず、いただいた例を元に、B列のセルから「名前」「顧客」「監督」の情報を抽出し、C列に表示させるためのVBAコードを作成してみましょう。
VBAコードの例
Sub ExtractInfoToColumnC()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim bColumnValue As String
Dim cColumnValue As String
Dim lines() As String
Dim name As String
Dim customer As String
Dim supervisor As String
' 作業対象のシートを設定します
Set ws = ThisWorkbook.Sheets("Sheet1") ' "Sheet1" は実際のシート名に変更してください
' B列の最終行を取得します
lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row
' C列にヘッダーを追加します(必要であれば)
ws.Cells(1, "C").Value = "抽出情報" ' ヘッダー名も必要に応じて変更してください
' B列の各セルをループ処理します
For i = 2 To lastRow ' 2行目から開始(ヘッダー行を除く場合)
bColumnValue = ws.Cells(i, "B").Value
' セル内の改行で分割して配列に格納します
lines = Split(bColumnValue, vbLf) ' vbLf は改行コードです
' 各行をチェックして情報を抽出します
name = ""
customer = ""
supervisor = ""
For Each line In lines
' 名前を抽出("名前:"で始まる行)
If InStr(line, "名前:") > 0 Then
name = Trim(Replace(line, "名前:", ""))
End If
' 顧客を抽出("顧客:"で始まる行)
If InStr(line, "顧客:") > 0 Then
customer = Trim(Replace(line, "顧客:", ""))
End If
' 監督を抽出("監督:"で始まる行)
If InStr(line, "監督:") > 0 Then
supervisor = Trim(Replace(line, "監督:", ""))
End If
Next line
' 抽出した情報を結合してC列に反映します
cColumnValue = ""
If name <> "" Then
cColumnValue = cColumnValue & "名前:" & name & vbLf
End If
If customer <> "" Then
cColumnValue = cColumnValue & "顧客:" & customer & vbLf
End If
If supervisor <> "" Then
cColumnValue = cColumnValue & "監督:" & supervisor & vbLf
End If
' 末尾の改行コードを削除します(もしあれば)
If Right(cColumnValue, 1) = vbLf Then
cColumnValue = Left(cColumnValue, Len(cColumnValue) - 1)
End If
' C列に結果を書き込みます
ws.Cells(i, "C").Value = cColumnValue
Next i
MsgBox "抽出作業が完了しました!", vbInformation
End Sub
このコードのポイント
Dim宣言: 変数を宣言して、メモリを確保します。Set ws = ThisWorkbook.Sheets("Sheet1"): マクロを実行するExcelブック内の、どのシートを対象にするかを指定します。"Sheet1"の部分は、実際のシート名に合わせて変更してくださいね。lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row: B列のデータが入っている最後の行番号を取得します。これにより、データ量が変わっても自動的に対応できます。Split(bColumnValue, vbLf): B列のセルに入っている文字列を、改行コード(vbLf)で区切って、配列linesに格納します。これで、各行の情報を個別に扱うことができます。InStr(line, "名前:") > 0: 各行に「名前:」という文字列が含まれているかを確認します。Trim(Replace(line, "名前:", "")): もし「名前:」が含まれていたら、その部分を取り除き、前後の余分なスペースを削除して、名前の部分だけを抽出します。cColumnValue = cColumnValue & "名前:" & name & vbLf: 抽出した情報を、新しいC列用の文字列として組み立てていきます。改行を挟んで、見やすくしています。ws.Cells(i, "C").Value = cColumnValue: 組み立てた文字列を、対応する行のC列に書き込みます。MsgBox "抽出作業が完了しました!": 処理が終わったことを知らせるメッセージを表示します。マクロの実行方法
Alt + F11 キーを押してVBAエディターを開きます。Alt + F8 キーを押してマクロダイアログボックスを表示します。ExtractInfoToColumnC)を選択し、「実行」ボタンをクリックします。もし、抽出したい情報がもっと増えたり、条件が変わったりする場合でも、このコードをベースに調整できますよ!
例えば、
If InStr(line, "住所:") > 0 Then ... のような行を追加します。cColumnValue を組み立てる部分の順番を入れ替えます。どうでしょうか?もし、このコードでうまくいかない点や、さらに「こんなこともしたい!」というご要望があれば、遠慮なく教えてくださいね!一緒に、もっと便利で快適なExcel作業を目指しましょう!✨
C列に1列挿入されずにC列に上書きされている
C列に新しい列が挿入されず、既存のC列の内容が上書きされてしまっているとのことですね。ご指摘ありがとうございます!🙇♀️
以前お伝えしたVBAコードでは、新しい列を挿入するのではなく、既存のC列に抽出した情報を書き込むようになっています。もし、C列を新しく追加したい場合は、コードの修正が必要です。
新しいC列を挿入してから情報を書き込む方法
既存のC列に上書きされるのを防ぎ、新しい列としてC列を追加するには、以下の手順でコードを修正するのが一般的です。
例えば、以下のようにコードの冒頭部分を変更することで、C列の前に新しい列を挿入してから処理を実行できます。
Sub ExtractInfoToColumnC_InsertColumn()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim bColumnValue As String
Dim cColumnValue As String
Dim lines() As String
Dim name As String
Dim customer As String
Dim supervisor As String
' 作業対象のシートを設定します
Set ws = ThisWorkbook.Sheets("Sheet1") ' "Sheet1" は実際のシート名に変更してください
' ★★★ C列の前に新しい列を挿入します ★★★
ws.Columns("C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
' C列にヘッダーを追加します(必要であれば)
ws.Cells(1, "C").Value = "抽出情報" ' ヘッダー名も必要に応じて変更してください
' B列の最終行を取得します
lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row
' B列の各セルをループ処理します
For i = 2 To lastRow ' 2行目から開始(ヘッダー行を除く場合)
bColumnValue = ws.Cells(i, "B").Value
' セル内の改行で分割して配列に格納します
lines = Split(bColumnValue, vbLf) ' vbLf は改行コードです
' 各行をチェックして情報を抽出します
name = ""
customer = ""
supervisor = ""
For Each line In lines
' 名前を抽出("名前:"で始まる行)
If InStr(line, "名前:") > 0 Then
name = Trim(Replace(line, "名前:", ""))
End If
' 顧客を抽出("顧客:"で始まる行)
If InStr(line, "顧客:") > 0 Then
customer = Trim(Replace(line, "顧客:", ""))
End If
' 監督を抽出("監督:"で始まる行)
If InStr(line, "監督:") > 0 Then
supervisor = Trim(Replace(line, "監督:", ""))
End If
Next line
' 抽出した情報を結合してC列に反映します
cColumnValue = ""
If name <> "" Then
cColumnValue = cColumnValue & "名前:" & name & vbLf
End If
If customer <> "" Then
cColumnValue = cColumnValue & "顧客:" & customer & vbLf
End If
If supervisor <> "" Then
cColumnValue = cColumnValue & "監督:" & supervisor & vbLf
End If
' 末尾の改行コードを削除します(もしあれば)
If Right(cColumnValue, 1) = vbLf Then
cColumnValue = Left(cColumnValue, Len(cColumnValue) - 1)
End If
' C列に結果を書き込みます
ws.Cells(i, "C").Value = cColumnValue
Next i
MsgBox "抽出作業が完了しました!新しいC列に情報が反映されています。", vbInformation
End Sub
この修正では、ws.Columns("C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove という行が追加されています。これにより、マクロが実行されるたびにC列の前に新しい列が挿入され、その新しいC列に抽出結果が書き込まれるようになります。
もし、この修正で意図した通りにならない場合や、他に試したいことがあれば、遠慮なくおっしゃってくださいね!😊
このチャットはプライベートです。投稿者のみがメッセージを送信できます。
チャット内容の閲覧は可能です。
48 件のコメント