[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ初心者にできるでしょうか?』(mami)
Sheet1のA列に氏名、B列に年齢、C列に住所が10名分入った表があります。
これを、
1.各氏名でシートを作成
2.作成されたシート内の
例えばD3にその人の年齢、H5に住所を反映させたい
この場合、マクロを作成したらできるのかなと
思って質問させていただきました。
反映させたいシートは、セル結合や大きさの調整をしていて、
空の原本を用意してあります。
現在は、そのシートをコピーし、名称変更、
各場所にデータをコピペしていますが、
どんどん人数が増えて困っております。。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
それはマクロじゃないとダメなんですか? 数式でも十分対応できそうですけど。 (コナミ) 2019/05/08(水) 10:52
CELL関数を使えばシート名をセルに反映できるので、シート名を反映した氏名をキーにして 年齢や住所を表示できるようにVLOOKUP関数などを使えばできるかと思います。
検索すれば抜き出し方などはたくさん出てきますよ。 (コナミ) 2019/05/08(水) 11:21
mamiさんはSheet1に入力されている名前でシートを作るのも自動でしたいといっているのではないか? (ねむねむ) 2019/05/08(水) 11:24
そうなんです!全部自動でできないかなと…
(mami) 2019/05/08(水) 11:37
>マクロの自動記録を何度か試したのですが、失敗してしまうのです。
とありますが、 マクロの自動記録自体が失敗してしまうのでしょうか? マクロの自動記録で得たコードを実行すると失敗してしまうのでしょうか?
(虎) 2019/05/08(水) 11:41
シートを追加
とか単品でするのはできるのですが、
追加・名前変更。。。と複数の作業を入れると
失敗します。そういうものなんですかね?
ボタン押して、ぱっと全部できるようにしておきたいなと
思ったのですが・・・
(mami) 2019/05/08(水) 11:48
mamiさん
マクロの自動記録自体は成功しているようなので、sheet無限増殖さんのおっしゃる通り、 まずはそのコードを提示していただけたらと思います。
そのコードをベースとして、修正していくことで、 >ボタン押して、ぱっと全部できるようにしておきたいなと も実現すると思います。 初心者であればこそ、焦らずに少しずつ進めていきましょうよ(^^)
(虎) 2019/05/08(水) 12:04
>マクロ初心者にできるでしょうか?
やる気と根気さえあれば大抵のことは出来ますよ。
ご質問の内容から察するに
(1) 1回の処理で10名分の処理をしたい (2) 処理ごとに誰の分であるのかを指定して、一連の処理を自動化したい
という2パターン考えられますが、どちらでしょうか。
ただ、それぞれ
(1)ループ処理 (2)ユーザーが何らかの選択をしてマクロに伝える処理
という部分が絡んでくると思いますので、いずれにしろマクロの記録からもう1歩踏み出す必要はでてくるとおもいます。
たとえば↓みたいなデータだったとして
__A_____B____C__ 1 鈴木 56 北海道 2 田中 48 宮城 3 佐藤 37 沖縄 4 伊藤 55 鹿児島 5 伊東 50 宮崎 6 井藤 40 神奈川 7 井土 44 香川 8 井門 49 愛媛 9 中野 38 山形 10 中田 29 山口
とりあえずのたたき台として↓のようなコードにすればよいと思います。
(同じ名前のシートが既にあった場合はエラーになりますが。。。)
Sub さんぷる壱() Dim i As Long
With Worksheets("名簿") For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row Sheets("原本").Copy After:=Sheets(Sheets.Count)
Worksheets(Worksheets.Count).Name = .Cells(i, "A").Value Worksheets(Worksheets.Count).Range("D3").Value = .Cells(i, "B").Value Worksheets(Worksheets.Count).Range("H5").Value = .Cells(i, "C").Value Next i End With
End Sub *-------------------------------------------------------------------------------------* Sub さんぷる弐() Dim i As Variant, buf As String
buf = InputBox("対象者の名前を入力")
With Worksheets("名簿") i = Application.Match(buf, .Range("A1:A10"), 0)
If IsError(i) Then MsgBox "入力された人はリストにいません" Else Worksheets(Worksheets.Count).Name = .Cells(i, "A").Value Worksheets(Worksheets.Count).Range("D3").Value = .Cells(i, "B").Value Worksheets(Worksheets.Count).Range("H5").Value = .Cells(i, "C").Value End If End With
End Sub
(もこな2) 2019/05/08(水) 12:47
ありがとうございます。
考えていたのですが、
シートを追加してから、そのシート内の氏名を配置するセルを
シート名にするのか、
そもそもの表から氏名を選択してシート名にするのか…
というか、
記録するときに、1名分はその者を選択すれば良いと思うのですが、
10名分となるとどうやって記録するのか…
など、初心者も初心者なのでわからなくなってきてしまいました…
(mami) 2019/05/08(水) 12:56
ありがとうございます!
1のパターンでやってみたいのです!
ちょっと1回今やってみます!
(mami) 2019/05/08(水) 12:58
できましたーーーーーーー!
感動です。
(mami) 2019/05/08(水) 13:11
コードの意味とか、
調べたら理解できますかね??
みなさま本当にありがとうございます。
(mami) 2019/05/08(水) 13:16
解決されたようで何よりです(^^)
たとえば、『vba シートのコピー』というように、『vba やりたいこと』とかで調べると、 いろいろと参考になるページが見つかると思います。
もこな2さんのさんぷる壱のコードだと、↓が参考になるかと思います。 http://officetanaka.net/excel/vba/tips/tips130.htm http://officetanaka.net/excel/vba/statement/ForNext.htm http://officetanaka.net/excel/vba/sheet/sheet05.htm
(虎) 2019/05/08(水) 13:30
ありがとうございます!
特に1つめのリンクが難しくて
今のところさっぱりでしたが、
読み込んで少しずつ理解できたらと思います。
マクロが使えると本当に便利なんですね。
みなさんがうらやましいです!
がんばって勉強します!
(mami) 2019/05/08(水) 14:48
【さんぷる壱】で使っている主な命令を並べるとこんな感じでしょうか(虎さんとかぶっているものもありますが・・)
■Withステートメント
マクロの記録でもさりげなく出てくることがありますが、今回のケースでは出てこないかもです。 http://officetanaka.net/excel/vba/beginner/16.htm
■(シートオブジェクトの)COPYメソッド
マクロの記録で出てきます。 http://officetanaka.net/excel/vba/sheet/sheet05.htm
■For 〜 Nextステートメント
ループ処理と言った部分です。マクロの記録では出てきません http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_for_next.html
■Endプロパティ、Rowプロパティ
マクロの記録ではでてこなかったような・・(あやふや) http://www.niji.or.jp/home/toru/notes/8.html http://officetanaka.net/excel/vba/tips/tips130.htm
■Countプロパティ
マクロの記録では出てきません(たぶん) https://www.vba-ie.net/property/count.php 【どこに】コピーしたシートを挿入するか コピー挿入したシートは【どれ】なのか特定するために使っています。 シートに行が何行あるのかの特定にも使ってますね。
■Nameプロパティ
マクロの記録で出てきます。 そのまま、シートの名前を設定する(変える)のに使っています。
■Valueプロパティ
マクロの記録で出てくる・・・とおもったら出ないですね(ちょっと試しただけですが) セルに値をいれたり、セルの値を取得(調べたり)するときに使います。 さんぷるでは、シート名を【何】という名前にすればいいのか、 指定したセルの【何】に【何】を入れればいいのかという指示に使っています。
また、マクロ初心者とのことなので(私も似たようなものですが)
↓も参考になるかもしれません。
■変数について
http://officetanaka.net/excel/vba/variable/
■デバッグ作業について(ステップ実行)
https://www.239-programing.com/excel-vba/basic/basic023.html
■デバッグ作業について(ブレークポイント)
https://www.239-programing.com/excel-vba/basic/basic022.html
どこから手をつけていいかわからないという場合は、みなさんが指摘されているとおり「マクロの記録」でエクセル君にたたき台を作ってもらい、ステップ実行で1行ずつ実行してみて、要らない部分(無駄なセルのselect、画面のスクロールなど)と必要な部分(シートコピーする命令、シートの名前を変える命令)を見分ける練習をしてみてはどうでしょうか
(もこな2) 2019/05/09(木) 12:47
全然初心者じゃないです、
そしたら私はゴミ以下です…
少しずつでも習得していこうと思っています!
(mami) 2019/05/09(木) 13:00
さんぷる弐
Dim i As Variant, buf As String
buf = InputBox("対象者の名前を入力")
With Worksheets("名簿") i = Application.Match(buf, .Range("A1:A10"), 0)
If IsError(i) Then MsgBox "入力された人はリストにいません" Else Worksheets(Worksheets.Count).Name = .Cells(i, "A").Value Worksheets(Worksheets.Count).Range("D3").Value = .Cells(i, "B").Value Worksheets(Worksheets.Count).Range("H5").Value = .Cells(i, "C").Value End If End With
End Sub
もしくは、個別でなく、全部一括でもなく、
一覧の中から、選択した人たちだけ作成
という形にするとしたら、
どうしたら良いのでしょうか?
(mami) 2019/05/16(木) 11:15
>原本シートを選択するくだりがないからですかね?
正しくは、選択するのではなく、原簿シートを(末尾に)コピー挿入をする命令がないです。
Sub さんぷる弐_修正() Dim i As Variant, buf As String buf = InputBox("対象者の名前を入力")
With Worksheets("名簿") i = Application.Match(buf, .Range("A1:A10"), 0) If IsError(i) Then MsgBox "入力された人はリストにいません" Else '▼「原簿}シートを末尾にコピー挿入 Sheets("原本").Copy After:=Sheets(Sheets.Count)
Worksheets(Worksheets.Count).Name = .Cells(i, "A").Value Worksheets(Worksheets.Count).Range("D3").Value = .Cells(i, "B").Value Worksheets(Worksheets.Count).Range("H5").Value = .Cells(i, "C").Value End If End With End Sub
>もしくは、個別でなく、全部一括でもなく、
>一覧の中から、選択した人たちだけ作成
>という形にするとしたら、
>どうしたら良いのでしょうか?
どのように【選択】するのかが肝になりそうです。
たとえば、名簿シートのA列に名前を書いておき、対象の場合B列になんらかの印をつける(つけない)ということなら、さんぷる壱に少し手を加えるとよいとおもいます。
*----------------------------------------------------------------------------* Sub さんぷる参() Dim i As Long With Worksheets("名簿") For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
'B列がブランクでない場合 If .Cells(i, "B").Value <> "" Then Sheets("原本").Copy After:=Sheets(Sheets.Count) Worksheets(Worksheets.Count).Name = .Cells(i, "A").Value Worksheets(Worksheets.Count).Range("D3").Value = .Cells(i, "B").Value Worksheets(Worksheets.Count).Range("H5").Value = .Cells(i, "C").Value End If
Next i End With End Sub *----------------------------------------------------------------------------* Sub さんぷる肆() Dim i As Long With Worksheets("名簿") For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
'B列が「済」でない場合 If .Cells(i, "B").Value <> "済" Then Sheets("原本").Copy After:=Sheets(Sheets.Count) Worksheets(Worksheets.Count).Name = .Cells(i, "A").Value Worksheets(Worksheets.Count).Range("D3").Value = .Cells(i, "B").Value Worksheets(Worksheets.Count).Range("H5").Value = .Cells(i, "C").Value .Cells(i, "B").Value = "済" '←処理したら「済」にする End If
Next i End With End Sub
(もこな2) 2019/05/16(木) 12:42
ありがとうございます!
済方式でやってみました!
処理したら済になるやつも
かなり便利ですーーーー
本当にありがとうございます!!
(mami) 2019/05/16(木) 13:49
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.