質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

5回答

1304閲覧

Excelから特定の文字のみ抜き出したい。

Kirari

総合スコア32

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

2クリップ

投稿2020/02/19 03:21

編集2020/02/19 05:56

前提・実現したいこと

ExcelのデータA列にある各セルから名前だけ抜き出したいのです。
1個のセル各々には1人、複数人の名前とコメントが書いてあります。
下説明にあります(1)⇒(2)のようにしたいのです。

【追記】アドバイスをいただき追記いたしました。ありがとうございます。
改行を追記しました。「○○さん」はコメントの中にも存在しますが、コメントの中にある〇〇さんの後には改行はありません。

(1)<Excelにあるデータ>
A1セル:○○さん\改行 本日はテスト
A2セル:BBさん\改行vvさん\改行ccさん\改行 本日はBBさんありがとうございました。
A3セル:ddさん\改行FFさん\改行HHさん\改行GGさん\改行 テストテストテスト





A1000セル:zzさん\改行ccさん\改行HHさん\改行 晴れです。よろしくお願いいたします。

(2)<やりたいこと>
B1セル:○○さん\改行
B2セル:BBさん\改行vvさん\改行ccさん\改行
B3セル:ddさん\改行FFさん\改行HHさん\改行GGさん\改行





B1000セル:zzさん\改行ccさん\改行HHさん\改行

発生している問題・エラーメッセージ

コンパイルエラー 修正候補 ステートメントの最後と表示されました。 ※ActiveCell.FormulaR1C1の行で発生しました。

該当のソースコード

VBA

1Sub Do_While_Loop_Sam() 2 3 Dim i As Long 4 i = 1 5 Do While Cells(i,1) 6 Cells(i,1)=Cells(i,1)+1 7 i=i+1 8 Range(B1:B1000).Select 9 ActiveCell.FormulaR1C1 = "=LEFT(A1:A1000,FIND("さん",A1:A1000)+1" 10 11 Loop 12 End Sub

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

radames1000

2020/02/19 04:47

・コメントの中に「さん」という文字が含まれることはありませんか?(「みなさん」とか) ・VBA使用可能なら、タグに「VBA」を含めると回答が集まりやすいかもしれません。
Kirari

2020/02/19 04:57

ありがとうございます。VBAを追加しました。 コメントの中にも、確かに「さん」が含まれる可能性があります。 ⇒例えばですが、「〇〇さん 本日はありがとうございました。○○さんのご協力で……」の場合があります。この場合はLEFTやLENの関数を使っていくと良いのでしょうか?
radames1000

2020/02/19 05:10

ルールが明確であればいろいろ方法はあるかと思います。 最初の「〇〇さん △△さん 」といった部分ですが、 これは名前の後に必ずスペースがあるのでしょうか?(あるとしたら半角?全角?) そして、コメントの中で「さん」が使われるとき、そのあとにスペースは入りませんか?
Kirari

2020/02/19 05:30

ありがとうございます。〇〇さん △△さん ××さん のそれぞれの空欄には 「○○さん\n△△さん\n××さん\n」の改行が入ります。 コメントの中にある「〇〇さん」のあとには改行はありません。
radames1000

2020/02/19 05:44

「改行」であることは質問本文からは読み取れませんので、ぜひ本文を修正なさってください。 コードも変わってくると思います。
Kirari

2020/02/19 05:57

ありがとうございます。
guest

回答5

0

ExcelVBA

1Sub TEST() 2 With ActiveSheet.Range("B:B") 3 .Offset(, -1).Copy .Cells 4 .Replace " *", "" 5 End With 6End Sub

これでいいのかな?

やってることは列ごとコピペして、
全角スペース以降の文字列を長さ0の文字列に置き換えしてるだけ。
プログラミングを勉強するのもいいけど、エクセルの使い方を勉強してみては?
コードを書いている間にかたづく仕事です。
数式や機能を覚えた方が後で応用が利くかと思いました。

手動で数式でやるなら一番上の1個のセルに数式を入れて、フィルハンドルダブルクリックで、
十分かと。
それから、数式は一括で複数セルに入れることが可能なので、
ループの必要はないです。事前に入力したいセル範囲を取得必要はありますが。

あと、
複数セルを選択しても、
アクティブなセルは1つだけです。

投稿2020/08/11 08:00

編集2020/08/11 08:03
mattuwan

総合スコア2143

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kirari

2020/08/12 00:30

ありがとうございます。やってみます。
guest

0

「さん」と改行の組み合わせを後ろから検索してみました。

VBA

1Sub CleanupString() 2 Dim r As Range 3 For Each r In Range("A1").CurrentRegion 4 r.Offset(, 1).Value = Left(r.Value, InStrRev(r.Value, "さん" & Chr(10)) + 2) 5 Next 6End Sub

投稿2020/02/20 01:42

