[[20180406103426]] 『1行ずつ繰り返しコピーして処理したい』(今日からマクロ) ページの最後に飛ぶ

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

 

『1行ずつ繰り返しコピーして処理したい』(今日からマクロ)

マクロ初心者です。
作りたい物があり、マクロに手を出してみたのに
しょっぱなから躓いています。

過去ログも「繰り返し」で検索してみたのですが
同じような質問が見つけられませんでした。

1つのbookの中に"請求書"と"テスト"という2枚のシートがあります。
"請求書"はコピー元となる項目がブランクになっているひな形です。

テストというシートには以下のようなデータがあります

  A B C
1 得意先 商品名 価格
2 こぶた りんご 200
3 たぬき バナナ 100
4 きつね みかん 300



行数はその月によって異なります。

A列の得意先毎に請求書を発行します。
請求書は1得意先=1シートで作成します。

データのある行が無くなるまで繰り返しをしたいので検索したところ
Do Loop?とかFor Next?とかを使うようなのですが
二つの違いも、どのように組み立てるのかもまだわかっていません。

第一段階として、記録マクロを使って作ったのが以下です。


Sub 自動化したい()
'
' 自動化したい Macro
' 請求書ひな形をコピーして得意先毎にシートを作って値を入れる
'

'

    Sheets("請求書").Select
        Sheets("請求書").Copy After:=Sheets(2)
            Sheets("テスト").Select
                Range("A2").Select
                 Selection.Copy
        Sheets("請求書 (2)").Select
             Sheets("請求書 (2)").Name = "こぶた"
                 Range("A12:G12").Select
                    ActiveSheet.Paste
           Sheets("テスト").Select
                  Range("B2").Select
                    Application.CutCopyMode = False
                Selection.Copy
        Sheets("こぶた").Select
                Range("C28:I28").Select
                    ActiveSheet.Paste
        Sheets("テスト").Select
                Range("C2").Select
                  Application.CutCopyMode = False
                Selection.Copy
        Sheets("こぶた").Select
              Range("J28").Select
                  ActiveSheet.Paste
                ActiveSheet.Paste
        Application.CutCopyMode = False

    Sheets("請求書").Select
        Sheets("請求書").Copy After:=Sheets(3)
            Sheets("テスト").Select
                Range("A3").Select
                  Selection.Copy
        Sheets("請求書 (2)").Select
            Sheets("請求書 (2)").Name = "たぬき"
                 Range("A12:G12").Select
                     ActiveSheet.Paste
           Sheets("テスト").Select
                  Range("B3").Select
                    Application.CutCopyMode = False
                Selection.Copy
        Sheets("たぬき").Select
               Range("C28:I28").Select
                    ActiveSheet.Paste
        Sheets("テスト").Select
                Range("C3").Select
                  Application.CutCopyMode = False
                Selection.Copy
        Sheets("たぬき").Select
              Range("J28").Select
                  ActiveSheet.Paste
                ActiveSheet.Paste
        Application.CutCopyMode = False

    Sheets("請求書").Select
        Sheets("請求書").Copy After:=Sheets(4)
            Sheets("テスト").Select
                Range("A4").Select
                  Selection.Copy
        Sheets("請求書 (2)").Select
            Sheets("請求書 (2)").Name = "きつね"
                 Range("A12:G12").Select
                     ActiveSheet.Paste
           Sheets("テスト").Select
                  Range("B4").Select
                    Application.CutCopyMode = False
                Selection.Copy
        Sheets("きつね").Select
               Range("C28:I28").Select
                    ActiveSheet.Paste
        Sheets("テスト").Select
                Range("C4").Select
                  Application.CutCopyMode = False
                Selection.Copy
        Sheets("きつね").Select
              Range("J28").Select
                  ActiveSheet.Paste
                ActiveSheet.Paste
        Application.CutCopyMode = False

    Sheets("テスト").Select
End Sub


当たり前ですが、それぞれセルを目視で指定してコピーしているので
「こぶた」「たぬき」「きつね」とシート名はなってしまいます。
自動でA列の値をシートの名前としたい場合は、どのような構文を使うのでしょうか。

商品名と価格に関しても、セルをコピーしているのでセルの番地にはなっていますが
自動的に1行ずつ、にはなりません。
自動で1行ずつ貼り付けるためには、どのような構文を使うのでしょうか。

教えて頂けますか?

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


>自動でA列の値をシートの名前としたい場合は、どのような構文を使うのでしょうか。
提示されたコードでシートの名前をつけている(変更している)部分があるので、そこに注目してみましょう。
たとえば、以下を実行するとどうなるかわかりますか?(というか、どうなりましたか?)
 Sheets("請求書 (2)").Name = "きつね"

