[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
>商品名と価格に関しても、セルをコピーしているのでセルの番地にはなっていますが
>自動的に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
ありがとうございます。
一瞬で出来ました!すごい!!
おっしゃるとおり、データを抽出(フィルタリング)もやりたいと思っております。
まずはいただいたマクロを参考にアレンジしてみます!
ありがとうございました。
(今日からマクロ) 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.