編集2020/02/20 01:51
radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kirari

2020/08/11 07:01 編集

返信が遅くなりまして申し訳ございません。ご回答ありがとうございます。上記を入れて実行すると、データがすべて「20」という数字に書き換わってしまいます(A列、B列、C列、D列……)。B列以降に影響を及ぼさないように、列を変更した方がいいのでしょうか。何回か試してみようと思います。
guest

0

編集後の質問だと、単純に「全角空白」より前を取り出せばいいことになりますね。

vba

1Sub Sample() 2 Dim c As Range 3 For Each c In Range("A1").CurrentRegion 4 c.Offset(, 1).Value = Split(c.Value, " ")(0) 5 Next 6End Sub

投稿2020/02/19 11:10

hatena19

総合スコア34053

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kirari

2020/08/11 07:01 編集

返信が遅くなりまして申し訳ございません。ご回答ありがとうございます。上記を入れて実行しますと、B列以降がA列と同じ内容に書き換わってしまいます。列を変更した方がいいのでしょうか。何回か試してみようと思います。
guest

0

こんにちは。よろしくおねがいいたします。
これは、いろいろな方法があると思いますが、とりあえず僕が思いついたのは以下のようなものです。

今、こういうシートがあって、これを”クリーンアップ”したいとき。

イメージ説明
こういうコードはどうでしょう?

VBA

1Option Explicit 2 3Sub CleanupString() 4'文字列から”さん"がついた人名の部分だけ取り出すプログラムです 5 6'A列に「BBさん vvさん ccさん 本日はありがとうございました」といった文字列があるとき、 7'B列に「BBさん vvさん ccさん 」を出力する 8 9Dim InputStringSet As String 10Dim CleanedString As String 11 12Dim ArrName As Variant 13Dim i As Long 14Dim r As Range 15 16'A列を、データがなくなる行まで 上から下までナメていきます 17For Each r In Range("A1", Range("A1").End(xlDown)) 18 19 'Anセルの文字列を得ます 20 InputStringSet = r.Value 21 22 '念のため、全角スペースを半角スペースに置換しておきます 23 InputStringSet = Replace(InputStringSet, " ", " ") 24 25 '"さん[半角スペース] "を、カンマに置換します 26 InputStringSet = Replace(InputStringSet, "さん ", ",") 27 28 'カンマで区切った単位で、いったん配列に格納します 29 ArrName = Split(InputStringSet, ",") 30 31 '配列に格納した名前を、順番に ”さん "をつけなおして つなぎなおします 32 '配列の最後のデータは’名前’ではない、という前提です 33 For i = 0 To UBound(ArrName) - 1 34 CleanedString = CleanedString & ArrName(i) & "さん " 35 Next i 36 37 '結果をB列に出力する 38 r.Offset(0, 1).Value = CleanedString 39 40 '次のループに備えてCleanedStringを初期化する 41 CleanedString = "" 42 43Next r 44 45End Sub 46 47

この結果は、こんなカンジです。

イメージ説明

”さん ”という文字列をいったんカンマに置き換えて、CSVみたいにみたてて、
それをSplitで刻んで、Arrayに入れて、
再度そのArrayを順番に得て、もいちど”さん "に戻す、というようなことをやってみました。

文字列の検索置換は、ほんとうにいろいろな解決法があります。
これはあくまで一例ですが、参考になれば...

投稿2020/02/19 04:42

AkiSaito

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

radames1000

2020/02/19 05:06

置換せずにいきなり配列に入れる方法もありますね。 ArrName = Split(InputStringSet, "さん ")
ttyp03

2020/02/19 05:16

最後の文字列化するところはReDimで1要素減らしたあとJoinが楽かと。 For Each r In Range("A1", Range("A1").End(xlDown)) ArrName = Split(r, " ") ReDim Preserve ArrName(UBound(ArrName)-1) r.Offset(0, 1).Value = Join(ArrName, " ") Next
Kirari

2020/08/11 06:56

返信が遅くなりまして申し訳ございません。ご回答ありがとうございます。上記を入れて実行しますと、B列以降のデータが消えてしまいます。何回か試してみようと思います。
guest

0

試してみてください

Sub tes() For r = 1 To 1000 'Cells(r, 2).Formula = "=LEFT(A" & r & ",FIND(""さん"",A" & r & ")+1)" Cells(r, 2).Formula = "=LEFT(R[]C[-1],FIND(""さん"",R[]C[-1] )+1)" Next End Sub

追記
"さん"の後に改行あると一人目しか拾えませんね

投稿2020/02/19 04:30

編集2020/02/19 06:58
sinzou

総合スコア392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kirari

2020/08/11 07:02

ご連絡遅くなりまして申し訳ございません。ご返信ありがとうございます。実行してみましたが、列のデータが変わりませんでした。何回か試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問