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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

2456閲覧

【マクロ】特定の列にて、ある単語から始まるデータを抽出したいです。

Gunjirk

総合スコア23

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2018/02/05 07:33

編集2018/02/05 07:52

前提・実現したいこと

こんにちは。
Excelのマクロを作成中です。
初心者で調べても全くわからないので、ご教授ください。

P列の「sudo」という単語から始まるデータのみを抽出して、別のExcelファイルにコピーして貼り付けるコードを教えていただきたいです。
業務で、ある列のデータのみを抽出する必要があるのですが、ネットでもやり方がわかりません。

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

コードがわからない。

該当のソースコード

なし

試したこと

オートフィルター機能も試してみましたが、特定の列のデータのみ抽出するやり方がわかりません。

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

オートフィルタを使った手作業でもよいなら、検索ボックスにsudo*と入れれば対象のもののみ抽出されます。

追記
不本意ですが基本的なコードを載せておきます。

VBA

1Dim wb As Workbook 2Dim ws As Worksheet 3Dim r As Long 4Set wb = Workbooks.Add ' 新規に作る場合 5'Set wb = Workbooks.Open "ブックファイル名" ' 既存ブックを開く場合 6Set ws = wb.Worksheets(1) ' 貼り付けたいシートを設定 7r = 1 ' 貼り付け先の開始行 8For Each c In Range("P:P") 9 If Left(c, 4) = "sudo" Then 10 ' A列にコピーしていく 11 ws.Cells(r, 1).Value = c 12 r = r + 1 13 End If 14Next

投稿2018/02/05 07:50

編集2018/02/05 08:05
ttyp03

総合スコア16998

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

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

Gunjirk

2018/02/05 07:55

ご回答ありがとうございます。 できればマクロコードで教えていただきたいです。 抽出したデータのみをコピーして別エクセルに貼り付けたいです。
rinren

2018/02/05 08:40

随分見慣れないと感じられるかもしれません。 きっとマクロの記録でこれまで乗り越えて来られたからだと思います。 ただ、そのマクロ記録には限界がありまして、ワークブックを跨ぐ処理が苦手だったり、汎用性に欠けるので直接自分でコードを書くことになります。 実際に手で書いてくれたコードなので、簡潔で分かりやすいものになっています。 仮にこれをマクロの記録で頑張ってやると、冗長なコード、無駄なコードが生成されますので、かえって学習コストが高くなりますし、方向が間違っています。この書き方に慣れる方がいいと思います。
rinren

2018/02/05 08:42

ちなみにこのコード望む動作をするはずです
Gunjirk

2018/02/05 08:58

ttyp03様 ご丁寧にコードを書いてくださってありがとうございます!! 実際に少し変えて入力してみたところ、毎回新しいブックに貼り付ける形になってしまい、ブックが30ほどできてしまう形になりました。 うまく最初だけ新規ブックに貼り付けをして、二回目以降はその一回目に新規作成したブックに貼り付けるようにするには、どうすればよいでしょうか。 もしよろしければご協力お願い致します。 試してみたコードは以下になります。 For Each c In Range("P:P") If Left(c, 4) = "sudo" Then ' A列にコピーしていく ws.Cells(r, 1).Value = c Dim wb As Workbook Dim ws As Worksheet Dim r As Long Set wb = Workbooks.Add ' 新規に作る場合 Set ws = wb.Worksheets(1) ' 貼り付けたいシートを設定 r = 1 ' 貼り付け先の開始行 r = r + 1 End If Next
Gunjirk

2018/02/05 09:00

rinren 様 アドバイスありがとうございます。 先週からVBAに触れだした初心者なので、コードの意味も分からない状態です。 自分で作ったコードも載せずに質問する形になってしまい、大変恐縮に思っております。
ttyp03

2018/02/05 09:02

えっと…。 なんでループ内にWorkbooks.Addとかの処理が移動しているんでしょうか…。 ループの外に出してください。 ていうかまずは回答したコードをそのまま試してみてもらえますか?
Gunjirk

2018/02/05 09:16 編集

すみません。 いただいたコードを試したのですが、貼り付けが行われなかったので、先にループをしてしまいました。 新しいブックを作成するだけになってしまいます。。
ttyp03

2018/02/05 09:18

一応手元の環境で動いたものを載せているつもりですが、ダメでしょうか? 今日はもう退社してしまうので、質問がある場合、明日以降の対応になります。 あとは自力でがんばってください。
ttyp03

2018/02/05 09:26

