[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『『データリストから担当ごとに振分』』(未熟者)
はじめまして。
VBA初心者です。色々調べてみても未熟のためVBAを完成させることができないので御教示頂けませんでしょうか。何卒よろしくお願い致します。 。
明日の朝までに報告ファイルを70件ほど作成しなければなりません。
今後毎月発生する業務になります。
基になるデータから担当者ごと(ソート済)にデータを抽出し、テンプレートに転記するというマクロ処理です。
【基データ】
A B C D E
1 社員名 商品No. 商品名 上司ID 上司名
2 あああ 0000 AAA 6666 ○○
3 いいい 1111 BBB 6666 ○○
4 ううう 2222 CCC 7777 ■■
5 えええ 3333 DDD 8888 △△
6 おおお 4444 EEE 8888 △△
↓
【マクロ処理後】
○○(←上司名)ファイル.xlsx
A B C D E F G
1 ○○(←上司名)
2
3
4
5
6 2015年度商品売上リスト
7
8 ××××××××××××××
9 ××××××××
10
11 ___________
12 |氏名 |商品No.|商品名∣
13 |あああ| 0000 |AAA∣
14 |いいい| 1111 |BBB∣ ※罫線をひきたいです。
・
・
42
43
< 使用 Excel:Excel2013、使用 OS:Windows7 >
>明日の朝までに報告ファイルを70件ほど作成しなければなりません。
大変だろうとは思うけど 23:10 に投稿して、明朝までというのはないよねぇ。 とりあえず、大急ぎで書いてみたけど・・・
テンプレートシートを追加してください。6行目、8行目、9行目、12行目は、あらかじめセットしておいてください。 基シート、テンプレートシートのシート名は実際のものにしてくdさい。
上司別ブックをマクロブックと同じフォルダに保存します。
Sub Test() Dim z As Long Dim x As Long Dim shM As Worksheet Dim shT As Worksheet Dim c As Range Dim nBK As Workbook
Set shM = Sheets("Sheet1") '基シート Set shT = Sheets("テンプレート") 'テンプレートシート
z = shM.Cells(1, Columns.Count).End(xlToLeft).Column x = shM.Range("A" & Rows.Count).End(xlUp).Row - 1 shM.Columns("D").Copy shM.Cells(1, z + 2) shM.Columns(z + 2).RemoveDuplicates Columns:=1, Header:=xlYes shM.Cells(1, z + 4).Value = shM.Range("D1").Value shM.Cells(1, z + 6).Resize(, 5).Value = shM.Range("A1:E1").Value
For Each c In shM.Cells(1, z + 2).CurrentRegion If c.Row > 1 Then shM.Cells(2, z + 4).Value = c.Value shM.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=shM.Cells(1, z + 4).Resize(2), CopyToRange:=shM.Cells(1, z + 6).Resize(, 5), Unique:=False With shM.Cells(1, z + 6).CurrentRegion.Resize(, 3) shT.Range("A13").Resize(x, 3).ClearContents Intersect(.Cells, .Cells.Offset(1)).Copy shT.Range("A13") End With shT.Range("A1").Value = shM.Cells(2, z + 10).Value Sheets("テンプレート").Copy Set nBK = ActiveWorkbook With nBK.Sheets(1).Range("A12").CurrentRegion With .Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With End With Application.DisplayAlerts = False nBK.SaveAs ThisWorkbook.Path & "\" & shT.Range("A1").Value & ".xlsx" Application.DisplayAlerts = False nBK.Close End If Next
shM.Cells(1, z + 2).CurrentRegion.Clear shM.Cells(1, z + 4).CurrentRegion.Clear shM.Cells(1, z + 6).CurrentRegion.Clear
End Sub
(β) 2015/04/13(月) 00:26
(未熟者) 2015/04/13(月) 04:03
>1番下の上司から作成するためか
ん? 最初の上司から、上から下に作成していますが? 上司はD列のIDをエクセルの重複の削除機能をマクロ内で使用して ユニークにして、それをキーにしています。E列の名前は、結果的には 同じIDのものの、最初の ○○ になります。(ここは、最初でも最後でも同じですよね)
(β) 2015/04/13(月) 05:38
厚かましい御願いをして大変申し訳ございませんがご教示頂けないでしょうか。
余分な空白行を削除する方法をご教示頂けないでしょうか。
色々試してみたところ、行は削除されるものの案内文が消えてしまいます。
詳細は以下になります。
表との余白
C44のみ(MAXでC43まで入る予定です。)
【案内文】
C45〜C53
Range("C43").Select
Range(Selection, Selection.End(xlUp)).Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete Range("A1").Select
※こちらのコードだけで実行すると希望通りに処理しますが、
上記に記載頂いたコードに載せると行だけ消され、案内文が消えます。
大変お手数をおかけ致しますがよろしくお願いいたします。
(未熟者) 2015/04/16(木) 15:29
案内文が下にあるという説明がなかったので。 今から外出しますので、回答は早くて深夜。
(β) 2015/04/16(木) 15:46
(未熟者) 2015/04/16(木) 17:31
>1名しかいない方のファイルが作成されないようです。
アップされた例でいえば上司■■の ううう のケース? こちらでは、ちゃんとブックが生成されていますよ。
(未熟者) 2015/04/13(月) 04:03 で不具合の指摘があったけど、コードを変更していないのに (未熟者) 2015/04/16(木) 15:29 では、OKだったというレスがありましたね。 何かそちらのほうでのチェックが漏れていたのか、あるいはデータが不適切だったので、それを直してOKになったのか そこはわからないままだけど、原因は何だったのかな?
で、1名云々も、そちらの勘違いということはありませんか?
気になっていることがあります。同姓同名の上司の存在の可能性を考えて、ユニーク(だと思っている)上司IDで名寄せ、抽出しているわけだけど ファイル名としては、上司名だけになる。 コードは、再処理時に同名ファイルの上書きでメッセージがでないようにしている、いいかえれば無条件に 上書きしている。 ということは、名寄せ、抽出をIDごとにやっているのに、結局は(同姓同名の上司が存在すれば)前のものは 上書きされてしまう。ここは、コード作成時に配慮すべきだったと反省。
1名とか複数名ということではなく、たとえば
IDが6666、上司名が 〇〇。 IDが6666、上司名が 〇〇。
こんなデータがあったとしたら、ID6666のほうが、ID6666のもので上書きされて消えてしまう。
今回の原因がこれかどうかはわからないけど、これは、いかにも不都合なので以下のコードでは、勝手に保存時のファイル名を 6666_上司名.xlsx にしておきました。
空白行の削除、要件を取り違っている可能性もありますが、試してみてください。
Sub Test() Dim z As Long Dim x As Long Dim shM As Worksheet Dim shT As Worksheet Dim c As Range Dim nBK As Workbook Dim r As Range
Application.ScreenUpdating = False
Set shM = Sheets("Sheet1") '基シート Set shT = Sheets("テンプレート") 'テンプレートシート
z = shM.Cells(1, Columns.Count).End(xlToLeft).Column x = shM.Range("A" & Rows.Count).End(xlUp).Row - 1 shM.Columns("D").Copy shM.Cells(1, z + 2) shM.Columns(z + 2).RemoveDuplicates Columns:=1, Header:=xlYes shM.Cells(1, z + 4).Value = shM.Range("D1").Value shM.Cells(1, z + 6).Resize(, 5).Value = shM.Range("A1:E1").Value
For Each c In shM.Cells(1, z + 2).CurrentRegion If c.Row > 1 Then shM.Cells(2, z + 4).Value = c.Value shM.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=shM.Cells(1, z + 4).Resize(2), CopyToRange:=shM.Cells(1, z + 6).Resize(, 5), Unique:=False With shM.Cells(1, z + 6).CurrentRegion.Resize(, 3) shT.Range("A13").Resize(x, 3).ClearContents Intersect(.Cells, .Cells.Offset(1)).Copy shT.Range("A13") End With shT.Range("A1").Value = shM.Cells(2, z + 10).Value Sheets("テンプレート").Copy Set nBK = ActiveWorkbook With nBK.Sheets(1).Range("A12").CurrentRegion With .Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With With .Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .Weight = xlThin End With End With
With nBK.Sheets(1) On Error Resume Next Set r = .Range("C12:C43").SpecialCells(xlCellTypeBlanks) On Error GoTo 0 If Not r Is Nothing Then r.EntireRow.Delete End With
Application.DisplayAlerts = False nBK.SaveAs ThisWorkbook.Path & "\" & shM.Range("N2").Value & "_" & shM.Range("O2").Value & ".xlsx" Application.DisplayAlerts = False nBK.Close End If Next
shM.Cells(1, z + 2).CurrentRegion.Clear shM.Cells(1, z + 4).CurrentRegion.Clear shM.Cells(1, z + 6).CurrentRegion.Clear
End Sub
(β) 2015/04/16(木) 23:59
(未熟者) 2015/04/17(金) 02:39
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.