>商品名と価格に関しても、セルをコピーしているのでセルの番地にはなっていますが
>自動的に1行ずつ、にはなりません。
質問がよく理解できませんが、取引先に対するデータが1件だけとも思えないので、こういうのは1行ずつ見ていくのではなくて、たとえばオートフィルタで取引先が「きつね」のものをフィルタリングしたうえで、まるっとコピペすると楽ちんだとおもいます。

※取引先一覧がほしいのであれば、データから取引先の部分だけほかのシートにコピーして、「重複の削除」を実行してやればできますよね。
(もこな2) 2018/04/06(金) 10:59


 こういうことですか?素人が作ったマクロなので参考程度に…。

 Sub test()

     Dim i As Long, cnt As Long

     Application.ScreenUpdating = False

     For i = 2 To Sheets("テスト").Cells(Rows.Count, 1).End(xlUp).Row
         Sheets("請求書").Copy After:=Sheets(Sheets.Count)
         cnt = Sheets.Count
         Sheets(cnt).Name = Sheets("テスト").Cells(i, 1).Value
         Sheets("テスト").Cells(i, 1).Copy Sheets(cnt).Range("A12:G12")
         Sheets("テスト").Cells(i, 2).Copy Sheets(cnt).Range("C28:I28")
         Sheets("テスト").Cells(i, 3).Copy Sheets(cnt).Range("J28")
     Next

     Sheets("テスト").Select

     Application.ScreenUpdating = True

 End Sub
(bi) 2018/04/06(金) 11:01

もこな2様

ありがとうございます。
一瞬で出来ました!すごい!!
おっしゃるとおり、データを抽出(フィルタリング)もやりたいと思っております。
まずはいただいたマクロを参考にアレンジしてみます!

ありがとうございました。
(今日からマクロ) 2018/04/06(金) 11:36


>どのように組み立てるのかもまだわかっていません

ども^^
どのようにVBAのコードで書くかはさておき、
最初に作業の流れを整理しましょう。

0)プログラム始め
1)「テスト」シートの「A2セル」から下へ見て行って空白のセルが出てくるまで順次繰り返す
2)もし、今見ているセルの値のシートが無ければ
2-1)その時は、「請求書」シートをコピーしてシート名に今のセルの値を付ける
3)セルの値と同じシート名の最終データの下に今見ているセルの行全体をコピペ
4)次のセルを見て、2番に戻る
5)プログラム終わり

とりあえず練習なので繰り返し処理はDo〜Loopで書いてみたらいいと思います。
出来れば次にFor〜Nextで同じループをしてみて、
さらにFor Each 〜 Nextまで書けるようになれば繰り返し処理はマスター出来たと
言えると思います。

例えばこんな風に書いてみて動きを確認します。
変数「i」が行番号に対応します。

Sub 練習Do_Loop()

    Dim i As Long

    i = 2
    Do While Cells(i, "A").Value <> ""
        Cells(i, "A").Select
        i = i + 1
    Loop
End Sub

VBEの画面とエクセルの画面が両方見えるように調整し、
F8キー押下で1行づつ実行し、
ローカルウィンドウで変数「i」の中身の値の変化を確認しながら、
画面上で選択されるセルを監視して変化を確認してみてください。
参考URL>>
http://vbaexcel.seesaa.net/article/139508293.html

 >過去ログも「繰り返し」で検索してみたのですが
 >同じような質問が見つけられませんでした。
機能でしたっけ、サンプルを書きました。↓
https://www.excel.studio-kazu.jp/kw/20180402234321.html
気分を害されたようで返事が無いようですが^^;
(まっつわん) 2018/04/06(金) 11:52


ループの話はまっつわんさんが丁寧に説明されてますので、
そちらをご覧になっていただくとして、私は別の部分を。

たとえば、

 Range("A2").Select
 Selection.Copy

 Sheets("きつね").Select
 ActiveSheet.Paste

のように、

 ○○を選択して
 選択している(アクティブになっている)ものを××する

という記述になっているところがありますが、

 ○○を××する

という記述にすることもできます。

さらに、

 ○○○.Copy
 ×××.Paste

となっている部分も、

 ○○○.Copy ×××

のように、biさんが示されたように1行で記述することも可能ですのでこういったテクニックを使ってコードを短く、見やすくすることができます。

ちなみにオートフィルタ作戦ですが、biさんが示されたような形式でデータがほしいのであれば、ちょっとアプローチが違うので忘れてください。(取引先ごとにデータを振り分けたいのだと勘違いしました)

(もこな2) 2018/04/06(金) 12:52


コメント返信:

[ 一覧(最新更新順) ]


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