あ、すみません、追記しておきます。 おそらく貼り付けている場所が、対象としているシートではないんだと思います。 対象とするシートに貼り付けるか、For文を次のようにしてみてください。 For Each c In Worksheets("Sheet1").Range("P:P") "Sheet1"のシート名は適宜修正してください。
Gunjirk

2018/02/05 09:26

何故か白紙のブックを新規作成して終わりになってしまいます。 ループの前に、P列の「sudo」という単語から始まるデータのみを抽出することができれば、できそうだと素人なりに感じたのですが、どうでしょうか。 そうですか、、本日はお疲れ様です。 また明日、ご回答の程お待ちしております。 お忙しい中本日はこんな自分に付き合って下さりありがとうございました。
arasi

2018/02/05 09:32

これうまくいってない、 Workbook.Add の時点でActiveWorkbookが新規ブックの方になり新規ブックのP列を参照している なぜこれでうまくいっているかが疑問です
Gunjirk

2018/02/05 09:37

arasi様 ご回答ありがとうございます。 はい、僕も初めに新規ブックを開いてしまうので、無理だと思うのですが、、 如何せん初心者なもので、どう修正したらよいかわからない状態です。 もし修正点などございましたら、ご教授お願い致します。
ttyp03

2018/02/05 23:32

おふた方> いえ、例え新規ブックを作っても、明示的にActiveSheet.Rangeなどとしてアクティブシートを指定しない限りは、自身(つまりコードが書かれているシート)を参照するので問題ないのですよ。 昨日18:26に追記したように、コードの置き場所が参照したいP列があるシートではない、またはRangeの参照方法を変えることで対応可能です。
torisan

2018/02/05 23:40

横から失礼、私も最初はうまくいかないと思ったのですが 私含めて、プログラムを標準モジュールに書いていませんか? シートのモジュール(というのでしょうか?)に書いたら正常に動作しました。
arasi

2018/02/05 23:46

シートモジュールに書いたらうまくいきました シートモジュールに入れてと書いてよ
ttyp03

2018/02/05 23:53

arasiさん> うーん、書かなくても見ればわかると思うのですよ。 わからないなら知識が不足しているだけだと思いますよ。 逆に基本知識が足りないなら「標準モジュールにこのように書いたら動かなかった」や「どこに書けばいいですか?」とか聞いてくれればいいのにと思います。
arasi

2018/02/06 00:23 編集

私の基本知識が足りませんでした。ごめんね
Gunjirk

2018/02/06 00:40

ttyp03さん シートモジュールに書いたらうまくできました!! ずっとできなかったことができて、とても嬉しかったです! また、モジュールに種類があるとも知らずに、手間を取らせてしまい申し訳ございませんでした。 今回の質問のおかげで、たくさん勉強できました。 本当にありがとうございます。 皆様もコメントにてたくさん議論してくださりありがとうございました。 一人でネットで調べるよりも有意義な経験ができました。
guest

0

最初だけ新規ブックに貼り付けをして、二回目以降はその一回目に新規作成したブックに貼り付けるようにするには、どうすればよいでしょうか。

とのことですので、抽出結果.xlsファイルを作成するならこんな感じかなと思います。初心者様ということで、コメントいっぱいつけておきますので今後の足しにしてください。拡張子やファイル名は適当に変更してください。

vba

