[[20180601163036]] 『自動で転記するマクロを作りたい』(尾崎真っ黒) ページの最後に飛ぶ

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

 

『自動で転記するマクロを作りたい』(尾崎真っ黒)

関数は毎日使っていて大体わかっているマクロ初心者です。

購買管理ソフトからCSVで吐き出したデータExcelに取り込み、
Excel上で請求書を作成しています。

吐き出したデータは「請求一覧」というシートに入っており

	A	B	C	D	E	F
1	請求先	商品名	コード	摘要	単価	送り状番号
2
3
4
.
.
という並びになっています。

同じブックに「請求書」というシートがあり、これは請求書の空フォームです。
このシートを請求先の数(月によって違う)だけコピーし
シート名を請求先名にしています。

転記ミスが発生するので、自動化したいという要望があり、マクロ化を試みている次第です。

現在の手作業でのやり方としては、
1. 「請求一覧」の1行目にフィルターをつける
2. 昇順に、得意先を抽出(仮に先頭をA社とします)
3. 「請求書」シートをコピーし、「請求書(2)」というシート名を「A社」に変更
4. 「請求一覧」のA社のデータ(B〜F)を「A社」シートの該当箇所にコピペ

これを請求先の数だけ、繰り返しています。(平均50社)

とりあえず、マクロの自動記録を使って2社分記録してみました。
(自動記録なので長くてすみませんです。)


Sub 記録マクロ()
'
' フィルタ Macro
'
'
    Rows("1:1").Select
    Selection.AutoFilter

' 記録 Macro
'
'

    Rows("1:1").Select
    Selection.AutoFilter
    Range("G10").Select
    ActiveSheet.Range("$A$1:$J$25").AutoFilter Field:=1, Criteria1:="A"	'フィルタの先頭がA社なので
    Sheets("請求書").Select
    Sheets("請求書").Copy Before:=Sheets(18)
    Sheets("請求一覧").Select
    Range("A5").Select
    Selection.Copy
    Sheets("請求書 (2)").Select
    Sheets("請求書 (2)").name = "A"
    Range("A12:G12").Select
    ActiveSheet.Paste
    Sheets("請求一覧").Select
    Application.CutCopyMode = False
    Range("B5:B29").Select
    Selection.Copy
    Sheets("A").Select
    Range("F27").Select
    ActiveSheet.Paste
    Sheets("請求一覧").Select
    Range("F5:F29").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("A").Select
    Range("J27").Select
    ActiveSheet.Paste
    Range("J35").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
    Range("A12:G12").Select
    Sheets("請求一覧").Select
    Range("A26").Select
    ActiveSheet.Range("$A$1:$J$25").AutoFilter Field:=1, Criteria1:="B"	'フィルタの2番目がB社なので
    Range("A4").Select
    Selection.Copy
    Sheets("請求書").Select
    Application.CutCopyMode = False
    Sheets("請求書").Copy Before:=Sheets(19)
    Sheets("請求書 (2)").Select
    Sheets("請求書 (2)").name = "請求書 (2)"
    Sheets("請求一覧").Select
    Selection.Copy
    Sheets("請求書 (2)").Select
    Sheets("請求書 (2)").name = "B"
    Range("A12:G12").Select
    ActiveSheet.Paste
    Sheets("請求一覧").Select
    Range("B4:B28").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("B").Select
    Range("F27").Select
    ActiveSheet.Paste
    Sheets("請求一覧").Select
    Range("F4:F28").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("B").Select
    Range("J27").Select
    ActiveSheet.Paste
    Range("O32").Select
    Sheets("請求一覧").Select
    Rows("1:1").Select
    Application.CutCopyMode = False
    ActiveSheet.ShowAllData
    Selection.AutoFilter
End Sub


これですと、フィルタで抽出する請求先をあらかじめマクロに書き込んでおかなくてはならず、
また、当月に請求が無い得意先を入れておくとエラーが出る可能性もあるかと思います。

また、コピーしている商品名などが入ったB〜Fのデータも
1行しかない請求先もあれば、10行以上になる得意先もあり
あらかじめコピーする範囲を記録しているのではエラーが出るのではないかと思っています。

自動化したいのは、以下です。

1.A列の値を下方向に自動で見て行き、
  得意先の数だけ、自動的に「請求書」シートをコピーし、請求先の名前を付ける

2. 作成した「請求先名のシート」に「請求一覧」シートから対象のデータを自動で転記したい。

Do whileや、For next、If thenなど、ネットで調べていたのですがうまく整理が出来ません。

AutoFilrterのマクロを使う場合も、
抽出する対象をあらかじめCriteria1:=""で指定しておかなくてはならないという認識でよろしいでしょうか?

初心者すぎて「あきらめろ」と言われてしまうかもしれませんが
お助けいただけると幸いです。
宜しくお願い致します。

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


 私が よく理解出来なくて、恐縮ですが ^^
請求一覧 は 25〜32行しかないのでしょうか。
コードは何に対するコードですか。
数件でもサンプルを表示され、
請求書のフォーマット(当該箇所)等、詳細をさらに、ご説明されると、
たくさんの方から回答があるかもです。
いろいろ方法はあると思いますが。
いづれにしても
月毎に臨時の得意先マスターを先に作るといいかもです。
(隠居じーさん) 2018/06/01(金) 23:59

隠居じーさんさんのおっしゃるところもですが、

〇〇.Select
Selection.××
となっているところについて、多くの場合
〇〇.××
というように記述できます。

また、セル範囲を単純にコピペするのであれば、引数にコピー先をかいてあげることで、Pasteメソッドの代わりができます。


    Sheets("請求一覧").Select
    Range("F5:F29").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("A").Select
    Range("J27").Select
    ActiveSheet.Paste

    ↓

    Sheets("請求一覧").Range("F5:F29").Copy Sheets("A").Range("J27")

また、適宜空白行を入れたり、インデント入れ(字下げ)をすると、コードが見やすくなり、ご自身でもコードの構造が掴みやすくなると思います。

まずは、記録されたマクロを上記のようなところに注目して整理するところから始めてみてはどうでしょうか

(もこな2) 2018/06/02(土) 08:31


コメント返信:

[ 一覧(最新更新順) ]


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