[[20190508102845]] 『マクロ初心者にできるでしょうか?』(mami) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロ初心者にできるでしょうか?』(mami)

Sheet1のA列に氏名、B列に年齢、C列に住所が10名分入った表があります。

これを、
1.各氏名でシートを作成
2.作成されたシート内の
 例えばD3にその人の年齢、H5に住所を反映させたい

この場合、マクロを作成したらできるのかなと
思って質問させていただきました。

反映させたいシートは、セル結合や大きさの調整をしていて、
空の原本を用意してあります。
現在は、そのシートをコピーし、名称変更、
各場所にデータをコピペしていますが、
どんどん人数が増えて困っております。。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


「マクロの記録」をお試しください。
わからないときは、検索窓にこの文字を入れて検索をかけると
親切なサイトがたくさんありますのでご参照ください。
(sheet無限増殖) 2019/05/08(水) 10:39

マクロの自動記録を何度か試したのですが、失敗してしまうのです。
(mami) 2019/05/08(水) 10:44

 それはマクロじゃないとダメなんですか?
 数式でも十分対応できそうですけど。
(コナミ) 2019/05/08(水) 10:52

全然何でも良いのです!できれば!
シート追加もできるんですか??
(mami) 2019/05/08(水) 10:53

 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(水) 11:54

 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


sheet無限増殖さん
虎さん

ありがとうございます。

考えていたのですが、
シートを追加してから、そのシート内の氏名を配置するセルを
シート名にするのか、
そもそもの表から氏名を選択してシート名にするのか…
というか、
記録するときに、1名分はその者を選択すれば良いと思うのですが、
10名分となるとどうやって記録するのか…

など、初心者も初心者なのでわからなくなってきてしまいました…
(mami) 2019/05/08(水) 12:56


もこな2さん

ありがとうございます!
1のパターンでやってみたいのです!
ちょっと1回今やってみます!
(mami) 2019/05/08(水) 12:58


もこな2さん

できましたーーーーーーー!
感動です。
(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


もこな2さん

さんぷる弐


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

を試してみたら
作成されないのですが、
原本シートを選択するくだりがないからですかね?

もしくは、個別でなく、全部一括でもなく、
一覧の中から、選択した人たちだけ作成
という形にするとしたら、
どうしたら良いのでしょうか?

(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


もこな2さん

ありがとうございます!
済方式でやってみました!
処理したら済になるやつも
かなり便利ですーーーー
本当にありがとうございます!!
(mami) 2019/05/16(木) 13:49


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.