1 2Sub addcopy_v2() 3 4'抽出結果ファイルの名前を設定しています。2007以降であれば.xlsxとか使えますね。 5 6Const SaveName As String = "抽出結果.xls" 7 8'↓ここからはこれから使う変数を宣言してます。名称で何となく用途は想像してください。これは書いた人が勝手に決めます。 9'といっても何となく想像できる名前にしてあげることが大事です。ほかの人も使うことを考えると・・・。 10'私も得意ではないが・・・ 11 12Dim BaseWB As Workbook 13Dim BaseWS As Worksheet 14Dim WriteWB As Workbook 15Dim WriteSheet As Worksheet 16Dim CheckRange As Range 17Dim RangeBuf As Range 18Dim LastRow As Long 19Dim FSO As Object 20 21'ファイル探す為に、Scripting.FileSystemObjectオブジェクトを使います。 22'ほかにも方法はあると思いますが、慣れておいたほうがいいです。 23'参照設定(Microsoft scripting runtime)が必要な書き方。 24'Dim FSO As New Scripting.FileSystemObject 25 26'参照設定したくないならこの宣言 27Set FSO = CreateObject("Scripting.FileSystemObject") 28 29'検索対象のP列があるシート捕捉します。thisWorkbookは常にモジュール実行中(このコードが書いてあるほう)のブックを指します。そのワークシートインデックスが1のシートを捕捉。つまりBaseWbって分かりやすいように自分で決めた変数に格納して、後で色々いじくってやろうって魂胆です。 30Set BaseWS = ThisWorkbook.Worksheets(1) 31 32'上記で捕捉したBaseWSを使って、BaseWS.Range("P:P")と書くと、ThisWorkbook.Worksheets(1).Range("P:P")と同じ意味になります。 33'オブジェクトは階層を持っています。アプリケーション→ブック→シート→レンジって感じです。 34'辿るように操作したいセルにたどり着ければほぼ目的は達成できます。 35 36'↓heckRangeという変数に捕捉したワークブックのレンジを格納します。 37Set CheckRange = BaseWS.Range("P:P") 38 39'ご希望通り、2回目は追記(?)もしくは上書き動作になるように。抽出結果ファイルを自分と同じディレクトリで探します 40If FSO.FileExists(ThisWorkbook.Path & "\" & SaveName) = True Then 41 42 'もしあればそのブックを開きます 43 Set WriteWB = Workbooks.Open(ThisWorkbook.Path & "\" & SaveName) 44 45 'sheet1を捕捉します。 46 Set WriteSheet = WriteWB.Worksheets(1) 47Else 48 'なければ新規ブックを作成します 49 Set WriteWB = Workbooks.Add 50 51 'ActiveSheetを補足します。新規作成時においてsheet1を捕捉することになります。 52 Set WriteSheet = ActiveSheet 53End If 54 55'上記の処理で捕捉した抽出シートの最終行を探します。 56LastRow = WriteSheet.Cells(Rows.Count, 1).End(xlUp).Row 57If LastRow <> 1 Then LastRow = LastRow + 1 58 59'上書きならここで何らかの削除処理(シートごと消すのか、最終行から範囲を割り出して消すのか)今回は後者を書いておきます。 60'必要であればコメントを解除してください 61'========================= 62'With WriteSheet 63' .Range(.Cells(1, 1), .Cells(LastRow, 1)).ClearContents 64'End With 65' LastRow = 1 66'========================= 67 68'検索対象のP列があるシートの親、つまりブックをアクティブにします 69BaseWS.Parent.Activate 70 71'検索範囲をループします。 72For Each RangeBuf In CheckRange 73 74 'もし検索中のセルの先頭の4文字が"sudo"だったら、抽出シートの最終行に書き込みます。 75 If Left(RangeBuf.Value, 4) = "sudo" Then 76 WriteSheet.Cells(LastRow, 1).Value = RangeBuf.Value 77 78 '書き込み位置を次の位置にずらします。 79 LastRow = LastRow + 1 80 End If 81 82Next RangeBuf 83 84'保存しますか?的なメッセージを止めます。 85Application.DisplayAlerts = False 86WriteWB.SaveAs Filename:=ThisWorkbook.Path & "\" & SaveName 87WriteWB.Activate 88 89'保存しますか?的なメッセージを止めたのを元に戻します。処理実行後のアプリケーションの動作に影響が残るからです。 90Application.DisplayAlerts = True 91 92End Sub 93

投稿2018/02/05 13:20

編集2018/02/06 03:26
rinren

総合スコア107

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

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

Gunjirk

2018/02/06 00:43

rinrenさん コメントまでご丁寧にありがとうございます! とても分かりやすいので、今後のためにできるだけ理解できるように頑張ります! まさか、見ず知らずの他人のためにここまでしてくださる人がいるとは思わず、とても感動しています。 本当にありがとうございました。
Gunjirk

2018/02/06 01:40

たびたびすみません、いただいたコードを試すと、貼り付けはできるのですが、2行目から貼り付けられてしまい、1行目が空欄になってしまいます。 考えられる要因など御座いましたら、教えていただきたいです。
Gunjirk

2018/02/06 01:53

LastRow = WriteSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1 自分で考えてみて、上記の+ 1を消してみたら、直りました。 この対応で問題ないか、よろしければご確認お願い致します。
rinren

2018/02/06 02:59

そうですね。なぜそうしたかというと。列名を書きたい場合もあるか思いまして、そうしておきました。 コードの意味が分かるようになると、自分でいろいろできますね。頑張ってください。
Gunjirk

2018/02/06 03:18

ご返信と励ましのお言葉ありがとうございます! 自分の成長のために、teratailをどんどん活用していきたいと思います! 今後とも宜しくお願い致します。
rinren

2018/02/06 03:21

あ、ちなみに+1消すだけだと、二回目の実行結果が前回とかぶります。 lastrowが1以外だったら+1とするif文を追加するのが簡単かもしれません。
Gunjirk

2018/02/06 04:13

ご回答の修正までしていただき、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問